文档章节

【安卓深度控件开发(1.4)】Creating Custom Views (官方示例文档汉化版)(4)

夜狼
 夜狼
发布于 2013/03/25 21:38
字数 1333
阅读 238
收藏 13

<h2>视图的优化</h2> <p>您现在有一个精心设计的视图,响应手势和平滑过渡,现在需要确保视图流畅。为了避免一个 UI 在播放过程中感觉缓慢或断断续续,您必须确保您的动画始终运行在每秒 60 帧。</p> <p>&#160;</p> <h3>少量的频繁处理</h3> <p>为了加快您的视图,在 <a href="http://developer.android.com/reference/android/view/View.html#onDraw(android.graphics.Canvas)" target="_blank">onDraw()</a> 中消除不必要的被频繁调用的例程代码,这将给你最大的回报。特别是在 <a href="http://developer.android.com/reference/android/view/View.html#onDraw(android.graphics.Canvas)" target="_blank">onDraw()</a> 中创建对象,因为这可能触发造成缓慢的垃圾回收。在初始化期间或动画之间分配对象。永远不要在动画运行时分配新对象。</p> <p>除了让 <a href="http://developer.android.com/reference/android/view/View.html#onDraw(android.graphics.Canvas)" target="_blank">onDraw()</a> 精简之外,您还应该确定尽可能的减少被调用。多数 <a href="http://developer.android.com/reference/android/view/View.html#onDraw(android.graphics.Canvas)" target="_blank">onDraw()</a> 调用由 <a href="http://developer.android.com/reference/android/view/View.html#invalidate()" target="_blank">invalidate()</a> 产生。所以应该排除不必要的 <a href="http://developer.android.com/reference/android/view/View.html#invalidate()" target="_blank">invalidate()</a> 调用。在可能的情况下,调用带有四个参数版本的 <a href="http://developer.android.com/reference/android/view/View.html#invalidate()" target="_blank">invalidate()</a> 而非无参数的版本。无参数的版本使整个视图无效,而四个参数的版本只会使视图的特定区域无效。此方法允许绘制要求可更有效并可以消除在无效矩形区域之外的区域。</p> <p>另一个非常低效的操作是遍历布局。当一个视图调用 <a href="http://developer.android.com/reference/android/view/View.html#requestLayout()" target="_blank">requestLayout()</a> , Android UI 系统必须遍历整个视图树来确定每个视图的大小。如果它发现有冲突的测量,它可能需要多次遍历层次结构。UI 设计师有时为了得到应有的行为创建深层嵌套的 <a href="http://developer.android.com/reference/android/view/ViewGroup.html" target="_blank">ViewGroup</a> 层次结构。这些深视图层次结构会导致性能问题。使您的视图层次结构尽可能浅。</p> <p>如果您有一个复杂的用户界面,您应考虑编写自定义 <a href="http://developer.android.com/reference/android/view/ViewGroup.html" target="_blank">ViewGroup</a>,以执行其布局。不像内建的视图,您的自定义视图可以做出特定于应用程序的子级大小和形状,假设,从而避免遍历其子级来计算测量。<font color="#006600">PieChart</font> 示例演示如何扩展视图分组作为自定义视图的一部分。<font color="#006600">PieChart</font> 有子视图,但它永远不会衡量他们。相反,它将根据自己的自定义布局算法直接设置其大小。</p> <p>&#160;</p> <h3>使用硬件加速</h3> <p>从 Android 3.0 开始, Android 2D 图形系统支持使用大多数新的 Android 设备上使用硬件 GPU(图形处理单元) 加速。对于很多应用程序来说, GPU 硬件加速可能导致巨大的性能提升,但它并不是每个应用程序的正确选择。Android 框架提供精细控制您的应用程序的哪些部分是或不是硬件加速的能力。</p> <p>查看 Android 开发手册中的<a href="http://developer.android.com/guide/topics/graphics/hardware-accel.html" target="_blank">硬件加速</a>了解如何在应用程序,活动或窗口级别启用硬件加速。请注意除了开发人员指南中的说明,您还必须通过在 <font color="#006600">AndroidManifest.xml</font> 中指定 <font color="#006600">&lt;uses-sdk android:targetSdkVersion=&quot;11&quot;/&gt;</font> 设置目标应用程序的 API 为 11 或更高。</p> <p>一旦您启用了硬件加速,你可能不会看到增加性能。移动 GPU 都非常擅长某些任务如缩放、 旋转以及处理位图图像。但可能不太擅长绘制线条与曲线这类的任务。要获得最大的 GPU 加速,您应该最大化 GPU 擅长的任务,减少它不擅长的任务。</p> <p>在 <font color="#006600">PieChart</font> 中,例如,绘制饼图是相对较慢的。每次旋转时重绘导致 UI 缓慢。解决方案是将饼图放置在一个子 <a href="http://developer.android.com/reference/android/view/View.html" target="_blank">View</a> 中并设置 <a href="http://developer.android.com/reference/android/view/View.html" target="_blank">View</a> 的<a href="http://developer.android.com/reference/android/view/View.html#setLayerType(int, android.graphics.Paint)" target="_blank">图层类型</a>为 <a href="http://developer.android.com/reference/android/view/View.html#LAYER_TYPE_HARDWARE">LAYER_TYPE_HARDWARE</a>。那么 GPU 可能将它缓存为静态图像。这个示例定义了一个 PieChart 的内部类,以最小化代码量更改来实现这一解决方案。</p> <div style="border-bottom: #ddd 1px solid; border-left: #ddd 1px solid; padding-bottom: 1em; margin: 0px 0px 1em; padding-left: 1em; padding-right: 1em; background: #f7f7f7; overflow: auto; border-top: #ddd 1px solid; border-right: #ddd 1px solid; padding-top: 1em"> <pre> <span style="color: #0000ff">private</span> <span style="color: #0000ff">class</span> PieView <span style="color: #0000ff">extends</span> View {

   <span style="color: #0000ff">public</span> PieView(Context context) {
       <span style="color: #0000ff">super</span>(context);
       <span style="color: #0000ff">if</span> (!isInEditMode()) {
           setLayerType(View.LAYER_TYPE_HARDWARE, <span style="color: #0000ff">null</span>);
       }
   }
   
   @Override
   <span style="color: #0000ff">protected</span> <span style="color: #0000ff">void</span> onDraw(Canvas canvas) {
       <span style="color: #0000ff">super</span>.onDraw(canvas);

       <span style="color: #0000ff">for</span> (Item it : mData) {
           mPiePaint.setShader(it.mShader);
           canvas.drawArc(mBounds,
                   360 - it.mEndAngle,
                   it.mEndAngle - it.mStartAngle,
                   <span style="color: #0000ff">true</span>, mPiePaint);
       }
   }

   @Override
   <span style="color: #0000ff">protected</span> <span style="color: #0000ff">void</span> onSizeChanged(<span style="color: #0000ff">int</span> w, <span style="color: #0000ff">int</span> h, <span style="color: #0000ff">int</span> oldw, <span style="color: #0000ff">int</span> oldh) {
       mBounds = <span style="color: #0000ff">new</span> RectF(0, 0, w, h);
   }

   RectF mBounds;

}</pre>

