Android手势

android 手势

前言:android的手势可以通过gestureDetector类完成。

实现手势方式

1)通过重写onTouchEvent方法

2)实现OnTouchListener类,重写onTouch方法。

不管哪一种,都需要将touch事件交给gestureDetector来管理。

复制代码
private GestureDetector gestureDetector;
@Override
    public void onCreate(Bundle savedInstanceState) {
gestureDetector = new GestureDetector(this);

}
@Override
    public boolean onTouchEvent(MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
    }
复制代码

现在我们就简单的实现一个图片翻页的效果。

1.xml布局

  View Code

2.重写OnGestureListener的onFling方法

onFling--快速的在屏幕上滑动,如果不够快,只有onScroll事件了。

除了onFling方法外,还需要从写以下方法

onDown --放第一时间手指接触到屏幕的时候

onShowPress--按住屏幕,但是未达到onLongPress时间前

onSingleTapUp--onDown之后,离开屏幕。如果有onShowPress、onLongPress事件,则不在响应

onScroll--滑动事件,不管快慢,都会响应

onLongPress--长按事件

  View Code

关于onFling实现图片翻页的逻辑

复制代码
private int images[] = new int[] { R.drawable.facebook, R.drawable.google,
            R.drawable.gtalk };//定义了展示的图片
    private final int X_MOVE_INSTANCE=100;//X轴位移距离
    private final int X_MOVE_SPEED=200;//X轴移动速度 随便大点都几千
    private int position=0;//图片初始值

@Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        Log.e("GestureActivity", "onFling" );
        //右翻
        if((e2.getX()-e1.getX()>X_MOVE_INSTANCE)&&velocityX>X_MOVE_SPEED){
            
            imageView.setImageResource(images[++position%images.length]);
        }else //左翻
            if((e1.getX()-e2.getX()>X_MOVE_INSTANCE)&&Math.abs(velocityX)>X_MOVE_SPEED){
                
                imageView.setImageResource(images[++position%images.length]);
            }
        
        
        return false;
    }
复制代码

需要稍微注意下

++position%images.length的写法。
完整代码如下
复制代码
 1 public class GestureActivity extends Activity implements OnGestureListener {
 2     private ImageView imageView;
 3     private GestureDetector gestureDetector;
 4     private int images[] = new int[] { R.drawable.facebook, R.drawable.google,
 5             R.drawable.gtalk };
 6     private final int X_MOVE_INSTANCE=100;//X轴位移距离
 7     private final int X_MOVE_SPEED=200;//X轴移动速度 随便大点都几千
 8     private int position=0;//图片初始值
 9 
10     @Override
11     public void onCreate(Bundle savedInstanceState) {
12         super.onCreate(savedInstanceState);
13         setContentView(R.layout.main);
14 
15         imageView = (ImageView) findViewById(R.id.imageView);
16         imageView.setImageResource(images[position]);
17         gestureDetector = new GestureDetector(this);
18 
19     }
20 
21     @Override
22     public boolean onTouchEvent(MotionEvent event) {
23         return gestureDetector.onTouchEvent(event);
24     }
25     
26     //按下的时候触发
27     @Override
28     public boolean onDown(MotionEvent e) {
29         Log.e("GestureActivity", "onDown--"+e.getAction());
30         return false;
31     }
32 
33     //按住 且为达到onLongPress之前 调用 一旦调用就不会有onSingleTapUp
34     @Override
35     public void onShowPress(MotionEvent e) {
36         Log.e("GestureActivity", "onShowPress");
37 
38     }
39 
40     // 离开屏幕的一刹那
41     @Override
42     public boolean onSingleTapUp(MotionEvent e) {
43         Log.e("GestureActivity", "onSingleTapUp");
44         return false;
45     }
46 
47     // 滚动 
48     @Override
49     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
50             float distanceY) {
51         Log.e("GestureActivity", "onScroll");
52         return false;
53     }
54 
55     // 长按 不松开
56     @Override
57     public void onLongPress(MotionEvent e) {
58         Log.e("GestureActivity", "onLongPress");
59 
60     }
61 
62     // 快速滑动 并且松开 慢的话只有onScroll
63     @Override
64     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
65             float velocityY) {
66         Log.e("GestureActivity", "onFling" );
67         //右翻
68         if((e2.getX()-e1.getX()>X_MOVE_INSTANCE)&&velocityX>X_MOVE_SPEED){
69             
70             imageView.setImageResource(images[++position%images.length]);
71         }else //左翻
72             if((e1.getX()-e2.getX()>X_MOVE_INSTANCE)&&Math.abs(velocityX)>X_MOVE_SPEED){
73                 
74                 imageView.setImageResource(images[++position%images.length]);
75             }
76         
77         
78         return false;
79     }
80 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值