资源预览内容
第1页 / 共57页
第2页 / 共57页
第3页 / 共57页
第4页 / 共57页
第5页 / 共57页
第6页 / 共57页
第7页 / 共57页
第8页 / 共57页
第9页 / 共57页
第10页 / 共57页
亲,该文档总共57页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
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 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 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 剖析ListView 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.findViewById(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) convertView.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 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.setTag(holder); else holder = (ViewHolder) convertView.getTag(); holder.text.setText(DATApos); holder.icon.setImageBitmap(pos return convertView; 使用 ViewHolder 模式, 效率再提高 50% Adapter 更新率比较 技巧和设计模式 如何使用 Adapter 背景和图像 更新请求 视图和布局 内存分配 背景和图像 视图背景图像总会填充整个视图区域 图像尺寸不合适会导致自动缩放 避免实时缩放 最好预先缩放到视图大小 选择恰当的图像尺寸 originalImage = Bitmap.createScaledBitmap( originalImage, / 被缩放图像 view.getWidth(), / 视图宽度 view.getHeight(), / 视图高度 true); / 双线性过滤器 背景和图像 更新率比较 背景和图像 默认情况下, 窗口有一个不透明的背景 有时可以不需要 最高层的视图是不透明的 最高层的视图覆盖整个窗口 layout_width = fill_parent layout_height = fill_parent 更新看不见的背景是浪费时间 窗口背景 背景和图像 方法一:修改编码 删除窗口背景 Override public void onCreate(Bundle icicle) super.onCreate(icicle); setContentView(R.layout.mainview); / 删除窗口背景 getWindow().setBackgroundDrawable(null); . 方法二:修改 XML 声明 首先确定你的 res/values/styles.xml 有 背景和图像 删除窗口背景 null . 然后编辑 AndroidManifest.xml 背景和图像 更新率比较 技巧和设计模式 如何使用 Adapter 背景和图像 更新请求 视图和布局 内存分配 更新请求 当屏幕需要更新时, 调用 invalidate() 简单方便 但会更新整个视图, 太贵了 最好先找到无效区域, 然后调用 invalidate(Rect dirty); invalidate(int left, int top, int right, int bottom); 最简单的编码在每次响应移动事件时调用 invalidate() 更新请求 应用实例:在屏幕上触摸移动小图标 更有效的执行方法是只更新需要更新的区域 更新请求 应用实例:在屏幕上触摸移动小图标 更新请求 更新率比较 技巧和设计模式 如何使用 Adapter 背景和图像 更新请求 视图和布局 内存分配 视图和布局 如果一个窗口包含很多视图 启动时间长 测量时间长 布局时间长 绘制时间长 如果视图树深度太深 StackOverflowException 用户界面反应速度很慢 越简单越好 视图和布局 使用 TextView 的复合 drawables 减少层次 使用 ViewStub 延迟展开视图 使用 合并中间视图 使用 RelativeLayout 减少层次 使用自定义视图 使用自定义布局 解决方法 视图和布局 使用 TextView 的复合 drawables 减少层次 视图和布局 使用 TextView 的复合 drawables 减少层次 视图和布局 使用 ViewStub 延迟展开视图 视图和布局 使用 ViewStub 延迟展开视图 findViewById(R.id.stub_import).setVisibility(View.VISIBLE); / 或者 View importPanel = (ViewStub) findViewById(R.id.stub_import).inflate(); 首先在 XML 布局文件中定义 ViewStub 在需要展开视图时 视图和布局 使用 ViewStub 延迟展开视图 视图和布局 使用 合并视图 视图和布局 使用 合并视图 默认情况下, 布局文件的根作为一个结点加 入到父视图中 如果使用 可以避免根接点 视图和布局 使用 合并视图 视图和布局 很有功效 可以代替 LinearLayout 可以在水平 LinearLayout 中加入垂直 LinearLayout 反过来也可以 可以用单层次表达复杂布局 使用 RelativeLayout 减少层次 视图和布局 使用 RelativeLayout 减少层次 视图和布局 使用 RelativeLayout 减少层次 视图和布局 自定义视图 视图和布局 自定义视图 class CustomView extends View Override protected void onDraw(Canvas canvas) / 加入你的 绘图编码 Override protected void 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=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, 垃圾回收 整个程
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号