Android View系统解析(上)

上传人:野鹰 文档编号:2883537 上传时间:2017-07-28 格式:PDF 页数:29 大小:210.05KB
返回 下载 相关 举报
Android View系统解析(上)_第1页
第1页 / 共29页
Android View系统解析(上)_第2页
第2页 / 共29页
Android View系统解析(上)_第3页
第3页 / 共29页
Android View系统解析(上)_第4页
第4页 / 共29页
Android View系统解析(上)_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《Android View系统解析(上)》由会员分享,可在线阅读,更多相关《Android View系统解析(上)(29页珍藏版)》请在金锄头文库上搜索。

1、Android View系统解析(上)任玉刚Tapas SDG概要Android View系统解析(上) 再说动画 View基础知识 View的滑动 View的事件分发 View的滑动冲突Android View系统解析(下) View的绘制过程 自定义View再说动画注:下述结论均经过实例证实1:将view移动(平移)后,在3.0以前的系统上,不管是view动画还是属性动画,新位置均无法触发点击事件,同时,老位置仍然可以触发点击事件,尽管view已经在视觉上不在了,同时将view移回原位置的时候,点击事件继续生效;2:从3.0开始,属性动画的事件触发位置为移动后的位置,view动画仍然在老位

2、置3:重复次数设为infinite的动画,activity结束的时候必须调用cancel,否则动画将无限进行从而导致view无法释放继而导致整个activity无法释放建议:产品不应该设计含有交互的动画元素,因为在3.0以下 可 点击事件的触发 再说动画-LayoutAnimation 用android:animateLayoutChanges=true过LayoutTransition 生自定义的LayoutChanges动画 用LayoutAnimationandroid:layoutAnimation=anim/list_anim_layoutLayoutAnimationControl

3、ler#list_anim_layout.xmlnote :child animation delay = child index * delay * animation duration#list_anim.xmlView基础知识-View的 数width = right - leftheight = bottom - topx = top + translationXy = left + translationYleftrightbottomtopView基础知识-TouchSlopTouchSlop系统 识 的 为是滑动的 ViewConfiguration.get(getContext

4、().getScaledTouchSlop()View基础知识-VelocityTrackerVelocityTracker用 velocityTracker = VelocityTracker.obtain(); velocityTracker.addMovement(event); velocityTputeCurrentVelocity(1000); int velocity = (int) velocityTracker.getXVelocity(); .velocityTracker.recycle(); View基础知识-GestureDetectorGestureDetector

5、, 了onTouchEvent,自 用 boolean consume = mGestureDetector.onTouchEvent(event)OnGestureListener onDownonSingleTapUponFlingonScrollonLongPresscurrency1note : 解“后无法fi动的fl mGestureDetector.setIsLongpressEnabled(false)View基础知识-ScrollerScroller性滑动 用调用scrollTo/scrollBy 进行滑动的时候, 过程是的,Scroller可以为View ”的滑动效用 Scr

6、oller View#computeScroll View基础知识-Scroller 例Scroller scroller = new Scroller(mContext); private void smoothScrollTo(int destX, int destY) / ”动定位置int scrollX = getScrollX();int delta = destX - scrollX;/ 以时“滑destX,效是滑动mScroller.startScroll(scrollX, 0, delta, 0, Math.abs(delta) * 3);invalidate();Overri

