Android开发Android开发经验谈Android技术知识

Android开发艺术笔记 | View的事件体系

2020-03-22  本文已影响0人  凌川江雪

View的概述

View的位置参数

根据上图,
可以得出View的宽高坐标关系

    width = right - left
    height = bottom - top

关于如何得到View的这四个参数
View的源码中它们对应于mLeft、mRight、mTop和mBottom这四个成员变量,获取方式:

Left=getLeft();
Right=getRight();
Top=getTop;
Bottom=getBottom();
---
width=getWidth();
height=getHeight();
x=left+translationX
y=top+translationY

MotionEvent和TouchSlop

1. MotionEvent

2. TouchSlop

 <!--Base "touch slop" value used by ViewConfiguration as a movement 
threshold where scrolling should begin. -->
    <dimen name="config_viewConfigurationTouchSlop">8dp</dimen>

VelocityTracker、GestureDetector和Scroller

1. VelocityTracker

概念:
速度追踪,用于追踪手指滑动过程中速度
包括水平和竖直方向的速度。

使用过程:
首先,在View的onTouchEvent方法中追踪当前单击事件速度

VelocityTracker velocityTracker = VelocityTracker.obtain();//实例化一个VelocityTracker 对象
velocityTracker.addMovement(event);//添加追踪事件
velocityTracker .computeCurrentVelocity(1000);//获取速度前先计算速度,这里计算的是在1000ms内
float xVelocity = velocityTracker .getXVelocity();//得到的是1000ms内手指在水平方向从左向右滑过的像素数,即水平速度
float yVelocity = velocityTracker .getYVelocity();//得到的是1000ms内手指在垂直方向从上向下滑过的像素数,即垂直速度

针对上面的例子,
如果我们通过velocityTracker.computeCurrentVelocity(100)来获取速度,
那么得到的速度就是手指在100ms内所滑过的像素数,
假设返回的是10,
则水平速度就成了10像素/每100ms(这里假设滑动过程是匀速的),
即水平速度为10。

    velocityTracker.clear();
    velocityTracker.recycle();

GestureDetector

概念:手势检测,用于辅助检测用户的单击、滑动、长按、双击等行为。

使用过程:
首先,
需要创建一个GestureDetector对象
并实现OnGestureListener接口
根据需要还可以实现OnDoubleTapListener从而能够监听双击行为:!!!

    GestureDetector  mGestureDetector = new GestureDetector(this);
    //解决长按屏幕后无法拖动的现象
    mGestureDetector.setIsLongpressEnabled(false);

接着,
接管目标View的onTouchEvent方法,
在待监听View的onTouchEvent方法中添加如下实现:

    boolean consume = mGestureDetector.onTouchEvent(event);
    return consume;

做完以上两步后,
即可有选择地实现OnGestureListenerOnDoubleTapListener中的方法了,
这两个接口中的方法介绍如下表:

Scroller

概念:弹性滑动对象,用于实现View的弹性滑动。

使用Scroller,其典型代码是固定的:

    Scroller scroller = new Scroller(mContext);
    // 缓慢滚动到指定位置
    private void smoothScrollTo(int destX,int destY) {
        int scrollX = getScrollX();
        int delta = destX -scrollX;
        // 1000ms内滑向destX,效果就是慢慢滑动
        mScroller.startScroll(scrollX,0,delta,0,1000);
        invalidate();
    }
    @Override
    public void computeScroll() {
        if (mScroller.computeScrollOffset()) {
                scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
                postInvalidate();
        }
    }








参考:

上一篇 下一篇

猜你喜欢

热点阅读