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



  • 相关阅读:
    java.lang.NoSuchMethodError
    asm相关内容想下载(包括 jar 包)
    Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/objectweb/asm/Type
    用Navicat连接mysql报错:2003-Can't connect to MySql server on '10.100.0.109'(10039)
    The type java.lang.reflect.AnnotatedElement cannot be resolved. It is indirectly referenced from required .class files
    The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files
    交通测速方式
    卡口和电子警察的区别
    Myeclipse连接Mysql数据库时报错:Error while performing database login with the pro driver:unable
    在window上安装mysql
  • 原文地址:https://www.cnblogs.com/draem0507/p/3082471.html
Copyright © 2011-2022 走看看