android View的详解(以及View的事件分发)(一)

 关于View,我会通过几篇博客来进行讲解,通过查阅书籍帮助大家抽取常用的知识

1.1什么是View?
View是android中所有空间的基类,
View是一种界面层空间的一种抽象,它代表了一个控件,除了View还有ViewGroup,内部
包涵了许多控件, 在android设计中,ViewGroup也继承了View,也就是说,view本身可以是单个控件,也可以是由多个控件组成的一组控件.
Button是一个View, Linerlayout不但是一个View,还是一个ViewGroup,viewGroup内部可以有子view,这个子view同样还可以是ViewGroup

1.2 View的位置参数,
View的位置主要由它的四个顶点来决定,分别对应View的四个属性,top,left,right ,bottom。
其中top是左上角纵坐标,left是左上角横坐标,right是右下角横坐标,bottom是右下角纵坐标。
这些坐标都是相对于View的父容器来说,因此它是一种相对坐标

根据上面的图片很容易得到view的宽高和坐标的关系,
width=right-left
height=bottom - top
问题来了?如何得到上面的是个参数那?
Left=getLeft();
Right=getRight();
Top=getTop();
Bottom=getBottom();

从android 3.0开始,View增加了几个参数;x, y, translationX, transltionY
x和y: 是View左上角的坐标
transltionX transltionY: 是View左上角相对于父容器的偏移量,这几个参数也是相对于父容器的坐标,transltionX和translationY的默认值是0,
关系的算法:
x=Left + TranslationX
y= top + TranslationY

需要注意: View在平移的时候,top,left表示原始左上角的位置信息,其值并不会发生改变,
发生改变的是x,y, translationX,translationY这四个参数,

1.1.3 MotionEvent
.MotionEvent:在手指接触屏幕后产生的一系列事件中,
1)ACTION_DOWN 手指刚接触屏幕
2)ACTION_MOVE 手指在屏幕上移动
3)ACTION-UP 手指从屏幕上松开的一瞬间
正常情况下,手指触发屏幕会触发一系列的点击事件,考虑如下几种情况
1)点击屏幕离开松开, 事件序列为 DOWN -->UP
2)点击屏幕滑动一会在松开,事件序列为: DOWN-->MOVE-->.....-->MOVE-->UP
同时通过MotionEvent对象我们可以得到点击事件发生的X和Y坐标,
系统提供两组方法:getX/getY 和 getRawX 和 getRawY,
3.他们的区别是什么?
getX/getY:返回的是相对于当前view左上角的x和y坐标,
getRawX/getRawY:返回是相对于手机屏幕的左上角坐标的XY轴,

1.1.4 。TouchSlop
TouchSlop是系统所能识别出的被认为是滑动的最小距离,换句话说,当手指在屏幕上滑动时,
如果两次滑动之间的距离小于这个常量,那么系统就不认为你是在进行滑动操作,、
原因:滑动的距离短,系统不认为它是滑动,
这是一个常量,和设备有关,在不同设备上的这个值可能是不同的,通过如下方式即可获取这个常量
ViewConfiguration.get(getContext).getScaledTouchSlop();
这个常量有什么意义?
当我们处理滑动时,可以利用这个常量来做一些过滤,比如当两次滑动事件的滑动距离小于这个值,我们就可以认为未达到滑动距离的临界值,因此就可以认为他不是滑动,这样就可以给用户更好的体验。

1.1.5 VelocityTracker GestureDetector 和 Scroller
1)VelocityTracker
速度追踪,用于追踪手指在滑动过程中的速度,包括水平和 垂直方向的速度,它的使用过程很简单
首先在View的onTouchEvent方法中追踪当前点击事件的速度

接着,当我们知道当前的滑动速度时,这个时候可以采用如下方式获得当前速度

最后,当我们不需要的时候,需要调用clear方法来重置并回收内存;

2)GestureDelector
手势检测,用于辅助检测用户的单击,滑动,长按,双击等行为,要使用GestureDetector也不复杂
首先创建一个GestureDetector对象并实现onGestureLister接口,根据需要我们还可以实现onDoubleTabListener从而监听双击行为:

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

做完上面两部,我们可以有选择的实现onGestureListener和onDoubleTabListener中的方法

3) Scroller
弹性滑动对象,用于实现View的弹性滑动,当使用View的scrollTo/scrollBy方法进行滑动时,过程是瞬间完成的,这个过渡效果滑动用户体验不好,这个时候就会使用Scroller来实现过渡效果滑动,过程不是瞬间完成,而是在一定时间间隔内完成,Scroller本身无法让View弹性滑动,他需要和View的
computeScroll方法配合使用才能完成这个功能,


  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值