如何将你的Android使用界面更快和更高效益

上传人:蜀歌 文档编号:148833929 上传时间:2020-10-23 格式:PDF 页数:57 大小:1.19MB
返回 下载 相关 举报
如何将你的Android使用界面更快和更高效益_第1页
第1页 / 共57页
如何将你的Android使用界面更快和更高效益_第2页
第2页 / 共57页
如何将你的Android使用界面更快和更高效益_第3页
第3页 / 共57页
如何将你的Android使用界面更快和更高效益_第4页
第4页 / 共57页
如何将你的Android使用界面更快和更高效益_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《如何将你的Android使用界面更快和更高效益》由会员分享,可在线阅读,更多相关《如何将你的Android使用界面更快和更高效益(57页珍藏版)》请在金锄头文库上搜索。

1、 Android 用户界面编程技巧 Grace Kloba 2009.06.05 技巧和设计模式 如何使用 Adapter 背景和图像 更新请求 视图和布局 内存分配 技巧和设计模式 如何使用 Adapter 背景和图像 更新请求 视图和布局 内存分配 Adapter Adapter 是 ListView 和数据源之间的中间人 Adapter 当每条数据进入可见区时 Adapter 的 getView() 会被调用 返回代表具体数据的视图 触摸滚动时, 频繁调用 支持成百上千条数据 Adapter 剖析ListView Item 1 Item 2 Item 3 Item 4 Item 5 It

2、em 6 Item 7 Adapter 剖析ListView Item 1 Item 2 Item 3 Item 4 Item 5 Item 6 Item 7 Adapter 剖析ListView Item 1 Item 2 Item 3 Item 4 Item 5 Item 6 Item 7 Adapter 剖析ListView Item 1 Item 2 Item 3 Item 4 Item 5 Item 6 Item 7 Adapter 剖析ListView Item 2 Item 3 Item 4 Item 5 Item 6 Item 7 Item 1 Adapter 剖析ListVi

3、ew Item 2 Item 3 Item 4 Item 5 Item 6 Item 7 Item 8 Adapter 剖析ListView Item 2 Item 3 Item 4 Item 5 Item 6 Item 7 Item 8 Adapter 显示每条数据的 XML 布局文件 Adapter public View getView(int pos, View convertView, ViewGroup parent) View item = mInflater.inflate(R.layout.list_item, null); (TextView) item.findViewB

