5.Speed up your Android UI
一些Android程序需要从UI toolkit中一点点地挤出性能,不过确实有许多方法可以办到。在这篇文章中,你会发现如何加速你的绘制并感觉到activity启动时间的变化。这些技术都依赖于一个功能:window的background drawable.
window background这个概念有一点令人误解。当你在一个Activity中调用setContentView()来创建UI时,Android会把你所有view添加到Actitity的window中。这个window中不只包含你的那些view,还有一些是它人为你创建的。这里面最重要的一个是,在G1中的那个DecorView,在下面的hierarchy视图中高亮的:
DecorView实质上了window background的绘制,在Activity调用getWindow().setBackgroundDrawable()就可以改变DecorView的background的绘制。正如前面提到的,这个机制是跟当前Android的实现非常相关的,可能会在Android以后的版本中被改变。
我在Android2.3.3版本中测试了文中的示例,发现测试前后的帧数并未改变,所以我猜测,可能这个机制已经在这个版本改变了,我们不需要关心它。
文章的后半部分介绍了一个trick:
把bitmap drawable设置成背景以实现某些特定的功能。例如:
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/shelf_panel"
android:tileMode="repeat" />
然后activity的theme来引用这个drawable:
<resources>
<style name="Theme.Shelves" parent="android:Theme">
<item name="android:windowBackground">@drawable/background_shelf</item>
<item name="android:windowNoTitle">true</item>
</style>
</resources>
效果图如下:
(一层一层的书架)
The same exact trick is used in the Google Maps application that
ships with the T-Mobile G1. When the application is launched, the user
immediately sees the loading tiles of MapView
. This is only a trick, the theme is simply using a tiled background that looks exactly like the loading tiles of MapView
.
Sometimes the best tricks are also the simplest so the next time you
create an activity with an opaque UI or a custom background, remember to
change the window’s background.
6.Android Layout Tricks #4: Optimize, Part 2
本文介绍了一个非常有用的的Widget:ViewStub。ViewStub可以被看作一个lazy include。它带来了所有<include />的功能并且还不会使一些不常使用的view污染你的UI。
ViewStub是一个轻量级的view。它没有dimension(尺寸),也不许要绘制任何东西,并且不以任何方式参与到布局中。这意味着ViewStub是一个非常廉价的,所以view层级中包含它也不会有大的开销。它的最好描述就是:lazy include。引用了ViewStub的layout会在你决定要inflate这些ui时inflate。
ViewStub的使用很简单:
<ViewStub
android:id="@+id/stub_import"
android:inflatedId="@+id/panel_import"
android:layout="@layout/progress_overlay"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="bottom" />
当你inflate ViewStub时,简单的调用它的inflate()方法就可以了。你也可以改变ViewStub的visibility来inflate:
((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);
// or
View importPanel = ((ViewStub) findViewById(R.id.stub_import)).inflate();
来看一下效果图:
下面的Importing...视图就是由ViewStub inflate而来。
需要注意的是:stub被inflate后,它会被从view hierarchy中移除。因此,不需要长期持有它的引用,例如用类变量来引用一个ViewStub。
ViewStub在轻松编码和效率之间做到了非常好的妥协。你可以用它来替代在运行时inflate view并手动添加到你的view hierachy这样的事情。它唯一的缺陷是它目前不支持<merge />标签。(我在SDK2.3.3中做了测试,依然不支持merge标签,不过我们可以完全规避这个缺陷)。
7.Drawable mutations
Android的Drawable是极其有用的。Drawable是一个通常跟View有关联的插件化的图像容器。例如,BitmapDrawable可以被用来显示图片,ShapeDrawable用以显示图形或者梯度,等等。你甚至可以把它们组合起来来创建更复杂的效果图。
Drawables allows to easily customize the rendering of the widgets without subclassing them.(Drawable允许在不subclassing widget的情况下来轻松地自定义它们的效果。这句话好难翻译 =。=)。事实上,大量的Android默认程序和widget都使用了Drawable;在Android Framework核心库里面有700多个Drawable。因为Android中使用了大量的drawable,所以Android对它们的加载方式作了优化。例如,每当你创建一个Button,将从framework resources中加载一个新的drawable(android.R.drawable.btn_default)。这意味着所有app的button都使用新的drawable实例作为它们的背景。所以,所有的这些drawable都共享一个公共的状态(叫做constant state)。这个state的内容因你使用的drawable类型而不同,但是它通常包含了一个resource可以定义的所有的属性(properties)。以button为例,它的constant state包含了这个默认的bitmap。通过这种方式,所有跨app的button其实都是共享同一个bitmap,节省了很多内存。
下图展示了当给2个不同view指定相同的图片资源作为背景后的情况。你可以看到,两个drawable被创建出来,但是它们都共享了同样的constant state和bitmap:
共享state的特性非常棒地避免了内存浪费,但是当你要尝试改变drawable属性的时候会引入一些问题:当你改变了多个view所引用的drawable的constant state时,你会发现所有引用处都被更改了,这是因为你的改动改变了constant state,并且这个改变是不可逆的。如果你要避免这个问题,那么就需要调用Drawble的mutate()方法,它会创建一份constant state的拷贝,这样,修改当前drawable的属性就不会影响其它drawable。如下图所示:
mutate()返回drawable本身,并不创建新的drawable。
备注:引用android system的drawable并不会出现如上所说的问题,应该有保护措施来保护系统资源不会被其它程序在运行时修改。
分享到:
相关推荐
在这个压缩包中,我们看到一系列以 "trick" 开头命名的.gif 图像,比如 "trickb12.gif" 和 "trick3d.gif"。这些可能是展示字体效果的示例图,展示了字体在不同样式或应用场景下的视觉表现,例如薄体("thin")、蓝图...
Hattrick球场上座率概算 Hattrick球场上座率概算
#### 二、Slope Trick 定义与特点 Slope Trick 主要针对一类特定的问题——即目标函数为凸函数的动态规划问题。这类问题的特点在于状态转移方程中含有绝对值或分段线性函数等复杂表达式。而Slope Trick 就是用来简化...
Python-trick,上传的事pdf文档
在ARP_trick.tar.gz这个压缩包中,我们可以预期包含有关如何执行和防御ARP欺骗的相关资料。可能包括了以下内容: 1. **ARP协议原理**:首先,理解ARP的工作机制至关重要。当主机需要发送数据到某个IP地址时,它会...
在机器学习中,核技巧(Kernel Trick)是一种非常重要的技术,它允许我们在高维特征空间中有效地进行线性学习算法的操作,而无需显式地计算出高维空间的数据表示。核技巧在诸如支持向量机(SVM)等算法中发挥了重要...
"Web 安全学习笔记" Web 安全学习笔记是关于网络安全的综合性学习笔记,涵盖了 Web 安全的基础知识、常见威胁、防御策略等方面的内容。下面将详细介绍该笔记中所涉及的知识点: 一、Web 安全基础 * Web 安全定义...
### 神经网络训练Trick详解 #### 引言 神经网络训练是深度学习领域的一个核心环节,其效果的好坏直接影响着模型的性能。在实际应用中,开发者经常会遇到模型训练不佳的情况,这时就需要一系列的技巧(Tricks)来...
Hat Trick是Unity官方商店提供的5.5.0版本以上的一款游戏Demo。
在Android开发中,"list_sticky_scroll_trick"是一个常见的UI设计技巧,它涉及到ListView的优化和用户体验提升。这个效果通常被称作“吸顶”或者“固定头部”效果,即当用户滚动列表时,某些特定的视图(如标题或...
db_trick.sql
Linux Shell技巧是Linux系统操作中的重要组成部分,它是一种命令行接口,允许用户通过文本命令与操作系统进行交互。Shell脚本可以极大地提高效率,自动化日常任务,并且是系统管理员的得力工具。...
二、Hattrick Ranking核心功能 1. 自定义排名:Hattrick Ranking允许玩家根据自己的需求设定排名标准,比如可以根据球队实力、历史战绩、青训营水平等多种因素进行排名,帮助玩家更好地理解各队的优势和弱点。 2. ...
由NASA约翰逊航天中心开发的Trick仿真环境是一个功能强大的仿真开发框架,使用户能够为航天器开发的所有阶段构建应用程序。 特里克(Trick)加快了仿真的创建过程,以进行早期飞行器设计,性能评估,飞行软件开发,...
### 二、内网环境切换 在开发过程中,有时需要切换至内网环境进行工作或测试。具体步骤如下: #### 2.1 内网切换步骤 - 删除代理设置。 - 配置网络接口: - `ifconfig eth0 10.10.10.224`: 设置eth0的IP地址为...
zoj 2247 Magic Trick.md
VDR-Hattrick是一款专为视频磁盘录像机(Video Disk Recorder, VDR)设计的开源插件。这款插件的出现,旨在为VDR用户提供一个独特的体验,即在观看电视节目的同时,能够实时查看在线足球游戏“Hattrick”的比赛情况...
为了处理非线性可分的情况,SVM引入了核技巧(kernel trick),使得原始数据能够在高维空间中变得线性可分。 **决策树**可以通过构建一棵树形结构来实现多分类问题。每一内部节点表示一个属性上的测试,每个分支代表...
### 机器学习个人笔记完整版v5 知识点概览 #### 一、课程概述与背景 **课程目标:** - **理解机器学习的概念:** 探讨计算机如何模仿人类学习行为,获取新知识或技能,从而提高自身性能。 - **掌握核心技能:** ...