android view事件体系基础

来源:互联网 发布:淘宝上买衣服的窍门 编辑:程序博客网 时间:2024/05/16 07:14

一、view基础

1、view 的基础参数

  3.0之前  view 四个基础参数 left  top right bottom 

获取方法 getLeft(); getTop(), getRight();getBottom();

view 的left right  top bottom 都是相对父容器来说的。


3.0 之后又增加了4个参数   x  ,y  ,translationX  ,translationY

获取方法  getX()   getY();    getTranslationX();  getTranslationY();

这里getX() getY() getTansLations(); getTransLationY(); 也是相对父容器来说的。 

x  = left+gettranslationX();

y = right+getTranslationY();

这里的注意tranlationX() translationY() 指的是通过动画可以改变的平移量。(3.0 之出现了属性动画,也有了getTranslation()方法) 


2、MotionEvent  

一个事件序列包括(down move......  up)三种事件  ,三种事件合起来成为一个事件序列。

通过event getX() getY()  getRawX()  getRawY() 方法可以获取到 点击的 坐标 区别就是个体getX() 是相对父容器而言,getRaw() 是相对于屏幕而言的。

3、TouchSlop(滑动的最小距离,通过看源码发现是8dp的长度)

通过ViewConfiguration.get(getContext()).getScaledTouchSlop() 方法可以获取到值。

4、VelocityTracker(速度追踪器)

可以获取滑动的速度

VelocityTracker tracker =VelocityTracker.obtaion();

tracker.addMovMent(event);

tracker.completeCurrentVelocity(1000);

tracker.getXVelocity() 获取到x 速度

注意获取之前一定要先计算速度。

不是用它的时候

trancker.clear();

trancker.recycle();

5、GestureDetector(手势识别器)

手势检测用来辅助检测单机 长按 双击 滑动等事件

使用 

GestureDetectorgestureDetector= new GestureDetector(this);;

gestureDetector.setIsLongpressEnable(false) // 解决长按无法拖动的现象

boolean consum =gestureDetector.onTouchEvent(event) (返回值代表是消费掉了event事件)

这里长用到的监听有

  onsingleTapUp()   单机, onFiling() 惯性滑动  onScroll() 滑动 onLongPress() 长按onDoubleTap() 双击

这些监听可以在view onTounchEvent 方法中实现 ,建议是滑动相关的在onTuchEvent()中实现,点击相关的用GestDetector 去实现。

6、

Scroller

是view 实现滑动一个非常方便的的工具,但是本身不能使view发生滑动它需要配合view的computeScroll 方法  来实现view 的滑动。

Scroller  scroller = new Scroller(this);

private void smoothScrollTo(int destX ,int destY ){

int scrollx = getScrollX();

int delta  = destx - scrollx;

mScroller.startScroll(scrollX , 0 ,delta,0,1000) // 在1000 毫秒内滑向delta,效果就是缓慢滑动

invalidate();

}

public void computeScroll(){

if(mScroller.computeScroll()){

scrollTo(mScroller.getCurrX(),mScroller.getCurrY());

postInvalidate();

}

}

invalidate()会引起view 重绘,view重绘conputeScroll()会调用, postinvalidate() 又会引起view 重绘。知道滑动结束为止。


二、view 的滑动

(android 所有的滑动效果分类不过三类实现方法:1、 view 的scrollTo  scrollby 方法  注意这里滑动的是view 的内容 2、通过给view 添加平移效果  比如属性动画,3.0之前动画只是对view的影响进行操作,3.0以后属性动画才真正改变view 的属性 3、通过改变view layoutparams 来改变来实现view的滑动效果)


1、scrollTo()/scrollby()方法。(其实内部ScrollBy,是调用了ScrollTo()方法)

view 的两个内部属性ScrollX,ScrollY,这两个属性可以通过getScrollX(),getScrollY()方法获得 scrollX 值等于view 内容左边沿与view 左边沿的距离,注意这里的上边是指的view内容。同类scrollY 指的是view内容上边沿跟view 上边沿的距离。

这里当view 内容左边沿在 view 左边沿 左边时候view 正,此种情况相当于view 内容左移,运动是相对的view 相当于右移,scrollX 是view 属性 说是scroll 为正值

2、 使用动画 :这里主要是说view 的属性动画,3.0之前的平移动画只是改变了view 的影像。所以 view 的位置没有真正改变。在使用动画改变view 值时候 如果添加点击事件的话一定注意 view 的位置没有改变。

3、改变布局参数

v就是通过set不懂布局参数实现 滑动,这里非常灵活,以后会给出一些例子,在开发过程中,根据具体情况可以自己体会。

  比较三种移动发现:

view 的scrollTo(),跟ScrollBy 方法 移动的是view内容的位置,view本身不会改变。所以适合view 内容的滑动

动画 使用简单 可以实现一些复杂效果,由于3.0之前动画限制(只能改变影像不能真正移动动画)所以跟用户交互可能有问题,要对3.0之前情况处理。

通过布局参数的话,根据实际情况,操作可能有些复杂,单不会影响用户的交互,


三、view的弹性滑动

view 的弹性滑动实现方式很多,比如 前面提到Scroller,Postdelayed  ThreadSleep 等等。

下面分别实现

Scroller 实现滑动

Scroller 并不能实现滑动需要配合view的computerScroll () 方法来实现滑动。其实scroller 就是将滑动的距离,根据你设置的时间,以及插值器来,将值做一个滑动策略的变化。 类型于动画中的值动画/

通过动画 以及参数 比较简单 这里就不做介绍了。

而通过延时策略,就是通过hander post延迟消息,以及通过thread sleep 方法来实现动画的效果。(其本质跟Scroll 类似,就是将滑动距离,按时间的流失,逐步的放出来,通过 scrollTo(),或者scrollBy() 方法实现滑动)


3 0
原创粉丝点击