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. 根据返回值来判断是否在进行单击事件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章