zoukankan      html  css  js  c++  java
  • 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



  • 相关阅读:
    ASP.NET Web API 2 之文件下载
    Windows 查看某个端口号是否被占用
    C# 数据类型之 String(字符串)
    数据表对应关系(一对一、一对多、多对多)
    嫁给程序员的好处,你get到了吗?
    ASP.NET Web API 2 之 HttpRequestMessage 对象
    C# 使用 log4net 记录日志
    Chrome 浏览器快捷键
    C# 获取程序运行时路径
    SpringBoot整合Pagehelper分页插件
  • 原文地址:https://www.cnblogs.com/draem0507/p/3082471.html
Copyright © 2011-2022 走看看