4、yId(R.id.text). setText(DATApos); (ImageView) item.findViewButId(R.id.icon). setImageBitmap(pos return item; 最简单的方法, 最慢最不实用 Adapter public View getView(int pos, View convertView, ViewGroup parent) if (convertView = null) convertView = mInflater.inflate( R.layout.list_item, null); (TextView) convertV

5、iew.findViewById(R.id.text). setText(DATApos); (ImageView) convertView.findViewButId(R.id.icon). setImageBitmap(pos return convertView; 利用 convertView 回收视图, 效率提高 200% Adapter static class ViewHolder TextView text; ImageView icon; 使用 ViewHolder 模式, 效率再提高 50% Adapter public View getView(int pos, View

6、convertView, ViewGroup parent) ViewHolder holder; if (convertView = null) convertView = mInflater.inflate(R.layout.list_item, null); holder = new ViewHolder(); holder.text = (TextView) convertView.findViewById( R.id.text); holder.icon = (ImageView) convertView.findViewButId( R.id.icon); convertView.

7、setTag(holder); else holder = (ViewHolder) convertView.getTag(); holder.text.setText(DATApos); holder.icon.setImageBitmap(pos return convertView; 使用 ViewHolder 模式, 效率再提高 50% Adapter 更新率比较 技巧和设计模式 如何使用 Adapter 背景和图像 更新请求 视图和布局 内存分配 背景和图像 视图背景图像总会填充整个视图区域 图像尺寸不合适会导致自动缩放 避免实时缩放 最好预先缩放到视图大小 选择恰当的图像尺寸 or

8、iginalImage = Bitmap.createScaledBitmap( originalImage, / 被缩放图像 view.getWidth(), / 视图宽度 view.getHeight(), / 视图高度 true); / 双线性过滤器 背景和图像 更新率比较 背景和图像 默认情况下, 窗口有一个不透明的背景 有时可以不需要 最高层的视图是不透明的 最高层的视图覆盖整个窗口 layout_width = fill_parent layout_height = fill_parent 更新看不见的背景是浪费时间 窗口背景 背景和图像 方法一:修改编码 删除窗口背景 Overr

9、ide public void onCreate(Bundle icicle) super.onCreate(icicle); setContentView(R.layout.mainview); / 删除窗口背景 getWindow().setBackgroundDrawable(null); . 方法二:修改 XML 声明 首先确定你的 res/values/styles.xml 有 背景和图像 删除窗口背景 null . 然后编辑 AndroidManifest.xml 背景和图像 更新率比较 技巧和设计模式 如何使用 Adapter 背景和图像 更新请求 视图和布局 内存分配 更新请求

10、 当屏幕需要更新时, 调用 invalidate() 简单方便 但会更新整个视图, 太贵了 最好先找到无效区域, 然后调用 invalidate(Rect dirty); invalidate(int left, int top, int right, int bottom); 最简单的编码在每次响应移动事件时调用 invalidate() 更新请求 应用实例:在屏幕上触摸移动小图标 更有效的执行方法是只更新需要更新的区域 更新请求 应用实例:在屏幕上触摸移动小图标 更新请求 更新率比较 技巧和设计模式 如何使用 Adapter 背景和图像 更新请求 视图和布局 内存分配 视图和布局 如果一个

11、窗口包含很多视图 启动时间长 测量时间长 布局时间长 绘制时间长 如果视图树深度太深 StackOverflowException 用户界面反应速度很慢 越简单越好 视图和布局 使用 TextView 的复合 drawables 减少层次 使用 ViewStub 延迟展开视图 使用 合并中间视图 使用 RelativeLayout 减少层次 使用自定义视图 使用自定义布局 解决方法 视图和布局 使用 TextView 的复合 drawables 减少层次 视图和布局 使用 TextView 的复合 drawables 减少层次 视图和布局 使用 ViewStub 延迟展开视图 视图和布局 使用

12、 ViewStub 延迟展开视图 findViewById(R.id.stub_import).setVisibility(View.VISIBLE); / 或者 View importPanel = (ViewStub) findViewById(R.id.stub_import).inflate(); 首先在 XML 布局文件中定义 ViewStub 在需要展开视图时 视图和布局 使用 ViewStub 延迟展开视图 视图和布局 使用 合并视图 视图和布局 使用 合并视图 默认情况下, 布局文件的根作为一个结点加 入到父视图中 如果使用 可以避免根接点 视图和布局 使用 合并视图 视图和布

13、局 很有功效 可以代替 LinearLayout 可以在水平 LinearLayout 中加入垂直 LinearLayout 反过来也可以 可以用单层次表达复杂布局 使用 RelativeLayout 减少层次 视图和布局 使用 RelativeLayout 减少层次 视图和布局 使用 RelativeLayout 减少层次 视图和布局 自定义视图 视图和布局 自定义视图 class CustomView extends View Override protected void onDraw(Canvas canvas) / 加入你的 绘图编码 Override protected void

14、onMeasure(int widthMeasureSpec, int heightMeasureSpec) / 计算视图的尺寸 setMeasuredDimension(widthSpecSize, heightSpecSize); 视图和布局 自定义布局 视图和布局 自定义布局 class GridLayout extends ViewGroup Override protected void onLayout(boolean changed, int l, int t, int r, int b) final int count = getChildCount(); for (int i

15、=0; i count; i+) final View child = getChildAt(i); if (child.getVisibility() != GONE) / 计算子视图的位置 child.layout(left, top, right, bottom); 技巧和设计模式 如何使用 Adapter 背景和图像 更新请求 视图和布局 内存分配 在性能敏感的代码里, 尽量避免创建 Java 对象 测量: onMeasure() 布局: onLayout() 绘图: dispatchDraw(), onDraw() 事件处理: dispatchTouchEvent(), onTouchEvent() Adapter: getView(), bindView() GC, 垃圾回收 整个程

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

当前位置:首页 > 商业/管理/HR > 经营企划

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