</div>

<br />

<p>完成这一更改后,<font color="#006600">PieChart.PieView.onDraw()</font> 方法只在第一次显示时调用。在其余的应用程序的生存期,饼图是作为图像缓存由 GPU 在不同旋转角度重绘。GPU 硬件是特别擅长这种事情,并立即产生明显的性能差异。</p>

<p>不过还有一种权衡。缓存图像作为硬件层消耗视频内存,这是一种有限的资源。基于这个原因,<font color="#006600">PieChart.PieView</font> 的最终版本只有当用户对其滚动时将图层类型设置为 <a href="http://developer.android.com/reference/android/view/View.html#LAYER_TYPE_NONE" target="_blank">LAYER_TYPE_HARDWARE</a> 。在其他情况下,它设置其图层类型为 LAYER_TYPE_NONE,它允许 GPU 停止缓存图像。</p>

<p>最后,不要忘记来分析您的代码。一个改善视图性能的技术可能在另一处使用时对性能造成负面影响。</p>

© 著作权归作者所有

夜狼
粉丝 6
博文 15
码字总数 13445
作品 0
深圳
程序员
私信 提问
【安卓深度控件开发(1.5)】本章总结

是的,我在完成了汉化后的确学到了很多新东西。您感觉怎么样呢,现在开始就是本人编写的内容了,希望不会把你带沟里了 ~~~ 好了,大家看了安卓官方提供的 Creating Custom Views 的汉化版本之...

