01.6 精通自定义 View 之绘图基础——控件的使用方法

返回自定义 View 目录

1.6.1 控件概述

在自定义一个派生自 View 或 ViewGroup 类的控件时,必须实现一个构造函数。有三个构造函数供我们选择。

1
2
3
4
5
6
7
8
9
10
11
public class CustomView extends View {
public CustomView(Context context) {
super(context);
}
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CustomView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
}

其实每种构造函数都是在特定的使用情景下所必须实现的,否则将会报 inflate 错误。

1.6.2 通过 XML 引入控件

使用以下方式引入控件:

1
2
3
4
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout ...>
<com.xxt.xtest.CustomView ... />
</LinearLayout>

就必须实现第二个构造函数:

1
2
3
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
}

1.6.3 动态添加控件

1. 概述

示例如下:

1
2
3
4
5
6
LinearLayout rootView = (LinearLayout)findViewById(R.id.root);
CustomView customView = new CustomView(this);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams (
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
rootView.addView(customView,layoutParams);

2. LayoutParams

1
2
3
4
5
// 第一个构造函数常用
public LayoutParams(int width, int height)
// 用于从 AttributeSet 中取出 layout_width、 layout_height 等各属性的值
public LayoutParams(Context c, AttributeSet attrs)
public LayoutParams(LayoutParams source)

每个容器类控件都会实现一套 LayoutParams 类,而子类则用的是父容器的 LayoutParams 类。比如上述中父容器是 LinearLayout,所以使用 LinearLayout.LayoutParams。之所以不能共用,是因为各个容器所对应的布局属性是不一样的。

在 RelativeLayout 中,实现添加到 TextView 控件的右侧:addRule()

1
2
3
4
5
6
7
RelativeLayout rootView = (RelativeLayout) findViewById(R.id.root);
CustomView customView = new CustomView(this);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,
RelativeLayout.LayoutParams.MATCH_ PARENT);
layoutParams.addRule(RelativeLayout.RIGHT_OF,R.id.text);
rootView.addView(customView, layoutParams);

1)设置 margin

1
2
3
4
5
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout. LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
lp.setMargins(10, 20, 30, 40);
imageView.setLayoutParams(lp);

2)设置 layout_weight (方法一)

1
2
3
4
5
6
7
8
TextView tv_like = new TextView(this);
LinearLayout.LayoutParams LP_LIKE_MW = new LinearLayout.LayoutParams (
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.WRAP_ CONTENT,
1.0f);
tv_like.setText("赞(8)");
tv_like.setTextSize(16);
layout_sub_Lin.addView(tv_like, LP_LIKE_MW);

3)设置 layout_weight (方法二)

1
2
3
4
5
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_ PARENT);
layoutParams.weight = 1.0f;
rootView.addView(customView, layoutParams);

4)设置 layout_gravity

1
2
3
4
5
6
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_ PARENT);
params.gravity = Gravity.TOP;
Button button = new Button(this);
rootView.addView(button, layoutParams);

5)设置 android:gravity

1
2
3
4
5
6
7
8
9
10
11
RelativeLayout rootView = (RelativeLayout) findViewById(R.id.root);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
200);
layoutParams.addRule(RelativeLayout.RIGHT_OF, R.id.text);
Button button = new Button(this);
button.setGravity(Gravity.TOP);
button.setText("btn");
rootView.addView(button, layoutParams);
rootView.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL);

3. addView

动态添加控件都是通过 addView 来实现的,addView 是 ViewGroup 类中的一个函数,它有 5 个构造函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 在节点末尾添加一个 View 控件,布局使用默认布局
// layout_width = wrap_content、layout_height = wrap_content
public void addView(View child)
// 在指定位置添加一个 View 控件,index 的取值有-1、0 和正数。
// -1:表示在末尾添加一个 View 控件
// 0:表示在容器顶端添加一个 View 控件
// 正数:表示在对应的索引位置插入一个 View 控件
public void addView(View child, int index)
// 使用自定义自定义布局参数,在节点末尾添加一个 View 控件
public void addView(View child, LayoutParams params)
// 使用自定义自定义布局参数,在指定位置添加一个 View 控件
public void addView(View child, int index, LayoutParams params)
// 只指定宽和高
public void addView(View child, int width, int height)