事件处理概述
1.基于监听的事件处理
2.基于回调的事件处理
重写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);
}
//第一步重写onKeyDown()方法来拦截用户单击后退按钮事件
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK){
exit();
return true;
}
return super.onKeyDown(keyCode, event);
}
//第二步:创建退出方法exit()
private void exit() {
if ((System.currentTimeMillis()-exitTime)>2000){
Toast.makeText(MainActivity.this,"再按一次退出程序",Toast.LENGTH_LONG).show();
exitTime = System.currentTimeMillis();
}else {
finish();
System.exit(0);
}
}
}
触摸屏事件处理
单击事件
setOnClickListener(View.OnclickListener{
public void onClick(View v)
})
长按事件
长按两秒以上出发
setOnLongClickListener(View.OnLongClickListener{
public boolean onLongClick(View v);
})
模拟微信实现长按朋友圈图片功能
<ImageView
android:id="@+id/imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon1"></ImageView>
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//第二步,将长按事件注册到菜单中,并打开菜单
ImageView imageView = this.findViewById(R.id.imageview);
imageView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
registerForContextMenu(v);
openContextMenu(v);
return true;
}
});
}
//第一步,在MainActivity中重写onCreateContextMenu菜单,为菜单添加选项值
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add("收藏");
menu.add("举报");
}
}
手势
实现该接口GestureDetector.OnGestureListener
并重写方法
onDown:按下触发
onFling:拖动触发
onLongPress:长按触发
onScroll
onShowPress
onSingleTapUp:轻击触发
、
实现滑动切换图片
<ViewFlipper
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/flipper"/>
//第一步:让MainActivity事先GestureDetectot.OnGestureListener接口,并实现其所有方法
public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener{
Animation[] animations = new Animation[4];
final int distance = 50;
private int[] images = new int[]{};
ViewFlipper flipper;
//第二步:定义一个全局的手势检测器
GestureDetector detector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
detector = new GestureDetector(MainActivity.this,this);
//第三步:将要显示的图片加载到ViewFlipper中,并且初始化动画数组
flipper = findViewById(R.id.flipper);
for (int i = 0; i < images.length; i++) {
ImageView imageView = new ImageView(this);
imageView.setImageResource(images[i]);
flipper.addView(imageView);
}
/*animations[0] = AnimationUtils.loadAnimation(this,R.anim.slide_in_left);
animations[1] = AnimationUtils.loadAnimation(this,R.anim.slide_in_out_left);
animations[2] = AnimationUtils.loadAnimation(this,R.anim.slide_in_right);
animations[3] = AnimationUtils.loadAnimation(this,R.anim.slide_in_out_right);*/
}
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
//第4步:在onFling()方法中通过触摸事件的X坐标判断是向左滑动还是向右滑动,并且为其设置动画
//从右向左滑
if (e1.getX()-e2.getX()>distance){
flipper.setInAnimation(animations[2]);
flipper.setOutAnimation(animations[1]);
flipper.showPrevious();
return true;
}else if (e2.getX()-e1.getX()>distance){
flipper.setInAnimation(animations[0]);
flipper.setOutAnimation(animations[4]);
flipper.showNext();
return true;
}
return false;
}
//第5步:将Activity上的触摸事件交给GestureDetector处理
@Override
public boolean onTouchEvent(MotionEvent event) {
return detector.onTouchEvent(event);
}
}
手势添加