Android事件处理和手势
[1] 事件处理概述
- 基于监听的事件处理
- 基于回调的事件处理
重写相应方法实现
[2] 物理按键事件
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_BACK){
exit();
return true;
}
return super.onKeyDown(keyCode, event);
}
private void exit() {
if(System.currentTimeMillis()-exitTime>2000){
Toast.makeText(MainActivity.this,"再按一次退出应用程序",Toast.LENGTH_SHORT).show();
exitTime=System.currentTimeMillis();
}else{
finish();
System.exit(0);
}
}
[3]单击事件
setOnClickListener()
[4]长按事件
2秒以上
setOnLongClickListener()
//示例代码
add.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
//1.注册菜单
registerForContextMenu(v);
//2.打开菜单
openContextMenu(v);
return true;
}
});
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.add("收藏");
menu.add("举报");
}
}
[4]触摸事件
单击事件触发一个动作
触摸事件触发两个动作,按下和抬起
//图像重绘对象
public class RabbitView extends View {
public float bitmapX;
public float bitmapY;
public RabbitView(Context context) {
super(context);
//构造方法中赋初值
bitmapX=290;
bitmapY=130;
}
//重写ondraw方法
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//1建立画笔
Paint paint = new Paint();
//2.解析资源
Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(),R.mipmap.touzi);
//3.绘制
canvas.drawBitmap(bitmap,bitmapX,bitmapY,paint);
//4.回收图片
if(bitmap.isRecycled()){
bitmap.recycle();
}
}
}
[5]手势检测
GestureDetector
GestureDetector.OnGestureListener 重写所有方法
//示例代码
//第一步:让类实现GestureDetector.onGestureListener并重写所有方法
public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener {
private int [] images={
R.mipmap.b1,R.mipmap.b2,R.mipmap.b3,
R.mipmap.b4,R.mipmap.b5,R.mipmap.b6,
R.mipmap.b7,R.mipmap.b8,R.mipmap.b9
};
final int distance=50;
//第二步:定义一个全局的手势检测器
GestureDetector detector ;
private ViewFlipper flipper;
Animation [] animation=new Animation[4];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
detector = new GestureDetector(MainActivity.this,this); //实例化GestureDetector
//第三步:将要显示的图片加载到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);
}
animation[0]=AnimationUtils.loadAnimation(this,R.anim.slide_in_left);
animation[1]=AnimationUtils.loadAnimation(this,R.anim.slide_out_left);
animation[2]=AnimationUtils.loadAnimation(this,R.anim.slide_in_right);
animation[3]=AnimationUtils.loadAnimation(this,R.anim.slide_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) {
}
//第四步:在onFling中通过触摸事件的X坐标判断是向左滑动还是向右滑动,并为其设置动画
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
//从右向左滑
if(e1.getX()-e2.getX()>distance){
flipper.setInAnimation(animation[2]);
flipper.setOutAnimation(animation[1]);
flipper.showPrevious();
return true;
//从左向右滑
}else if(e2.getX()-e1.getX()>distance){
flipper.setInAnimation(animation[0]);
flipper.setOutAnimation(animation[3]);
flipper.showNext();
return true;
}
return false;
}
//第五步:把Activity上的触摸事件交给GestureDetector处理
@Override
public boolean onTouchEvent(MotionEvent event) {
return detector.onTouchEvent(event);
}
}