如何
自定义View
好处:特殊的效果,满足个性的需求
流程:
1) 创建一个类,继承View或它的子类
2) 添加构造方法
一个参数:在代码中创建对象
两个参数:在布局文件中使用
3) 重写onDraw()方法 一个矩形区域,画布Canvas 画笔Paint
设置画笔属性
// 创建画笔
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setAntiAlias(true);
paint.setTextSize(30);
4) 使用canvas绘制
例如:canvas.rotate(90);
canvas.drawText("VerticalTextView", 20, 0, paint);
好处:特殊的效果,满足个性的需求
流程:
1) 创建一个类,继承View或它的子类
2) 添加构造方法
一个参数:在代码中创建对象
两个参数:在布局文件中使用
3) 重写onDraw()方法 一个矩形区域,画布Canvas 画笔Paint
设置画笔属性
// 创建画笔
Paint paint = new Paint();
paint.setColor(Color.RED);
paint.setAntiAlias(true);
paint.setTextSize(30);
4) 使用canvas绘制
例如:canvas.rotate(90);
canvas.drawText("VerticalTextView", 20, 0, paint);
如何使用自定义控件
在布局文件中拖拽自定义控件
自定义控件属性的步骤:
1) 在values目录中创建attrs.xml
(从ApiDemos中拷贝)
2) 定义属性
例如:
<declare-styleable name="VerticalTextView">
<attr name="content" format="string" />
3) 在自定义控件代码中读取布局中配置的属性,进行设置
参考ApiDemos中的LabelView
使用自定义属性:
1) 在布局文件中添加自定义控件的命名空间
例如: xmlns:yuchen="http://schemas.android.com/apk/res/org.yuchen.templete"
2) 配置属性,例如:yuchen:content="sdf"
动态:
1) 修改重新绘制的内容
2) 触发系统重新调用onDraw()方法
调用invalidate()方法
例如:
01.
// 动态自定义控件
02.
postDelayed(
new
Runnable()
03.
{
04.
@Override
05.
public
void
run()
06.
{
07.
text =
new
Date().toLocaleString();
08.
invalidate();
09.
postDelayed(
this
,
1000
);
10.
}
11.
},
1000
);
运行效果如下:(动态生成)
代码如下:
01.
public
class
Mytextview
extends
View
02.
{
03.
String content =
"abc"
;
04.
private
int
color;
05.
private
float
dimension;
06.
private
Paint paint;
07.
public
Mytextview(Context context)
08.
{
//一个参数的构造方法,适用在,代码中new自定义的view类
09.
super
(context);
10.
}
11.
public
Mytextview(Context context, AttributeSet attrs)
12.
{
//两个参数的构造方法,适用在,使用布局xml里拖拉自定义的控件方法
13.
//
14.
super
(context, attrs);
15.
Log.e(
"Mytextview"
,
"Mytextview(2)"
);
16.
// 读取控件里使用的属性attrs
17.
TypedArray a = context.obtainStyledAttributes(attrs,
18.
R.styleable.mytextview);
19.
CharSequence s = a.getString(R.styleable.mytextview_text);
//静态读取自定义控件的文字内容
20.
color = a.getColor(R.styleable.mytextview_textColor, Color.BLACK);
21.
dimension = a.getDimension(R.styleable.mytextview_textSize,
20
);
22.
// if (s != null) {
23.
// content = s.toString();
24.
// }
25.
postDelayed(
new
Runnable()
26.
{
27.
// 动态获得自定义控件的文字内容
28.
@Override
29.
public
void
run()
30.
{
31.
content =
new
Date().toLocaleString();
32.
invalidate();
//调用ondraw()方法,重绘
33.
postDelayed(
this
,
1000
);
34.
}
35.
},
1000
);
36.
}
37.
@Override
38.
protected
void
onDraw(Canvas canvas)
39.
{
//canvas画布
40.
super
.onDraw(canvas);
41.
Log.e(
"onDraw"
,
"onDraw"
);
42.
paint =
new
Paint();
43.
paint.setColor(color);
44.
paint.setTextSize(dimension);
45.
paint.setAntiAlias(
true
);
//消除锯齿
46.
canvas.rotate(
90
);
//画布旋转90度
47.
canvas.drawText(content ,
60
, -
60
, paint);
//画文本
48.
}
49.
}
50.
public
class
Mytextview
extends
View
51.
{
52.
String content =
"abc"
;
53.
private
int
color;
54.
private
float
dimension;
55.
private
Paint paint;
56.
public
Mytextview(Context context)
57.
{
//一个参数的构造方法,适用在,代码中new自定义的view类
58.
super
(context);
59.
}
60.
public
Mytextview(Context context, AttributeSet attrs)
61.
{
//两个参数的构造方法,适用在,使用布局xml里拖拉自定义的控件方法
62.
//
63.
super
(context, attrs);
64.
Log.e(
"Mytextview"
,
"Mytextview(2)"
);
65.
// 读取控件里使用的属性attrs
66.
TypedArray a = context.obtainStyledAttributes(attrs,
67.
R.styleable.mytextview);
68.
CharSequence s = a.getString(R.styleable.mytextview_text);
//静态读取自定义控件的文字内容
69.
color = a.getColor(R.styleable.mytextview_textColor, Color.BLACK);
70.
dimension = a.getDimension(R.styleable.mytextview_textSize,
20
);
71.
// if (s != null) {
72.
// content = s.toString();
73.
// }
74.
postDelayed(
new
Runnable()
75.
{
76.
// 动态获得自定义控件的文字内容
77.
@Override
78.
public
void
run()
79.
{
80.
content =
new
Date().toLocaleString();
81.
invalidate();
//调用ondraw()方法,重绘
82.
postDelayed(
this
,
1000
);
83.
}
84.
},
1000
);
85.
}
86.
@Override
87.
protected
void
onDraw(Canvas canvas)
88.
{
89.
super
.onDraw(canvas);
90.
paint =
new
Paint();
91.
paint.setColor(color);
92.
paint.setTextSize(dimension);
93.
paint.setAntiAlias(
true
);
//消除锯齿
94.
canvas.rotate(
90
);
//画布旋转90度
95.
canvas.drawText(content ,
60
, -
60
, paint);
//画文本
96.
}
97.
}