基於監聽的事件處理
- 某些特定的事件
基於回調的事件處理
- 通用性的事件
重寫
- 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);
}
}
單擊事件和觸摸事件的區別
- 首先進行觸摸事件檢測
- 根據返回值來判斷是否在進行單擊事件