关于Android的手势检测方面,刚开始的时候感觉自己还有点误区,认为onTouchEvent方法中的ACTION_DOWN、ACTION_UP、ACTION_MOVE也算是手势,实际上Android中的手势检测还是有区别的,onTouchEvent方法中只是进行了手指落下、抬起、滑动过程的检测,不算是一个连续的动作,这样像我们平时的长按事件、快速滑动、拖动事件的检测,如果是我们自己写代码去实现会变得非常复杂,Android就为我们提供了其他的检测方式GestureDetector。

GestureDetector

GestureDetector使用

  Android提供了手势检测,同时也提供了相应的监听器,也就是API中说的GestureDetector.OnGestureListener,因此要想使用手势检测的功能,我们需要API中说的GestureDetector的实例、Listener、还有就是与OnTouchEvent事件的绑定与关联。
  首先看下构造器,可以看到前两个构造器已经过时,使用的话至少从第三个构造器开始使用,并且里面包含了Listener监听器。
   
 关于Listener监听器,前三个监听器都是接口类型的,如果使用它们,需要覆写内部所有的方法,如果我们不需要覆写所有方法,或者是只需要覆写个别的方法就可以直接使用第四个监听器(具体可以覆写哪些方法,可以点击查看)。

这里对可以覆写的比较重要的方法进行简单的介绍

GestureDetector实例

//在listener中可以写一个匿名内部类,实现某种手势的监听    mGesture=new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener());

关联

    @Overridepublic boolean onTouchEvent(MotionEvent event) {      //gesture与Touch事件进行关联      mGesture.onTouchEvent(event);    return super.onTouchEvent(event);}

GestureDetector使用范例

思路

  自定义Button,在该Button中创建GestureDetector实例,在Listener中覆写相关方法,通过接口回调机制(监听者模式)监听覆写的方法,进行相关操作,最后别忘记与onTouchEvent事件进行关联。

自定义Button

package com.example.mytouchevent;import android.animation.ObjectAnimator;import android.content.Context;import android.util.AttributeSet;import android.view.GestureDetector;import android.view.MotionEvent;import android.view.View;import android.widget.Button;import android.widget.Toast;public class MyButton extends Button{    //编写接口用于对双击事件进行监听(监听者模式)    public interface onDoubleClick{        public void onDoubleClickListener(View v);    }    private onDoubleClick DoubleClickListener;    //set方法,用于回调(监听者模式)    public void setDoubleClickListener(onDoubleClick doubleClickListener) {        DoubleClickListener = doubleClickListener;    }    //定义一个手势检测实例    private GestureDetector mGesture;    public MyButton(Context context) {        super(context);    }    public MyButton(Context context, AttributeSet attrs) {        super(context, attrs);        //创建手势检测实例,设置监听事件        mGesture=new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener(){            //检测双击事件            @Override            public boolean onDoubleTap(MotionEvent e) {                if(DoubleClickListener!=null){                    //注意回调监听方法(监听者模式)                    DoubleClickListener.onDoubleClickListener(MyButton.this);                    Toast.makeText(getContext(), "双击了", Toast.LENGTH_SHORT).show();                    //一般需要在此处返回true,使得监听事件的操作的到响应,但是由于Button属于View,默认的回调机制是处理该事件                    //如果是ViewGroup则必须进行设置return true;因为ViewGroup中默认不响应                }                return super.onDoubleTap(e);            }            //检测快速滑动事件            @Override            public boolean onFling(MotionEvent e1, MotionEvent e2,                    float velocityX, float velocityY) {                if(Math.abs(e1.getX()-e2.getY())>50){                    ObjectAnimator.ofFloat(MyButton.this, "translationX",getTranslationX(),getTranslationX()+e2.getX()-e1.getY()).setDuration(500).start();                return true;                }                return super.onFling(e1, e2, velocityX, velocityY);            }        //检测滚动事件            @Override            public boolean onScroll(MotionEvent e1, MotionEvent e2,                    float distanceX, float distanceY) {                float x=getTranslationX()+e2.getX()-e1.getX();                float y=getTranslationY()+e2.getY()-e1.getY();                if(scrollListener!=null){                    scrollListener.onScrollListener(MyButton.this, x, y);                }                return true;            }        });    }    //编写接口,用于对onScoll方法的监听    public interface Onscoll{        public void onScrollListener(View v,float x,float y);    }    private Onscoll scrollListener;    public void setScrollListener(Onscoll scrollListener) {        this.scrollListener = scrollListener;    }    @Overridepublic boolean onTouchEvent(MotionEvent event) {      //gesture与Touch事件进行关联      mGesture.onTouchEvent(event);    return super.onTouchEvent(event);}}

布局

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <com.example.mytouchevent.MyButton        android:id="@+id/doubletap"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="放缩" >    com.example.mytouchevent.MyButton>    <ImageView        android:id="@+id/imageview"        android:layout_width="wrap_content"        android:layout_height="wrap_content"         android:src="@drawable/time"/>LinearLayout>

MainActivity

public class MainActivity_Gesture extends Activity{    private MyButton mbtn;    private boolean IsScale;    private Bitmap mnitmap;    private ImageView mimageview;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main3);    mbtn=(MyButton) findViewById(R.id.doubletap);    mimageview=(ImageView) findViewById(R.id.imageview);    mnitmap=BitmapFactory.decodeResource(getResources(), R.drawable.time);    mbtn.setDoubleClickListener(new onDoubleClick() {        @Override        public void onDoubleClickListener(View v) {            if(IsScale){                mimageview.setScaleX(1.0f);                IsScale=false;            }else{                mimageview.setScaleX(0.5f);                IsScale=true;            }        }    });    mbtn.setScrollListener(new Onscoll() {        @Override        public void onScrollListener(View v, float x, float y) {    //通过这种方式能够实现一种拖动这走的效果            mimageview.setTranslationX(x);            mimageview.setTranslationY(y);        }    });}}

效果图

更多相关文章

  1. Android官方刷新组件 SwipeRefreshLayout 的使用
  2. Android中解析XML
  3. Android(安卓)UI 控件 和 对应监听器详细总结
  4. Android简明开发教程十九:线程 Bezier曲线
  5. Android-使用Pull对XML进行增删改查
  6. Android中解析XML
  7. 如何在Android真机上检测是否有Google Map add-on
  8. Android简明开发教程十九:线程 Bezier曲线
  9. Android(安卓)实现答题器功能(通过手势实现翻页效果)

随机推荐

  1. BRCM5.02编译一 : 缺少工具链路
  2. Flask 入门一( flask 框架和 flask-script
  3. BRCM5.02编译七:No package 'uuid' found
  4. BRCM5.02编译八: ERROR: you are missing
  5. BRCM5.02编译九:cannot find -lncurses
  6. BRCM5.02编译十:cmake: command not found
  7. 安装Sublime Text 支持Go插件
  8. slf4j 整合log4j 报错 WARN Please in
  9. 关于修改密码带特殊符号以及数据泵参数设
  10. 【等待事件】User I/O类 等待事件(2.8)--re