7、depublic void computeScroll() if (mSputeScrollOffset() scrollTo(mScroller.getCurrX(), mScroller.getCurrY();postInvalidate();View基础知识-MotionEventMotionEvent 触 时 产生的系行为事件#getX/getRawX#getY/getRawY的事件down - move(*) - updown - down - move(*) - upView的滑动法:1.View#scrollTo/scrollBy2.Animation#TranslationX/

8、TranslationY3.real Layout changesView的滑动 用View#scrollTo/scrollBy100pxgetScrollY = 100不可 View的滑动 用Animation#TranslationX/TranslationY100pxgetTranslationY= -1003.0以下不可点击3.0以下可点击View的滑动 real Layout changes100pxgetHeight -= 100不可 View的滑动 法 的 : 1.View#scrollTo/scrollBy可以 滑动 , 是 无法滑 View的 , 用 2.Animation#

9、TranslationX/TranslationY可以任 滑动, 是在3.0下 点击事件,用 3.real Layout changes可以 滑动 ,不 点击事件, 用 上 复点View的滑动 例Overridepublic boolean onTouchEvent(MotionEvent event) int x = (int) event.getX();int y = (int) event.getY();switch (event.getAction() case MotionEvent.ACTION_DOWN: break;case MotionEvent.ACTION_MOVE: i

10、nt deltaX = x - mLastX;int deltaY = y - mLastY;/ 滑动break;case MotionEvent.ACTION_UP: / 了下 , 开 的时候,自动 滑动, 滑,要 前 的位置break;default:break;mLastX = x;mLastY = y;return true;View的性滑动1.View#scrollTo/scrollBy用Scroller View#computeScroll 2.Animation#TranslationX/TranslationY 动画, 过Handler(View)#postDelayedThr

11、ead#sleep , 用ValueAnimator#AnimatorUpdateListener3.real Layout changes 动画, 过Handler(View)#postDelayedThread#sleep , 用ValueAnimator#AnimatorUpdateListenerView的事件分发 public boolean dispatchTouchEvent(MotionEvent ev)用 进行事件的分发,事件 前View, 法定 调用, 回结受前View的onTouchEvent和下级View的dispatchTouchEvent 法的 ,表是否消耗前事件

12、public boolean onInterceptTouchEvent(MotionEvent event) 在上述 法 部调用,用 是否拦截某 事件,前View拦截了某 事件, 在同个事件中, 法不 再次调用, 回结表是否拦截前事件 public boolean onTouchEvent(MotionEvent event) 在dispatchTouchEvent 法中调用,用 理点击事件, 回结表是否消耗前事件,不消耗,同个事件中,前View无法再次 理事件View的事件分发 事件的顺Activity - Window - View 事件的 则点击事件底层View(般是个ViewGrou

13、p)以后,调用ViewGroup的dispatchTouchEvent 法,然后的逻辑是样的:底层ViewGroup拦截事件即onInterceptTouchEvent 回true,则事件由ViewGroup 理,个时候,ViewGroup的mOnTouchListener 设置,则onTouch 调用,否则,onTouchEvent 调用,也是说,都提供的话,onTouch蔽掉onTouchEvent 在onTouchEvent中,设置了mOnClickListener,则onClick 调用 顶层ViewGroup不拦截事件,则事件 它的在点击事件链上的子View,个时候,子View的di

14、spatchTouchEvent 调用, 为止,事件已经从 底层View 了上层View,下 的行为和 底层View致, 循环,整个事件 发 另外要说明的是,ViewGroup默 是不拦截点击事件的, onInterceptTouchEvent 回false 个点击事件,子View的onTouchEvent 回了false,则父View的onTouchEvent 直调用,以 类推 有的View都不 理,则 终由Activity 理,个时候,Activity的onTouchEvent 调用 View的事件分发 事件down - move(*) - up正 情况下,个事件只 个View拦截且消耗

15、相关结论1. 外层 器旦定拦截, 个事件都只 由它 理(时 它的话),且它的onInterceptTouchEvent不再 调用2. 某个 器旦开始 理事件,它不消耗本次事件(onTouchEvent 回了false), 个事件都不再交 它 理3. ViewGroup默 不拦截任何事件4. View的onTouchEvent默 都消耗事件,除非它是不可点击的(clickable & longClickable同时为false)5. onClick发生的前提是:前View是可点击的,并且它收了down和up的事件View的滑动冲突滑动冲突类 ()外部左右滑动部上下滑动(二)外部上下滑动部左右滑动()外部上下滑动部上下滑动View

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号