Android性能优化一:布局优化

减少嵌套,尽量保持布局层级的扁平化

  1. 在不影响层级深度的情况下,使用LinearLayout而不是RelativeLayout。因为RelativeLayout会让子View调用2次onMeasure,LinearLayout 在有weight时,才会让子View调用2次onMeasure。Measure的耗时越长那么绘制效率就低。
  2. 如果非要是嵌套,那么尽量避免RelativeLayout嵌套RelativeLayout。这简直就是恶性循环,丧心病狂。

  • 重用< include/>
使用<merge>代替FrameLayout

<?xml version="1.0" encoding="utf-8"?>
<merge
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:paddingLeft="15dp"
        android:paddingRight="15dp"
        android:src="@mipmap/nav_retur"/>

    <TextView
        android:id="@+id/tvname"
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_centerInParent="true"
        android:layout_gravity="center_horizontal"
        android:gravity="center"
        android:text="标题"
        android:textSize="18sp"
        />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_alignParentRight="true"
        android:layout_gravity="right"
        android:gravity="center"
        android:paddingLeft="15dp"
        android:paddingRight="15dp"
        android:text="确定"
        android:textSize="16sp"
        />
</merge>
<?xml version="1.0" encoding="utf-8"?>
<merge
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <include
        android:id="@+id/title"
        layout="@layout/title_bar"
        />
</merge>
  • 效果如下:

这里写图片描述

用TextView同时显示图片和文字

  1. 同时利用代码setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom)可以让我们动态去设置图片。
<?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="match_parent"
    android:orientation="vertical"
    >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_marginTop="10dp"
        android:drawableLeft="@mipmap/marketing_shop" 
        android:drawablePadding="10dp" 
        android:drawableRight="@mipmap/into"
        android:gravity="center_vertical"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:text="营销手段"
        android:textSize="18sp"/>

</LinearLayout>
  • 效果如下 :

这里写图片描述

使用TextView的行间距,代替多个TextView

  1. lineSpacingExtra属性代表的是行间距,他默认是0,是一个绝对高度值。
  2. lineSpacingMultiplier属性,它代表行间距倍数,默认为1.0f,是一个相对高度值。
  3. 当然了这两条属性可以同时使用,查看源码可以知道,他们的高度计算规则为mTextPaint.getFontMetricsInt(null) * 行间距倍数 + 行间距。
<?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="100dp"
    >

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:paddingLeft="15dp"
        android:paddingRight="15dp"
        android:src="@mipmap/marketing_shop"/>

    <TextView
        android:id="@+id/tvname"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        android:lineSpacingMultiplier="1.2"
        android:text="用  户  名 :  xxx\n电话号码 :  010-57110000 \n地        址 :  朝阳区景芳路、\n登录时间 :  2016-11-11"
        android:textSize="14sp"
        />

</LinearLayout>
  • 效果如下 :

这里写图片描述

使用Spannable或Html.fromHtm 对文字进行设置

  1. Spannable的使用
布局文件:

<?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="50dp"
    android:orientation="vertical"
    >

     <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="oo"
        />

</LinearLayout>
  • 代码实现(一)
public class MainActivity extends Activity {

    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tv = (TextView) findViewById(R.id.tv);
        /**
         * 创建一个对象
         */
        SpannableString sp = new SpannableString("淘宝链接,高亮显示:高亮1,高亮2,斜体,下划线");

        /**
         * 设置超链接
         */
        sp.setSpan(new URLSpan("http://taobao.com"), 0, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        /**
         * 设置高亮样式1
         */
        sp.setSpan(new BackgroundColorSpan(Color.RED), 10, 13, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        /**
         * 设置高亮样式2
         */
        sp.setSpan(new ForegroundColorSpan(Color.BLUE), 14, 18, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        /**
         * 设置斜体加粗
         */
        sp.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 18, 21, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        /**
         * 设置下划线
         */
        sp.setSpan(new UnderlineSpan(), 21, 24, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        /**
         * SpannableString对象设置给text
         */
        tv.setText(sp);
        /**
         * 设置text中的超链接可点击
         */
        tv.setMovementMethod(LinkMovementMethod.getInstance());
    }
}

效果如下:

这里写图片描述

  • 代码实现(二)
这里写代码片

  1. Html.fromHtm的使用
这里写代码片

用LinearLayout自带的分割线

  1. showDividers 是分隔线的显示位置,beginning、middle、end分别代表显示在开始位置,中间,末尾。
  2. 还有dividerPadding属性这里没有用到,意思很明确给divider添加padding。感兴趣可以试试。
<?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="match_parent"
    android:divider="@drawable/line"  // 线的颜色
    android:orientation="vertical"
    android:showDividers="middle"  //显示的位置
    >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:drawableLeft="@mipmap/marketing_shop"
        android:drawablePadding="10dp"
        android:drawableRight="@mipmap/into"
        android:gravity="center_vertical"
        android:paddingLeft="10dp"
        android:text="关于我们"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:drawableLeft="@mipmap/marketing_shop"
        android:drawablePadding="10dp"
        android:drawableRight="@mipmap/into"
        android:gravity="center_vertical"
        android:paddingLeft="10dp"
        android:text="版本更新"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:drawableLeft="@mipmap/marketing_shop"
        android:drawablePadding="10dp"
        android:drawableRight="@mipmap/into"
        android:gravity="center_vertical"
        android:paddingLeft="10dp"
        android:text="退出账号"/>

</LinearLayout>
 line.xml文件--线

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">

    <solid android:color="#dbdbdb"/>
    <size
        android:width="1px"
        android:height="1px"/>

</shape>

效果如下 :

这里写图片描述

Space控件:

还是接着上面的例子,如果要给条目中间添加间距,怎么实现呢?
1. 添加一个高10dp的View
2. 使用android:layout_marginTop=”10dp”等方法。但是增加View违背了我们的初衷,并且影响性能。使用过多的margin其实会影响代码的可读性。
3. 你就可以使用Space,他是一个轻量级的。

<?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="match_parent"
    android:divider="@drawable/line"
    android:orientation="vertical"
    android:showDividers="middle|end|beginning"
    >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:drawableLeft="@mipmap/marketing_shop"
        android:drawablePadding="10dp"
        android:drawableRight="@mipmap/into"
        android:gravity="center_vertical"
        android:paddingLeft="10dp"
        android:text="关于我们"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:drawableLeft="@mipmap/marketing_shop"
        android:drawablePadding="10dp"
        android:drawableRight="@mipmap/into"
        android:gravity="center_vertical"
        android:paddingLeft="10dp"
        android:text="版本更新"/>

    <Space
        android:layout_width="match_parent"
        android:layout_height="20dp"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:drawableLeft="@mipmap/marketing_shop"
        android:drawablePadding="10dp"
        android:drawableRight="@mipmap/into"
        android:gravity="center_vertical"
        android:paddingLeft="10dp"
        android:text="退出账号"/>

</LinearLayout>

效果如下 :

这里写图片描述

按需载入ViewStub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值