Android各种事件处理一览(单击事件、触摸事件、物理按键事件、长按事件,另附源码)
16lz
2021-01-26
基于监听的事件处理
- 某些特定的事件
基于回调的事件处理
- 通用性的事件
重写
- Android组件的回调方法
- Activity的回调方法
onTouchEvent()
onKeyDown()
onKeyUp()
物理按键事件处理
onKeyDown()
onKeyUp()
onKeyLongPress()
音量键
- KEYCODE_VOLUME_UP
- KEYCODE_VOLUME_DOWN
电源键
- KEYCODE_POWER
返回键
- KEYCODE_BACK
主屏键
- KEYCODE_HOME
菜单键
- KEYCODE_MENU
实现“再按一次”返回主页
public class MainActivity extends Activity { private long exitTime = 0; //退出时间变量值 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { exit(); return true; //拦截返回键 } return super.onKeyDown(keyCode, event); } public void exit() { if ((System.currentTimeMillis() - exitTime) > 2000) { //计算按键时间差是否大于两秒 Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show(); exitTime = System.currentTimeMillis(); } else { finish(); System.exit(0); //销毁强制退出 } }}
单击事件
- OnClickListener
长按事件
具体监听操作:
@Overridepublic boolean onLongClick(View v) {registerForContextMenu(v); //将长按事件注册菜单中openContextMenu(v); //打开菜单return false;}
构造菜单:
@Overridepublic void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { //创建菜单super.onCreateContextMenu(menu, v, menuInfo);menu.add("收藏"); //为菜单添加参数menu.add("举报");}
触摸事件
绘制帽子
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint(); //创建Paint对象 //根据图片生成位图对象 Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.hat); canvas.drawBitmap(bitmap, bitmapX, bitmapY, paint); // 绘制帽子 if (bitmap.isRecycled()) { // 判断图片是否回收 bitmap.recycle(); // 强制回收图片 } }
将帽子添加到布局管理器
RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.relativeLayout); // 获取相对局管理器relativeLayout.addView(hat); //将hat添加到布局管理器中
戴帽子小游戏
public class HatView extends View { public float bitmapX; public float bitmapY; public HatView(Context context){ super(context); bitmapX = 65; // 设置帽子的默认显示位置的X坐标 bitmapY = 0; // 设置帽子的默认显示位置的Y坐标 } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint(); //创建Paint对象 //根据图片生成位图对象 Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.hat); canvas.drawBitmap(bitmap, bitmapX, bitmapY, paint); // 绘制帽子 if (bitmap.isRecycled()) { // 判断图片是否回收 bitmap.recycle(); // 强制回收图片 } }}
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final HatView hatView=new HatView(MainActivity.this); hatView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { hatView.bitmapX = motionEvent.getX()-80; // 设置帽子显示位置的X坐标 hatView.bitmapY = motionEvent.getY()-50; // 设置帽子显示位置的Y坐标 hatView.invalidate(); // 重绘hat组件 return false; } }); RelativeLayout r1=(RelativeLayout)findViewById(R.id.relativeLayout); r1.addView(hatView); }}
单击事件和触摸事件的区别
- 首先进行触摸事件检测
- 根据返回值来判断是否在进行单击事件
更多相关文章
- Android点击事件分发机制源码分析1——Activity
- android 桌面小组件小记
- Android(安卓)UI 之 获取组件或者元素的坐标
- Android(安卓)事件分发机制总结篇
- Android(安卓)- 事件模型
- 百度地图长按事件
- SimpleAdapter响应item点击事件
- android的事件分发
- java.lang.IllegalStateException: No host