Android 布局Layout 性能优化<8>
来源:互联网 发布:淘宝标题规避品牌 编辑:程序博客网 时间:2024/06/14 03:18
这个是个老话题了,前面有一些提及过了,专家的建议如下:
提升布局性能的关键点是尽量保持布局层级的扁平化,避免出现重复的嵌套布局。例如下面的例子,有2行显示相同内容的视图,分别用两种不同的写法来实现,他们有着不同的层级
当然还的知道为什么需要这样调整:
Android需要把XML布局文件转换成GPU能够识别并绘制的对象。这个操作是在DisplayList的帮助下完成的。DisplayList持有所有将要交给GPU绘制到屏幕上的数据信息。在某个View第一次需要被渲染时,Display List会因此被创建,当这个View要显示到屏幕上时,我们会执行GPU的绘制指令来进行渲染请注意:任何时候View中的绘制内容发生变化时,都会需要重新创建DisplayList,渲染DisplayList,更新到屏幕上等一系列操作。这个流程的表现性能取决于你的View的复杂程度,View的状态变化以及渲染管道的执行性能。举个例子,假设某个Button的大小需要增大到目前的两倍,在增大Button大小之前,需要通过父View重新计算并摆放其他子View的位置。修改View的大小会触发整个HierarcyView的重新计算大小的操作。如果是修改View的位置则会触发HierarchView重新计算其他View的位置。如果布局很复杂,这就会很容易导致严重的性能问题。
现在android 设备的Hierarchy Viewer这个东东对一般的开发者好像已经不能够使用了,不过手机产商那些开发者是没有问题的.
废话不多说,新建Android 工程.
<1> : 新建Android 工程如下:
<2> 具体程序如下:
DurianMainActivity.java
package org.durian.durianlayoutperfect;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.view.Menu;import android.view.MenuItem;import android.widget.ListView;import org.durian.durianlayoutperfect.adapter.DurianBaseAdapter;public class DurianMainActivity extends ActionBarActivity { private ListView listView; private DurianBaseAdapter mDurianBaseAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.durian_main); listView=(ListView)findViewById(android.R.id.list); mDurianBaseAdapter=new DurianBaseAdapter(this); listView.setAdapter(mDurianBaseAdapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_durian_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); }}
DurianBaseAdapter.java
package org.durian.durianlayoutperfect.adapter;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.TextView;import org.durian.durianlayoutperfect.R;/** * Project name : DurianLayoutPerfect * Created by zhibao.liu on 2016/1/11. * Time : 18:26 * Email warden_sprite@foxmail.com * Action : durian */public class DurianBaseAdapter extends BaseAdapter { private Context mContext; private LayoutInflater mInflater; private ViewHolder holder; public DurianBaseAdapter(Context context){ mContext=context; mInflater= LayoutInflater.from(mContext); holder=new ViewHolder(); } @Override public int getCount() { return 10; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public View getView(int position, View convertView, ViewGroup parent) { if(convertView==null) { convertView=mInflater.inflate(R.layout.durian_relate_list_item,null);// convertView=mInflater.inflate(R.layout.durian_list_item,null); holder.imageView=(ImageView) convertView.findViewById(R.id.image); holder.titleText=(TextView)convertView.findViewById(R.id.title); holder.summaryText=(TextView)convertView.findViewById(R.id.summary); } return convertView; } private class ViewHolder{ ImageView imageView; TextView titleText; TextView summaryText; }}durian_main.xml<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="org.durian.durianlayoutperfect.DurianMainActivity"> <ListView android:id="@android:id/list" android:layout_width="wrap_content" android:layout_height="wrap_content" /></RelativeLayout>durian_list_item.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="96dp" android:orientation="horizontal"> <ImageView android:id="@+id/image" android:layout_width="48dp" android:layout_height="48dp" android:layout_marginStart="16dp" android:layout_marginTop="8dp" android:src="@mipmap/ic_launcher" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="12dp" android:background="#fffffe" android:orientation="vertical"> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Title" android:textColor="#ff0000"/> <TextView android:id="@+id/info" android:layout_alignParentRight="true" android:paddingRight="32dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Information" android:textColor="#00ff00"/> </RelativeLayout> <TextView android:id="@+id/summary" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Summary : This behaves the same as save(), but in addition it allocates an offscreen bitmap" android:textColor="#0000ff"/> </LinearLayout></LinearLayout>durian_relate_list_item.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="96dp" android:orientation="horizontal"> <ImageView android:id="@+id/image" android:layout_width="48dp" android:layout_height="48dp" android:layout_marginStart="16dp" android:layout_marginTop="8dp" android:src="@mipmap/ic_launcher" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginTop="12dp" android:background="#fffffe" android:orientation="vertical"> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Title" android:textColor="#ff0000"/> <TextView android:id="@+id/info" android:layout_alignParentRight="true" android:paddingRight="32dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Information" android:textColor="#00ff00"/> </RelativeLayout> <TextView android:id="@+id/summary" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Summary : This behaves the same as save(), but in addition it allocates an offscreen bitmap" android:textColor="#0000ff"/> </LinearLayout></LinearLayout><3> : 运行结果:
无论在getView中替换哪一个布局,最终呈现的效果是一样的,但是性能会有差别的,这里加载的量不是很大,所以观察起来并不是很方便,而且还没有进行刷新,如果有刷新的时候,才会明显感觉到有差别.
0 0
- Android 布局Layout 性能优化<8>
- (android之layout)性能优化之布局优化
- Android性能优化(二),Layout布局优化
- Android layout布局的优化
- android布局性能优化
- android 布局性能优化
- android 布局性能优化
- Android性能优化-布局
- android 布局性能优化
- android布局性能优化
- Android性能优化--Layout优化篇
- Android性能优化---布局优化
- Android性能优化---布局优化
- android性能优化--布局优化
- Android性能优化-布局优化
- Android性能优化-布局优化
- Android性能优化-布局优化
- 【Android性能优化】布局的性能优化
- System.gc和System.runFinalization区别
- 特征检测器 FeatureDetector
- 约瑟夫环Joeph
- 唐纳德·霍尔《第三者》(节选)
- Unable to create project from archetype [org.apache.maven.archetypes:maven-archetype-quickstart:1.1]
- Android 布局Layout 性能优化<8>
- 声音中正弦波的提取--sinusoidal model
- RFC6551中文版:Routing Metrics Used for Path Calculation
- Fragment使用小结
- Python
- LR使用web_add_cookie函数进行cookie模拟
- 迭代法解方程:牛顿迭代法、Jacobi迭代法
- 为什么要设置Java环境变量
- 在Mac OS上安装Java以及配置环境变量的基本方法