夜狼
2013/03/27
618
0
【安卓深度控件开发(1.3)】Creating Custom Views (官方示例文档汉化版)(3)

创建视图交互 图形用户界面只是创建自定义视图的一部分。您还需要使视图以模仿现实世界行动相似的方式响应用户输入。对象始终应像真正对象做的一样。例如,图像应不立即弹出并重现在某个地方...

夜狼
2013/03/23
221
0
Tabris 1.4 预览版: 集成 Google Analytics 服务

Tabris 1.4 将会在 6 月 26 日正式发布,此版本一个最重要的特性是完成了一个 Tabris UI 框架 的 tracking API,这个 API 集成了 Google Analytics。 在 Google Analytics 中,用户可以看到所...

oschina
2014/04/23
1K
0
谷歌中移动正合作开发中文版Android

谷歌手机进军国内的脚步已近越来越近了。目前,谷歌公司正在进行Android系统的汉化工作,但没有透露手机推出的具体时间表。 据媒体报道称,谷歌Android系统的汉化工作正在进行中,但具体时间...

红薯
2008/11/10
171
0
【我的Android进阶之旅】解决Android Studio在XML中使用自定义View输入自定义属性的时候没有任何提示的问题

版权声明:本文为【欧阳鹏】原创文章,欢迎转载,转载请注明出处! 【http://blog.csdn.net/ouyang_peng】 https://blog.csdn.net/qq446282412/article/details/81744295 一、问题描述 这两天...

欧阳鹏
2018/08/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

左边竖条的实现方法

下面这个图形,只使用一个标签,可以有多少种实现方式: 假设我们的单标签是一个 div : 1 < div > div> 定义如下通用CSS: 1 2 3 4 5 6 div{ position : relative ; width : 200px ; height ...

前端老手
28分钟前
2
0
java利用ECHARTS.JS在前台显示图表

步骤1: (1)在java后台,使用MSQL分组函数,列出所有线在对应的点的值, (2)组成的Map如图所示: 注意: key为0的value表示X轴需要的数据;key为其他的值表示图表线条的名字,value为x轴的点对应的y...

文文1
30分钟前
6
0
解题博客

https://blog.csdn.net/hk2291976/article/category/9265848

素雷
55分钟前
4
0
linux-ubuntu下使用linuxdeployqt+appimagetool将qt程序打包成xxx.AppImage文件

下文中提及的inuxdeployqt patchelf appimagetool工具及示例下载地址: 链接: https://pan.baidu.com/s/1BGm_btMIe75uW9hOC09Xlg 提取码: 7ayh 需要创建目录及文件 xxx.AppDir xxx.AppDir/Ap...

shzwork
今天
5
0
javascript-ASCII码混合四位随机验证码

// 产生一个随机字符库:数字大写小写的数量是对应的 function randomStr(){ // 产生库 var strData = ""; for(var i=0;i<4;i++){ var num = random(0,9); var az = String.fromCharCode(ra......

ACKo
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部