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布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
    <ImageView
    android:layout_gravity="center"
     android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/imageView"
    
    >
    
    </ImageView>
</LinearLayout>
View Code

2.重写OnGestureListener的onFling方法

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

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

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

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

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

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

onLongPress--长按事件

//按下的时候触发
    @Override
    public boolean onDown(MotionEvent e) {
        Log.e("GestureActivity", "onDown--"+e.getAction());
        return false;
    }

    //按住 且为达到onLongPress之前 调用 一旦调用就不会有onSingleTapUp
    @Override
    public void onShowPress(MotionEvent e) {
        Log.e("GestureActivity", "onShowPress");

    }

    // 离开屏幕的一刹那
    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        Log.e("GestureActivity", "onSingleTapUp");
        return false;
    }

    // 滚动 
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
            float distanceY) {
        Log.e("GestureActivity", "onScroll");
        return false;
    }

    // 长按 不松开
    @Override
    public void onLongPress(MotionEvent e) {
        Log.e("GestureActivity", "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 }
View Code



原文地址:https://www.cnblogs.com/draem0507/p/3082471.html