UI使用及其优化

UI使用及其优化

Android开发推荐一文中代码撰写注意点的xml布局提到的xml布局的一些注意事项,今天将围绕展开说一下UI使用及其优化

避免黄色警告,过时方法不要用

xml布局中的黄色警告主要分为三类:方法过时;属性相关设置需提取;属性设置得全面(自己总结得,明白意思就行了)

  • 方法过时(过时方法会有横线穿过)

    单行显示

    1
    2
    3
    4
    5
    原先
    android:singleLine="true"
    现在
    android:maxLines="1"

过时方法如下

1
2
3
4
5
6
7
android:autoText="true"
android:capitalize="characters"
android:editable="true"
android:inputMethod="@string/app_name"
android:numeric="decimal"
android:password="true"
android:phoneNumber="true"
  • 属性相关设置需提取
1
2
3
4
5
6
错误写法
android:text="这是不行的"
正确写法
android:text="@string/app_name"
  • 属性设置得全面
1
2
3
android:layout_marginLeft="@dimen/dp1"
再加上这个
android:layout_marginStart="@dimen/dp1"

由此可以想到layout_marginRight、paddingLeft、paddingRight等

include的使用

include的体现最佳的地方就是actionbar的复用这块了,大部分app都会用到这个,其他模块的复用也要用这个,下面简单的举例

actionbar.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="@dimen/dp40"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout_actionbar"
android:orientation="horizontal">
<TextView
android:id="@+id/txt_title"
android:layout_width="match_parent"
android:layout_height="@dimen/dp40"
android:background="@color/main_color"
android:paddingLeft="@dimen/dp50"
android:paddingStart="@dimen/dp50"
android:paddingRight="@dimen/dp50"
android:paddingEnd="@dimen/dp50"
android:gravity="center"
android:singleLine="true"
android:textColor="@color/mffffff"
android:textSize="@dimen/first_size" />
<ImageView
android:id="@+id/img_left"
android:layout_width="@dimen/dp50"
android:layout_height="@dimen/dp40"
android:contentDescription="@null"
android:layout_centerVertical="true"
android:gravity="center"
android:scaleType="centerInside"
android:src="@mipmap/btn_return" />
<ImageView
android:id="@+id/img_right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:contentDescription="@null"
android:gravity="center"
android:layout_centerVertical="true"
android:layout_marginStart="@dimen/dp10"
android:layout_marginLeft="@dimen/dp10"
android:layout_marginRight="@dimen/dp10"
android:layout_marginEnd="@dimen/dp10"
android:background="@mipmap/message" />
<TextView
android:id="@+id/txt_right"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
tools:text="aaaa"
android:gravity="center"
android:paddingRight="@dimen/dp10"
android:paddingEnd="@dimen/dp10"
android:paddingLeft="@dimen/dp10"
android:paddingStart="@dimen/dp10"
android:visibility="gone"
style="@style/SecondSizeWhite"
/>
</RelativeLayout>

其他xml中使用

1
<include layout="@layout/actionbar" />

说到include,就应该来说说merge,merge标签主要是用来优化显示的,减少View树的层级

merge的使用

多用于替换FrameLayout或者当一个布局包含另一个时,标签消除视图层次结构中多余的视图组。例如你的主布局文件是垂直布局,引入了一个垂直布局的include,这是如果include布局使用的LinearLayout就没意义了,使用的话反而减慢你的UI表现。这时可以使用标签优化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/app_name"
/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/app_name"
/>
</merge>

viewstub的使用

ViewStub是View的子类,它不可见,大小为0,用来延迟加载布局资源

xml

1
2
3
4
5
6
<ViewStub
android:id="@+id/viewstub"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout="@layout/actionbar"
/>

java代码中

1
2
3
4
5
viewstub = (ViewStub) findViewById(R.id.viewstub);
if (viewstub != null) {
view1=viewstub.inflate();
}

避免布局嵌套过深;简单布局linearlayout,复杂布局relativelayout;有些效果多考虑自定义view是否能实现,别用view叠加实现

下面展示一个一样的效果的UI展示,不同写法,布局嵌套不一样,举例的是很简单的,再想想实际项目中,展示的效果负责的时候多去考虑考虑布局的嵌套,布局的优化有时候比代码的优化强很多哦

错误举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="@dimen/dp40"
android:gravity="center"
android:text="@string/app_name" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="100dp"
android:layout_height="@dimen/dp40"
android:gravity="center"
android:text="@string/app_name" />
<TextView
android:layout_width="match_parent"
android:layout_height="@dimen/dp40"
android:gravity="center"
android:text="@string/app_name" />
</LinearLayout>
</LinearLayout>

正确做法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/txt1"
android:layout_width="match_parent"
android:layout_height="@dimen/dp40"
android:gravity="center"
android:text="@string/app_name" />
<TextView
android:id="@+id/txt2"
android:layout_below="@+id/txt1"
android:layout_width="100dp"
android:layout_height="@dimen/dp40"
android:gravity="center"
android:text="@string/app_name" />
<TextView
android:id="@+id/txt3"
android:layout_below="@+id/txt1"
android:layout_width="match_parent"
android:layout_height="@dimen/dp40"
android:layout_toRightOf="@+id/txt2"
android:layout_toEndOf="@+id/txt2"
android:gravity="center"
android:text="@string/app_name" />
</RelativeLayout>

style的使用,减少代码量

styles.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<style name="TextStyle">
<item name="android:maxLines">1</item>
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">@dimen/dp40</item>
<item name="android:paddingLeft">@dimen/dp40</item>
<item name="android:paddingRight">@dimen/dp40</item>
<item name="android:textSize">16sp</item>
<item name="android:textColor">@color/colorAccent</item>
</style>
<style name="TextStyle2" parent="TextStyle">
<item name="android:gravity">center</item>
</style>

xml中的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
tools:context="com.androidui.StyleActivity">
<TextView
style="@style/TextStyle"
android:text="@string/app_name" />
<TextView
style="@style/TextStyle"
android:text="@string/app_name" />
<TextView
style="@style/TextStyle"
android:text="@string/app_name" />
<TextView
style="@style/TextStyle"
android:text="@string/app_name" />
<TextView
style="@style/TextStyle"
android:text="@string/app_name" />
<TextView
style="@style/TextStyle"
android:text="@string/app_name" />
<TextView
style="@style/TextStyle2"
android:text="@string/app_name" />
</LinearLayout>

weight的合理使用

就是能用其他属性能达到的效果千万别用这个

margain和padding合理比较进行选择使用

相同效果,设置padding的触摸区域大一些,UE更好一些

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<TextView
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/ceshi"
android:paddingLeft="@dimen/dp40"
android:paddingStart="@dimen/dp40"
android:paddingRight="0dp"
android:paddingEnd="0dp"
/>
<TextView
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/ceshi"
android:layout_marginStart="@dimen/dp40"
android:layout_marginLeft="@dimen/dp40"
/>

最新的布局方式ConstaintLayout的使用

ConstaintLayout这个布局已经出来很久了,一直不火,使用上还是感觉有点繁琐,有兴趣的可以去参考Android新特性介绍,ConstraintLayout完全解析

以上仅是自己的一些见解,如果有好的欢迎留言,UI优化还是很需要的,实际项目中会比较繁琐,使用控件时多考虑考虑

UI使用及其优化 github demo地址

坚持原创技术分享,您的支持将鼓励我继续创作!
Fork me on GitHub