android艺术探索,Android艺术探索

View的位置主要由它的四个顶点来决定,分别对应View的四个属性:left,right,top,bottom。其中left对应的是View的左上角的横坐标,right对应的是右下角的横坐标,top对应的是左上角的纵坐标,bottom对应的是右上角的纵坐标。这些坐标都是相对父容器来说的这四个参数分别对应View的mLeft,mRight,mTop,mBottom成员变量,获取方式分别是getLeft(),getRight(),getTop(),getBottom(),由此可以通过宽度width = right - left 跟高度height = bottom - top

从Android3.0开始又新增了x,y,translationX,translationY这几个参数,x,y对应的是view左上角的坐标,而translationX和translationY是View左上角相对父容器的偏移量,这几个参数也是相对父容器,translationX和translationY默认值是0,View在平移过程中top跟left表示的是原始左上角的位置信息

公式 x= left + translationX

公式 y= right + translationY

2.MotionEvent跟TouchSlop

MotionEvent

手指接触屏幕后所产生的事件ACTION_DOWN:手指刚接触手机屏幕

ACTION_MOVE:手指在屏幕上移动

ACTION_UP:手指离开屏幕瞬间

同时系统提供了两种方法用于获取坐标getX()/getY()跟getRawX()/getRawY(),需要说明的是getX()是相对View自身而言的,getRawX是相对手机屏幕左上角的

TouchSlopTouchSlop是系统所能识别出的被认为是滑动的最小距离,即手指在手机屏幕上滑动时,如果两次滑动距离小于这个常量,系统不认为你是在进行滑动操作,而且这个常量跟设备有关,不同设备值可能不一样

通过ViewConfiguration.get(getContext().getScaledTouchSlop())来获取这个常量的值,利用这个值可以实现更好的用户体验

VelocityTrackerVelocityTracker用于追踪手指在滑动过程中的速度,包括水平跟竖直方向的速度,获取速度前必须要先计算速度

用法:

VelocityTracker v = VelocityTracker.obtain();

v.addMovement(event);

v.computeCurrentVelocity(1000);

int xVelocity = v.getXVelocity()

速度 = (终点位置-起点位置)/时间段

最后当不需要使用的时候需要v.clear();v.recycle();huishou ziyuan

GestureDetectorGestureDetector手势检测,用于辅助检测用户的单击,滑动,长按,双击,等行为使用方式比较简单跟速度追踪VelocityTracker类似,具体可以参考书的127页

ScrollerScroller弹性滑动对象,用于实现View的弹性滑动,scrollTo()跟scrollBy()其实都是一瞬间完成,scroller需要结合view的computeScroll()方法实现弹性滑动,关于scroller的具体使用,可以参考郭霖的这篇博客http://blog.csdn.net/guolin_blog/article/details/48719871

###View的滑动

####1.实现view的滑动的几种方式

通过view自身提供的scrollTo/scrollBy方法

通过动画给view施加平移效果来实现

通过改变view的layoutparams使得view重新布局从而实现滑动

scrollTo/scrollBy方法

这两个属性对应的其实是mScrollX,mScrollY获取可以通过getScrollX()跟getScrollY()获得这两个字段对应的值,需要理解的是mScrollX对应的是View的左边缘与View内容左边缘在水平方向的距离,mScrollY同理对应两者在竖直方向的距离,因此scrollTo等方法从左向右滑动mScrollX为负值,从上往下滑动mScrollY为负值

通过动画给view施加平移效果来实现

使用动画的方式主要是操作View的translationX跟translationY,View动画实际是对view的影像进行操作,并不能真正改变view的宽高/位置参数,如果不是属性动画还必须将fillafter设置为true才能保留动画结束时的状态

通过改变view的layoutparams使得view重新布局从而实现滑动方式比较简单这里不做赘述

几种动画方式的对比

View的scrollTo/scrollBy,操作简单,只能对view的内容滑动,而且不影像内容元素的点击事件

动画,操作简单,试用没有交互的view和实现复杂的动画效果,3.0以上利用属性动画能改变View本身的属性

改变布局参数:操作稍微复杂,适用于有交互的view

###弹性滑动

弹性滑动的思想就是将一次滑动分成若干次小的滑动,方法很多,比如通过Scroller,Handler/postDelayed,Thread/sleep等

##View的事件分发机制

此处先用一个伪代码来做一个Touch事件的过程分析

public boolean dispatchTouchEvent(MotionEvent ev) {boolean consume = false

if(onInterceptTouchEvent(ev)){

consume = onTouchEvent(ev)

} else {

consume = child.dispatchEvent(ev)

}

return consume;}

####在事件分发过程中,注意OnTouchListener跟OnTouchEvent还有OnClikListener的区别及优先级具体参见艺术探索P142,下面是关于Touch事件的几条结论的总结

同一个事件序列是指从手指接触屏幕那一刻起,到手指离开屏幕那一刻结束,以down事件开始,中间含有数量不等的move事件,以up事件结束

正常情况下,一个事件序列只能被一个view拦截且消耗

某个view一旦决定拦截,那么这一个事件序列都只能由它来处理,并且它的onInterceptTouchEvent不会再被调用

某个view一旦开始处理事件,如果它不消耗ACTION_DOWN事件(onTouchEvent返回了false),那么同一事件序列中的其它事件都不会再交给它处理

如果view不消耗除ACTION_DOWN以外的其它事件,那么这个点击事件会消失,此时父view的onTouchEvent并不会被调用,并且当前view可以持续收到后续的事件,最终这些消失的点击事件会传递给activity处理

viewgroup默认不拦截任何事件,android源码中的viewgroup的onterceptEvent方法默认返回false

view没有onInterceptEvent方法,一旦有点击事件传给它,那么它的onTouchEvent方法就会被调用

view的onTouchEvent默认都会消耗事件,除非它是不可点击的(clickable跟longclickable同时为false),view的longclickable默认都为false,clickable属性要分情况

view的enable属性不影像onTouchEvent的默认返回值

onClick会发生的前提是当前view是可点击,并且收到了down和up事件

事件传递的过程是由外向内的,即事件总是先传递给父元素,再由父元素分发给子view,通过requestDisallowInterceptTouchEvent方法可以在子元素中干预父元素的事件分发过程,但是action_down除外

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值