View的事件体系基础知识

来源:互联网 发布:sql中update set用法 编辑:程序博客网 时间:2024/06/05 04:28

1.View的位置参数
这里写图片描述
View的四个位置主要有思安个顶点决定,分别对应四个属性,top、left、right、bottom.
top:表示View的原始左上角的纵坐标,
left:表示View的原始左上角的横坐标,
bottom:表示View的原始右下角的纵坐标,
right:表示View的原始右下角的横坐标,
这些坐标都是相对于View的父容器来说的,都是相对坐标
从Android3.0开始增加了几个参数:
x:表示View左上角的横坐标
y:表示View左上角的纵坐标
translationX:表示View左上角相对于父容器的横坐标的偏移量,默认值是0
translationY:表示View左上角相对于父容器的纵坐标的偏移量,默认值是0
换算关系是:
x=left+translationX;
y=top+translationY;
View平移过程中(比如属性动画的时候,会有效果,其他情况不是平移,translationX,translationY会一直为0),left和top不会变化,变化的是x、y、translationX、translationY.

2.MotionEvent的位置坐标信息
这里写图片描述
MotionEvent提供的方法:
getX():点击位置到View的左边的距离
getY():点击位置到View的上边的距离
getRawX():点击位置到手机屏幕左边的距离
getRawY();点击位置到手机屏幕上边的距离
3.TouchSlop是系统所能识别出的最小的滑动距离
ViewConfiguration.get(getContext()).getScaledTouchSlop()可获取,在处理滑动时,可以利用它来过滤
4.速度追踪
VelocityTracker,用于追踪手机在滑动过程中的速度,包括水平和竖直方向的速度
使用过程如下:
首先初始化VelocityTracker对象
VelocityTracker mVelocityTracker = VelocityTracker.obtain();
在View的onTouchEvent方法中追踪当前点击事件的速度
@Override
public boolean onTouchEvent(MotionEvent event) {
mVelocityTracker.addMovement(event);
}

通过如下方式来获取速度

             mVelocityTracker.computeCurrentVelocity(1000);//计算速度            float xVelocity = mVelocityTracker.getXVelocity();//获取x方向的速度            float yVelocity = mVelocityTracker.getYVelocity();//获取y方向的速度

computeCurrentVelocity这个方法的参数表示的是一个时间单元或者时间间隔,单位毫秒,在这时间间隔内手指在水平或竖直方向所划过的像素数。
不使用了的时候,重置并回收

 mVelocityTracker.clear();//重置 mVelocityTracker.recycle();//回收

5.手势检测,用于辅助检测用户的单击,滑动,长按,双击等行为。
1.创建一个GestureDetector对象并实现OnGestureListener接口,还可以实现OnDoubleTapListener监听双击的行为~~~

mGestureDetector = new GestureDetector(new MyOnGestureListener());//MyOnGestureListener是OnGestureListener接口实现类//下面这一步是对双击的监听mGestureDetector.setOnDoubleTapListener(new MyOnDoubleTapListener());//MyOnDoubleTapListener是OnDoubleTapListener接口实现类

2.接管View的onTouchEvent方法,onTouchEvent或者OnTouchListener中添加如下:

        imgView.setOnTouchListener(new OnTouchListener() {            @Override            public boolean onTouch(View v, MotionEvent event) {                boolean consume = mGestureDetector.onTouchEvent(event);//这里添加了                return consume;            }        });        //或者    public boolean onTouchEvent(MotionEvent event) {            boolean consume = mGestureDetector.onTouchEvent(event);//这里添加了            return consume;}

做完上面两步,我们就可以实现对手势检测了。
查看Android源码发现SimpleOnGestureListener,实现了onGestureListener和OnDoubleTapListener

    public static class SimpleOnGestureListener implements OnGestureListener, OnDoubleTapListener,            OnContextClickListener {

其实实现这个两个接口要实现好多方法,以后我们使用SimpleOnGestureListener可以有选择的实现某些常用的方法,减少代码量。
6.View的滑动
6.1 View的scrollTo和scrollBy是瞬间完成滑动。
这里滑动的是View的内容,View的本身并没有移动。
两个方法的源码。

    public void scrollBy(int x, int y) {        scrollTo(mScrollX + x, mScrollY + y);    }     public void scrollTo(int x, int y) {        if (mScrollX != x || mScrollY != y) {            int oldX = mScrollX;            int oldY = mScrollY;            mScrollX = x;            mScrollY = y;            invalidateParentCaches();            onScrollChanged(mScrollX, mScrollY, oldX, oldY);            if (!awakenScrollBars()) {                postInvalidateOnAnimation();            }        }    }

scrollBy是相对于上次的滑动。scrollTo是滑动到某个位置。
6.2使用动画比如属性动画 Android属性动画
6.3改变布局参数,

MarginLayoutParams lp = (MarginLayoutParams) getLayoutParams();lp.leftMargin = lp.leftMargin + moveX - mStartX;lp.topMargin = lp.topMargin + moveY - mStartY;// setLayoutParams(lp);   requestLayout();

7,弹性滑动
7.1使用Scroller

// 开启平滑移动mScroller.startScroll(viewParent.getScrollX(), viewParent.getScrollY(),                        -viewParent.getScrollX(), -viewParent.getScrollY());      postInvalidate();//刷新会调用onDraw--->调用computeScroll   @Override public void computeScroll() {        super.computeScroll();        if (mScroller.computeScrollOffset()) {            ((View) getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY());            invalidate();//刷新会调用onDraw--->调用computeScroll        }    }        
0 0