[转]技巧和设计模式 --- 视图和布局

1.越简单越好

 

 

如果一个窗口包含很多视图

 

[1] 启动动时间长

 

[2] 测量时间长

 

[3] 布局时间长

 

[4] 绘制时间长

 

 

如果视图树深度太深

 

[1] StackOverflowException

 

[2] 用户界面反应速度很慢

 

2.解决的办法

 

 

[1] 使用TextView的复合drawables减少层次

 

 

[2] 使用ViewStub延迟展开视图

 

[3] 使用<merge>合并中间视图

 

[4] 使用RelativeLayout减少层次

 

[5] 使用自定义视图

 

[6] 使用自定义布局

 

关于[1]

 


[转]技巧和设计模式 --- 视图和布局_第1张图片
替代为

 


[转]技巧和设计模式 --- 视图和布局_第2张图片

 

关于[2] 使用ViewStub延迟展开视图

 


[转]技巧和设计模式 --- 视图和布局_第3张图片

首先在XML布局文件中定义 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"/>

 

 

在需要展开视图时

 

 

findViewById(R.id.stub_import).setVisibility(View.VISIBLE);
// 或者
View importPanel = ((ViewStub)
findViewById(R.id.stub_import)).inflate();
 

 

展开之后变成

 


[转]技巧和设计模式 --- 视图和布局_第4张图片

 

关于[3]使用<merge>合并视图:略

 

关于[4]使用RelativeLayout减少层次,总得意思就是用RelativeLayout解决复杂的布局,比如代替LinearLayout复杂的布局

 

关于[5]自定义视图

 

 

class CustomView extends View {
    @Override
    protected void onDraw(Canvas canvas) {
        // 加入你的绘图编码
   }
    @Override
    protected void onMeasure(int widthMeasureSpec,
    int heightMeasureSpec) {
        // 计算视图的尺寸
        setMeasuredDimension(widthSpecSize, heightSpecSize);
    }
}

 

 

关于[6]自定义布局

 

 

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);
          }
        }
     }
}
 

 

你可能感兴趣的:(设计模式)