一、事件处理概述
1、基于监听的事件处理
之前介绍的单击事件监听器等。
2、基于回调的事件处理
有两种方式:
① 重写Android组件的回调方法。
② 重写Activity的回调方法。
经常重写的方法有三个:触摸方法:onTouchEvent()、按下方法:onKeyDown()、抬起方法:onkeyUp()。
package com.example.eventhandlingandgestures; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.KeyEvent; import android.view.MotionEvent; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onTouchEvent(MotionEvent event) { Toast.makeText(MainActivity.this,"触摸",Toast.LENGTH_SHORT).show(); return super.onTouchEvent(event); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { Toast.makeText(MainActivity.this,"按下",Toast.LENGTH_SHORT).show(); return super.onKeyDown(keyCode, event); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { Toast.makeText(MainActivity.this,"抬起",Toast.LENGTH_SHORT).show(); return super.onKeyUp(keyCode, event); } }
二者区别:
基于监听的事件处理适用于某些特定的事件,而基于回调的事件处理适用于通用性的事件。
二、物理按键事件处理
有三个状态,按下 onKeyDown(),抬起 onkeyUp(),长按onkeyLongPress()。
Android为每个物理按键都提供了这三个方法。
Android为区分每个按键,给每个按键都定义了常量。
实例:连续按下两次返回键退出到主屏幕。
package com.example.eventhandlingandgestures; import android.app.Activity; import android.os.Bundle; import android.view.KeyEvent; import android.widget.Toast; public class MainActivity extends Activity { private long exitTime = 0;//记录此刻按下按键的时间 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } //第一步:重写onKeyDown()方法来拦截用户单击后退按钮事件 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode==KeyEvent.KEYCODE_BACK){ exit();//自定义的退出方法 return true; } return super.onKeyDown(keyCode, event); } //第二步:创建退出方法exit() public void exit(){//判断按键时间差是否大于两秒 if((System.currentTimeMillis()-exitTime)>2000){//弹出提示框 Toast.makeText(MainActivity.this,"再按一次退出程序",Toast.LENGTH_SHORT).show(); exitTime = System.currentTimeMillis(); }else{//结束应用 finish(); System.exit(0); } } }
三、触摸屏事件处理
1、单击事件
方法:setOnClickListener(),需要参数View.onClickListener,重写方法onClick(View v)
2、长按事件
方法:setOnLongClickListener(),需要参数View.onLongClickListener,重写方法onLongClick(View v)
实例:长按触发菜单
package com.example.eventhandlingandgestures; import android.app.Activity; import android.os.Bundle; import android.view.ContextMenu; import android.view.View; import android.widget.ImageView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //--长按注册 ImageView imageView = findViewById(R.id.image); imageView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { //注册到菜单 registerForContextMenu(v); //打开 openContextMenu(v); return false; } }); } //长按显示 //第一步:在MainActivity中重写onCreateContextMenu菜单,为其添加选项值 @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); menu.add("收藏"); menu.add("举报"); //第二步:将长按事件注册到菜单中,并打开菜单,在onCrete方法中 } }
3、触摸事件
方法:setOnTouchListener(),需要参数View.onTouchListener,重写方法onTouchListener(View v,MotionEvent event);
MotionEvent: 保存发生触发的位置、时间等细节信息。
4、单击事件与触摸事件的区别
package com.example.eventhandlingandgestures; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.ContextMenu; import android.view.MotionEvent; import android.view.View; import android.widget.Button; import android.widget.ImageView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button button = findViewById(R.id.btn); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i("onClick","单击事件"); } }); button.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction()==MotionEvent.ACTION_DOWN){//如果是手指按下 Log.i("onTouch","按下"); }else if(event.getAction()==MotionEvent.ACTION_UP) Log.i("onTouch","抬起"); return false;//返回false,表示未消耗这个事件 } }); } }
通过最简单的鼠标做比喻,鼠标按下为触摸事件中的按下事件,鼠标抬起为触摸事件中的抬起事件,这整个动作为一次单击事件。
触摸事件中重写的onTouch()中若返回false,则未消耗此事件,可被单击事件捕获到;若返回true,则代表消耗了此事件,则不可被单击事件捕获到。
四、手势检测
Android为手势检测提供了GestureDetector类,代表一个手势检测器。创建这个类的对象时,需要传入一个GestureDetector.OnGestureListener接口的实例,此接口代表一个监听器,用来对用户的手势进行响应。实现时必须重写6个方法,分别是:
① onDown():触摸事件按下时触发
② onFling():手指拖过时触发
③ onLongPress():长按时触发
④ onScroll():
⑤ onShowPress():
⑥ onSingleTapUp():轻击时触发
还有自定义手势,添加手势等操作,需要继续慢慢学习掌握。