Android手势ImageView三部曲(二)

本文详细介绍了Android中的GestureDetector类,如何使用它来检测和处理手势。通过实例展示了GestureDetector的回调方法,如onDown、onSingleTapUp、onScroll等,以及如何处理事件传递机制。文章旨在为后续的MoveGestureDetector、RotateGestureDetector、ShoveGestureDetector和PhotoView等高级手势框架的学习打下基础。
摘要由CSDN通过智能技术生成

前言:比你牛逼的人比你还努力~~唉唉!我又有何理由堕落下去?于是放下了正在热播的电视剧,打开电脑就是干啊,这尼玛程序员伤不起啊~!!!

废话不多说了,还记得上一节 Android手势ImageView三部曲(一)最后我们提及的那个框架么?这一节我们重点了掌握一下GestureDetector这个类相关的属性方法。

一、那么GestureDetector是干嘛的呢?
顾名思义,字面意思就是“手势检测器“的意思,还记得我们上一节中实现的GestureImageView么?我们在onTouchEvent中检测到了各种个样的手势(手指按下、抬起、什么时候属于拖拽、什么时候属于缩放)都是通过我们的计算得到的,但是有了GestureDetector这个类后,我们不需要自己做判断现在是什么手势了,GestureDetector会帮我们做好判断,完了后通过回调函数告诉你,就像官网所说的(This class should only be used with MotionEvents reported via touch (don’t use for trackball events).)这个类仅仅是通过触碰检查事件的,而不是用于跟踪事件的,我检测到了事件,然后告诉你,至于你需要怎么处理这个事件,那就是你自己的事了。

GestureDetector的一些具体的api大家可以去查看谷歌官方文档或启舰大神的博客:

说了这么多估计你都有点累了,下面让我们看看具体怎么使用:

偷一下懒,我就直接用 Android手势ImageView三部曲(一)
中的MatrixImageView类改改代码了:

public class MatrixImageView extends ImageView {
   
    private static final int MODE_NONE = 190;
    private static final int MODE_DRAG = 468;
    private static final int MODE_ZOOM = 685;

    private int mode;
    private float startX, startY;
    private float midX, midY;
    private Matrix currMatrix, savedMatrix;
    private float preRotate, rotate;
    private float preSpacing;

    private GestureDetector detector;
    public MatrixImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView();
        detector=new GestureDetector(context,onGestureListener);
    }

    private void initView() {
        mode = MODE_NONE;
        currMatrix = new Matrix();
        savedMatrix = new Matrix();
        DisplayMetrics dm = getResources().getDisplayMetrics();
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.test);
        bitmap = Bitmap.createScaledBitmap(bitmap, dm.widthPixels, dm.heightPixels, true);
        setImageBitmap(bitmap);
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return detector.onTouchEvent(event);
    }
    private GestureDetector.SimpleOnGestureListener onGestureListener=new GestureDetector.SimpleOnGestureListener(){
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            Log.e("TAG", "====onSingleTapUp=====");
            return super.onSingleTapUp(e);
        }

        @Override
        public void onLongPress(MotionEvent e) {
            Log.e("TAG", "====onLongPress=====");
            super.onLongPress(e);
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            Log.e("TAG", "====onScroll=====");
            Log.e("TAG", "distanceX===>"+distanceX);
            Log.e("TAG", "distanceY===>"+distanceY);
            return super.onScroll(e1, e2, distanceX, distanceY);
        }

        @Override
        public void onShowPress(MotionEvent e) {
            Log.e("TAG", "====onShowPress=====");
            super.onShowPress(e);
        }

        @Override
        public boolean onDown(MotionEvent e) {
            Log.e("TAG", "====onDown=====");
            return true;
        }

        @Override
        public boolean onDoubleTap(MotionEvent e) {
            Log.e("TAG", "====onDoubleTap=====");
            return super.onDoubleTap(e);
        }

        @Override
        public boolean onDoubleTapEvent(MotionEvent e) {
            Log.e("TAG", "====onDoubleTapEvent=====");
            return super.onDoubleTapEvent(e);
        }

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            Log.e("TAG", "====onSingleTapConfirmed=====");
            return super.onSingleTapConfirmed(e);
        }

        @Override
        public boolean onContextClick(MotionEvent e) {
            Log.e("TAG", 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值