Android : GestureDetector手势检测
2015-09-24 17:35
531 查看
关于Android的手势检测方面,刚开始的时候感觉自己还有点误区,认为onTouchEvent方法中的ACTION_DOWN、ACTION_UP、ACTION_MOVE也算是手势,实际上Android中的手势检测还是有区别的,onTouchEvent方法中只是进行了手指落下、抬起、滑动过程的检测,不算是一个连续的动作,这样像我们平时的长按事件、快速滑动、拖动事件的检测,如果是我们自己写代码去实现会变得非常复杂,Android就为我们提供了其他的检测方式GestureDetector。
首先看下构造器,可以看到前两个构造器已经过时,使用的话至少从第三个构造器开始使用,并且里面包含了Listener监听器。
关于Listener监听器,前三个监听器都是接口类型的,如果使用它们,需要覆写内部所有的方法,如果我们不需要覆写所有方法,或者是只需要覆写个别的方法就可以直接使用第四个监听器(具体可以覆写哪些方法,可以点击查看)。
这里对可以覆写的比较重要的方法进行简单的介绍
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); } }); } }
效果图
相关文章推荐
- Android ant自动打包 crunch 报错
- android 事件总线 -- Otto(三) ThreadEnforcer
- Android release版关闭日志logcat
- android:layout_weight的真实含义
- Android学习笔记之AndroidManifest.xml文件解析
- Android strings.xml技巧
- Android自定义ListView,轻松实现上下拉刷新,一看就懂,一学就会,超简单。
- 【转】Android 向右滑动销毁(finish)Activity, 随着手势的滑动而滑动的效果
- Android学习笔记:通过Android之Service实现文件断点续传下载
- Android基础入门教程——2.4.11 AutoCompleteTextView(自动完成文本框)的基本使用
- Android软件开发之 自定义别样Toast
- Android 4.0日历(calendar)源码分析之月视图
- Android之webview与js交互
- Android 悬浮并可拖动的实现
- 最清晰的Android多屏幕适配方案
- Android版本支付宝集成获取私钥与公钥
- Android中如何自己定义Toast
- android应用程序如何调用支付宝接口
- android应用程序如何调用支付宝接口
- android开发之自定义AutoCompleteTextView