Android各種事件處理一覽(單擊事件、觸摸事件、物理按鍵事件、長按事件,另附源碼)

基於監聽的事件處理

  • 某些特定的事件

基於回調的事件處理

  • 通用性的事件
重寫
  • 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);
    }
}

單擊事件和觸摸事件的區別

  1. 首先進行觸摸事件檢測
  2. 根據返回值來判斷是否在進行單擊事件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章