电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

androidview系统解析(上)

29页
  • 卖家[上传人]:luoxia****01811
  • 文档编号:47839949
  • 上传时间:2018-07-05
  • 文档格式:PDF
  • 文档大小:210.05KB
  • / 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 动画 仍然在老位置3 :重复次数设为 infinite 的动画, activity 结束的时候必须调用 cancel ,否则动画将无限进行从而导致 view 无法释放继而导致整个 activity 无法释放建议:产品不应该设计含有交互的动画元素,因为在 3.0 以下很可能影 响点击事件的触发。再说动画 -LayoutAnimation

      2、使用 android:animateLayoutChanges=“true“ 通过 LayoutTransition 来派生自定义的 LayoutChanges 动画 使用 LayoutAnimation android:layoutAnimation=“anim/list_anim_layout“ 参见 LayoutAnimationController#list_anim_layout.xmlnote : child animation delay = child index * delay * animation duration#list_anim.xmlView 基础知识 -View 的参数width = right - left height = bottom - top x = top + translationX y = left + translationYleftrightbottomtopView 基础知识 -TouchSlopTouchSlop系统所能识别出的被认为是滑动的最小距离获取方式ViewConfiguration.get(getContext().ge

      3、tScaledTouchSlop()View 基础知识 -VelocityTrackerVelocityTracker 速度追踪使用方式 velocityTracker = VelocityTracker.obtain(); velocityTracker.addMovement(event); velocityTputeCurrentVelocity(1000); int velocity = (int) velocityTracker.getXVelocity(); . velocityTracker.recycle(); View 基础知识 -GestureDetectorGestureDetector 手势检测,封装了 onTouchEvent ,自带速度追踪功能使用方式 boolean consume = mGestureDetector.onTouchEvent(event)接口 OnGestureListener onDown 、 onSingleTapUp 、 onFling 、 onScroll 、 onLongPress 等 note : 解决长按屏幕后无法拖动的现

      4、象 mGestureDetector.setIsLongpressEnabled(false)View 基础知识 -ScrollerScroller弹性滑动对象 用途当调用 scrollTo/scrollBy 来进行滑动的时候,其过程是瞬间 完成的, Scroller 可以为 View 带来缓慢的滑动效果 使用方式 Scroller 配合 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();Overridepublic void

      5、computeScroll() if (mSputeScrollOffset() scrollTo(mScroller.getCurrX(), mScroller.getCurrY();postInvalidate();View 基础知识 -MotionEventMotionEvent当手接触手机屏幕时所产生的一系列行为事件 #getX/getRawX #getY/getRawY典型的事件序列 down - move(*) - up down - down - move(*) - upView 的滑动方法:三种1.View#scrollTo/scrollBy2.Animation#TranslationX/TranslationY3.real Layout changesView 的滑动 采用 View#scrollTo/scrollBy100pxgetScrollY = 100不可见区域View 的滑动 采用 Animation#TranslationX/TranslationY100pxgetTranslationY= -1003.0 以下以下 此区域此区域 不可点不可点 击击3.

      6、0 以下以下 此区域依此区域依 旧可点击旧可点击View 的滑动 real Layout changes100pxgetHeight -= 100不可见区域View 的滑动三种方法之间的区别: 1.View#scrollTo/scrollBy 可以满足滑动需求,但是内容无法滑出 View 的边界 ,使用简单 2.Animation#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: int delt

      7、aX = 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 ) #postDelayed 、 Thread#sleep 来完 成,或者使用 ValueAnimator#AnimatorUpdateListener 来完成3.real Layout changes 渐近式动画,通过 Handler ( View ) #postDelayed 、 Thread#sleep 来完 成,或者使用 ValueAnimator#Animator

      8、UpdateListener 来完成View 的事件分发 public boolean dispatchTouchEvent(MotionEvent ev) 用来进行事件的分发,如果事件能够传递给当前 View ,那么此方法 一定会被调用,返回结果受当前 View 的 onTouchEvent 和下级 View 的 dispatchTouchEvent 方法的影响,表示是否消耗当前事件public boolean onInterceptTouchEvent(MotionEvent event) 在上述方法内部调用,用来判断是否拦截某此事件,如果当前 View 拦截了某此事件,那么在同一个事件序列中,此方法不会被再次调用 ,返回结果表示是否拦截当前事件public boolean onTouchEvent(MotionEvent event) 在 dispatchTouchEvent 方法中调用,用来处理点击事件,返回结果 表示是否消耗当前事件,如果不消耗,同一个事件序列中,当前 View 无法再次处理事件View 的事件分发 事件的传递顺序 Activity - Window - Vi

      9、ew 事件的传递规则 点击事件到底层 View (一般是一个 ViewGroup )以后,会调用 ViewGroup 的 dispatchTouchEvent 方法,然后的逻辑是这样的:如果底层 ViewGroup 拦截事件即 onInterceptTouchEvent 返回 true ,则事件由 ViewGroup 处理, 这个时候,如果 ViewGroup 的 mOnTouchListener 被设置,则会 onTouch 会被调用,否则, onTouchEvent 会被调用,也就是说,如果都提供的 话, onTouch 会屏蔽掉 onTouchEvent 。在 onTouchEvent 中,如果设置了 mOnClickListener ,则 onClick 会被调用。如果顶层 ViewGroup 不拦截事件 ,则事件会传递给它的在点击事件链上的子 View ,这个时候,子 View 的 dispatchTouchEvent 会被调用,到此为止,事件已经从最底层 View 传递给 了上一层 View ,接下来的行为和其底层 View 一致,如此循环,完成整个事 件派发。另外要说明的是, ViewGroup 默认是不拦截点击事件的,其 onInterceptTouchEvent 返回 false 。如果一个点击事件,子 View 的 onTouchEvent 返回了 false ,则父 View 的 onTouchEvent 会被直接调用, 以此类推。如果所有的 View 都不处理,则最终会由 Activity 来处理,这个时 候, Activity 的 onTouchEvent 会被调用。View 的事件分发 事件序列down - move(*) - up 正常情况下,一个事件序列只能被一个 View 拦截且消耗 相关结论1. 外层容器一旦决定拦截,那么这一个事件序列都只能由它来处理(如果时 间序列能够传递给它的话),且它的 onInterceptTouchEvent 不会再被调用 2. 某个容器一旦开始处理事件,如果它不消耗本次事件( onTou

      《androidview系统解析(上)》由会员luoxia****01811分享,可在线阅读,更多相关《androidview系统解析(上)》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2 2022年小学体育教师学期工作总结 2022年家长会心得体会集合15篇
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.