您的位置:首页 > 移动开发 > Android开发

Android : GestureDetector手势检测

2015-09-24 17:35 531 查看
  关于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实例

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


关联

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


GestureDetector使用范例

思路

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

自定义Button

[code]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;
    }

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


布局

[code]<?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

[code]public class MainActivity_Gesture extends Activity{
    private MyButton mbtn;
    private boolean IsScale;
    private Bitmap mnitmap;
    private ImageView mimageview;
@Override
protected 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);

        }
    });
}
}


效果图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: