基于监听的事件处理
- 某些特定的事件
基于回调的事件处理
- 通用性的事件
重写
- 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
长按事件
具体监听操作:
@Override
public boolean onLongClick(View v) {
registerForContextMenu(v); //将长按事件注册菜单中
openContextMenu(v); //打开菜单
return false;
}
构造菜单:
@Override
public 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);
}
}
单击事件和触摸事件的区别
- 首先进行触摸事件检测
- 根据返回值来判断是否在进行单击事件