【安卓深度控件开发(1.3)】Creating Custom Views (官方示例文档汉化版)(3).doc_第1页
【安卓深度控件开发(1.3)】Creating Custom Views (官方示例文档汉化版)(3).doc_第2页
【安卓深度控件开发(1.3)】Creating Custom Views (官方示例文档汉化版)(3).doc_第3页
【安卓深度控件开发(1.3)】Creating Custom Views (官方示例文档汉化版)(3).doc_第4页
【安卓深度控件开发(1.3)】Creating Custom Views (官方示例文档汉化版)(3).doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

供稿【安卓深度控件开发(1.3)】Creating Custom Views (官方示例文档汉化版)(3) 创建视图交互 图形用户界面只是创建自定义视图的一部分。您还需要使视图以模仿现实世界行动相似的方式响应用户输入。对象始终应像真正对象做的一样。例如,图像应不立即弹出并重现在某个地方别的地方,因为在现实世界中的对象不会这样做。相反,图像应从一个位置移动到另一个位置。 用户也感觉到细微的行为或界面上响应最佳模仿现实世界中的细微之处。例如,当用户甩动一个 UI 对象,他们应该感觉动作继续,摩擦然后在最终停止,最后的位置超出甩动发生时的位置。 这节课演示如何使用 Android 框架的功能,将这些真实世界的行为添加到您的自定义视图。 处理输入的手势 像许多其他 UI 框架,android 系统支持输入的事件模型。用户操作都变成触发回调的事件,您可以重写自定义您的应用程序如何响应用户的回调。在 Android 系统中最常见的输入的事件是触摸,而触发 onTouchEvent(android.view.MotionEvent)。重写此方法以处理事件: Override public boolean onTouchEvent(MotionEvent event) return super.onTouchEvent(event); 触控事件本身不是特别有用的。现代触摸 Ui 定义交互的点击、 拉、 推、 甩动和放大的手势。若要将原始触控事件转换手势,Android 提供了 GestureDetector。 通过传入一个实现 GestureDetector.OnGestureListener 类的一个实例构造 GestureDetector。如果您只想要处理几个手势,您可以扩展 GestureDetector.SimpleOnGestureListener,而不是实现 GestureDetector.OnGestureListener 接口。例如,此代码创建一个类,扩展了 GestureDetector.SimpleOnGestureListener 和重写 onDown(MotionEvent)。 class mListener extends GestureDetector.SimpleOnGestureListener Override public boolean onDown(MotionEvent e) return true; mDetector = new GestureDetector(PieChart.this.getContext(), new mListener(); 无论是否使用 GestureDetector.SimpleOnGestureListener,您必须实现一个 onDown() 方法,返回 true。此步骤是必需的因为所有的手势开始与 onDown() 消息。如果您从 onDown() 返回 false,如同 GestureDetector.SimpleOnGestureListener,系统将假定您想要忽略其余的姿态,GestureDetector.OnGestureListener 的其他方法永远不会被调用。只有如果您真正想要忽略整个手势时应该返回 false 。GestureDetector.OnGestureListener 一旦和创建的 GestureDetector 实例,您可以使用您的 GestureDetector 来解释您收到在 onTouchEvent() 中的触摸事件。 Overridepublic boolean onTouchEvent(MotionEvent event) boolean result = mDetector.onTouchEvent(event); if (!result) if (event.getAction() = MotionEvent.ACTION_UP) stopScrolling(); result = true; return result; 当您传递 onTouchEvent() 一个触摸事件,它不能识别作为一种姿态的一部分时,它将返回 false。然后,您可以运行您自己的自定义手势检测代码。 创建物理运动 手势是控制触摸屏设备,功能强大的方法,但他们可以是违反直觉的很难记住除非他们产生物理可信的结果。一个很好的例子是甩动姿势,用户快速地在屏幕上移动手指,然后举起它。这种姿态是如果用户界面响应快速移动的方向的甩动,然后放慢,犹如该用户已推上飞轮和设置它旋转的道理的。 但是,模拟飞轮的感觉并很简单。物理和数学的很多都需要得到正常的飞轮模型。幸运的是,Android 提供了帮助器类来模拟这和其他的行为。Scroller 类是用于处理飞轮样式甩动手势的基础。 若要启动甩动,调用 fling() 与甩动起始的速度和最小和最大 x 和 y 值。对于速度值,您可以使用由 GestureDetector 为您计算的值。 Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) mScroller.fling(currentX, currentY, velocityX / SCALE, velocityY / SCALE, minX, minY, maxX, maxY); postInvalidate(); 注: 虽然按 GestureDetector 计算的速度是物理上准确的,但许多开发人员觉得甩动动画使用此值太快。它是通常使用 x 和 y 除 4 至 8 倍的速度。 调用 fling() 设置一个甩动手势。之后,您需要通过定时调用 SputeScrollOffset() 来更新 Scroller,computeScrollOffset() 通过甩动设置的初始属性与当前时间,计算当时的 x 与 y 坐标。调用 getCurrX() 与 getCurY() 获取该值。 多数视图通过调用 scrollTo() 直接设置 Scroller 的 x,y。PieChart 示例中稍有不同:它使用当前滚动 y 坐标设置饼的旋转角度。 if (!mScroller.isFinished() mSputeScrollOffset(); setPieRotation(mScroller.getCurrY(); Scroller 类可以为您计算滚动坐标,但它不会自动应用到您的视图。您需要获取和应用平滑的滚动动画。有两种方式实现: 在调用 fling() 之后调用 postInvalidate() 强制重绘。这种技术需要您在 onDraw() 中计算滚动偏移并在每次滚动偏移改变时使用 postInvalidate()。 设置一个 ValueAnimator 处理甩动动画并使用 addUpdateListener() 持续处理动画更新。 PieChart 示例使用了第二种方法。这种技术稍复杂,但它与动画系统密切工作,能够减少不必要的重绘请求。缺点是 ViewAnimator 不在 API 11 版本之前提供,所以不能在 Android 版本低于 3.0 的设备上使用。 注: 虽然 ValueAnimator 不能在 API 11 之前使用,但你仍可以在低于这个 API 级别上运行。您只需要在运行时进行版本测试,如果低于 11 就活力视图动画请求。 mScroller = new Scroller(getContext(), null, true); mScrollAnimator = ValueAnimator.ofFloat(0,1); mScrollAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() Override public void onAnimationUpdate(ValueAnimator valueAnimator) if (!mScroller.isFinished() mSputeScrollOffset(); setPieRotation(mScroller.getCurrY(); else mScrollAnimator.cancel(); onScrollFinished(); ); 平滑过渡 用户所期待的现代UI在各状态间平滑过渡。UI 元素淡入淡出而不是直接显示与消失。动作平滑的开始和结束而非突然开始和停止。Android 3.0 提供了属性动画框架让平滑过渡更简单。 若要使用动画系统,将会影响视图外观的属性更改时,不要直接更改该属性。相反,使用 ValueAnimator 来进行更改。在以下示例中,修改当前所选的饼图扇区在饼图中使整个图表旋转,使选择指针位于所选切片的中心。ValueAnimator 在一段几百毫秒时间内更改旋转,而不是立即设置新的旋转值。 mAutoCenterAnimator = ObjectAnimator.ofInt(PieChart.this, "PieRotation", 0);mAutoCenterAnimator.setIntValues(targetAngle);mAutoCenterAnimator.setDur

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论