本文参考文献:《疯狂Android讲义 : 第2版 》

使用 Android 手势监测需要两个步骤:

  1. 实现 GestureDetector.OnGestureListener 监听器实例以创建 GestureDetector 对象;
  2. 为组件的 TouchEvent 事件绑定监听器,在事件处理中把组件上的 TouchEvent 事件交给 GestureDetector 处理,而 GestureDetector 就会检测是否触发了特定的手势动作。

下面是测试不同动作触发哪种手势的实例:

package com.toby.personal.testlistview;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.GestureDetector;import android.view.MotionEvent;import android.widget.Toast;public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener {    final private static String TAG = "Toby_Test";    private GestureDetector detector;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 必须创建手势检测器        detector = new GestureDetector(this, this);    }    @Override    public boolean onTouchEvent(MotionEvent event) {        // 注意此处的处理        return detector.onTouchEvent(event);    }    @Override    public boolean onDown(MotionEvent e) {        Toast.makeText(this, "onDown", Toast.LENGTH_SHORT).show();        return false;    }    @Override    public void onShowPress(MotionEvent e) {        Toast.makeText(this, "onShowPress", Toast.LENGTH_SHORT).show();    }    @Override    public boolean onSingleTapUp(MotionEvent e) {        Toast.makeText(this, "onSingleTapUp", Toast.LENGTH_SHORT).show();        return false;    }    @Override    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {        Toast.makeText(this, "onScroll", Toast.LENGTH_SHORT).show();        return false;    }    @Override    public void onLongPress(MotionEvent e) {        Toast.makeText(this, "onLongPress", Toast.LENGTH_SHORT).show();    }    @Override    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {        Toast.makeText(this, "onFling", Toast.LENGTH_SHORT).show();        return false;    }}

通过 Fling 手势缩放图片

主布局文件的内容:

<?xml version="1.0" encoding="utf-8"?>    

主程序的内容如下:

package com.toby.personal.testlistview;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Matrix;import android.graphics.drawable.BitmapDrawable;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.GestureDetector;import android.view.MotionEvent;import android.widget.ImageView;import android.widget.Toast;public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener {    final private static String TAG = "Toby_Test";    private GestureDetector detector;    private ImageView imageView;    private Bitmap bitmap;    private int width;    private int height;    private float currentScale = 1;    private Matrix matrix;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 必须创建手势检测器        detector = new GestureDetector(this, this);        imageView = (ImageView) findViewById(R.id.image);        matrix = new Matrix();        bitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.girl04);        width = bitmap.getWidth();        height = bitmap.getHeight();        imageView.setImageBitmap(                BitmapFactory.decodeResource(this.getResources(), R.drawable.girl04));    }    @Override    public boolean onTouchEvent(MotionEvent event) {        // 注意此处的处理        return detector.onTouchEvent(event);    }    @Override    public boolean onDown(MotionEvent e) {//        Toast.makeText(this, "onDown", Toast.LENGTH_SHORT).show();        return false;    }    @Override    public void onShowPress(MotionEvent e) {//        Toast.makeText(this, "onShowPress", Toast.LENGTH_SHORT).show();    }    @Override    public boolean onSingleTapUp(MotionEvent e) {//        Toast.makeText(this, "onSingleTapUp", Toast.LENGTH_SHORT).show();        return false;    }    @Override    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {//        Toast.makeText(this, "onScroll", Toast.LENGTH_SHORT).show();        return false;    }    @Override    public void onLongPress(MotionEvent e) {//        Toast.makeText(this, "onLongPress", Toast.LENGTH_SHORT).show();    }    @Override    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {        Toast.makeText(this, "onFling", Toast.LENGTH_SHORT).show();        velocityX = Math.max(Math.min(velocityX, 4000), -4000);        currentScale += currentScale * velocityX / 4000.0f;        currentScale = Math.max(currentScale, 0.01f);        matrix.reset();        matrix.setScale(currentScale, currentScale, 160, 200);        BitmapDrawable tmp = (BitmapDrawable) imageView.getDrawable();        if (!tmp.getBitmap().isRecycled()) { // 如果图片还未回收,先强制回收该图片            tmp.getBitmap().recycle();        }        Bitmap bitmap2 = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);        imageView.setImageBitmap(bitmap2);        return true;    }}

通过手势实现翻页效果

主布局文件的代码如下:

<?xml version="1.0" encoding="utf-8"?>    

主程序文件的内容如下:

package com.toby.personal.testlistview;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.GestureDetector;import android.view.MotionEvent;import android.view.View;import android.view.animation.Animation;import android.view.animation.AnimationUtils;import android.widget.ImageView;import android.widget.Toast;import android.widget.ViewFlipper;public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener {    final private static String TAG = "Toby_Test";    private ViewFlipper flipper;    private GestureDetector detector;    Animation[] animations = new Animation[4];    final int FLIP_DISTANCE = 50;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 必须创建手势检测器        detector = new GestureDetector(this, this);        flipper = (ViewFlipper) findViewById(R.id.flipper);        flipper.addView(addImageView(R.drawable.girl01));        flipper.addView(addImageView(R.drawable.girl02));        flipper.addView(addImageView(R.drawable.girl03));        flipper.addView(addImageView(R.drawable.girl04));        flipper.addView(addImageView(R.drawable.girl05));        animations[0] = AnimationUtils.loadAnimation(this, R.anim.slide_in_right);        animations[1] = AnimationUtils.loadAnimation(this, R.anim.slide_out_left);    }    private View addImageView(int resId) {        ImageView imageView = new ImageView(this);        imageView.setImageResource(resId);        imageView.setScaleType(ImageView.ScaleType.CENTER);        return imageView;    }    @Override    public boolean onTouchEvent(MotionEvent event) {        // 注意此处的处理        return detector.onTouchEvent(event);    }    @Override    public boolean onDown(MotionEvent e) {//        Toast.makeText(this, "onDown", Toast.LENGTH_SHORT).show();        return false;    }    @Override    public void onShowPress(MotionEvent e) {//        Toast.makeText(this, "onShowPress", Toast.LENGTH_SHORT).show();    }    @Override    public boolean onSingleTapUp(MotionEvent e) {//        Toast.makeText(this, "onSingleTapUp", Toast.LENGTH_SHORT).show();        return false;    }    @Override    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {//        Toast.makeText(this, "onScroll", Toast.LENGTH_SHORT).show();        return false;    }    @Override    public void onLongPress(MotionEvent e) {//        Toast.makeText(this, "onLongPress", Toast.LENGTH_SHORT).show();    }    @Override    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {        Toast.makeText(this, "onFling", Toast.LENGTH_SHORT).show();        if (e1.getX() - e2.getX() > FLIP_DISTANCE) {            flipper.setInAnimation(animations[0]);            flipper.setOutAnimation(animations[1]);            flipper.showPrevious();            return true;        }        if (e2.getX() - e1.getX() > FLIP_DISTANCE){            flipper.setInAnimation(this, android.R.anim.slide_in_left);            flipper.setOutAnimation(this, android.R.anim.slide_out_right);            flipper.showNext();            return true;        }        return false;    }}

更多相关文章

  1. Android对返回键进行处理的方式
  2. Android(安卓)Service
  3. Android(安卓)TextUtils类介绍
  4. Android(安卓)下的usb框架及功能点
  5. Android(安卓)DeepLink原理与应用(2)
  6. android webview 使用以及一些异常处理及上传文件问题
  7. android事件分发机制的实现原理
  8. Android的消息处理机制
  9. android触屏事件处理onInterceptTouchEvent的问题

随机推荐

  1. 个人项目整理——UI设计(Android)
  2. Android 数据存取
  3. Android问题集锦之三十一:Android Studio:
  4. Android API 中文 (54) ―― Filterable
  5. 实现 Android 通知提示功能
  6. android 中的activity管理
  7. Android的组成,AS连接mumu模拟器
  8. androidUI布局仿猫扑界面
  9. Android API 中文 (50) ―― SpinnerAdapte
  10. android体系笔记