Android虽然自带了很多控件,但有时仍然不能满足需求,这时就需要我们自己定义控件。本文自己定义了一个控件,单击该控件,可以使控件绘制不同的几何图形。
首先,新建一个Android工程,并新建一个类,继承自View。
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
|
package
com.hzhi.customview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;
public
class CustomView extends
View{
// 图形类型
int
ss= 0 ;
// 构造函数
public
CustomView(Context context, AttributeSet attrs) {
super (context, attrs);
}
// onDraw函数
public
void onDraw(Canvas c){
super .onDraw(c);
Paint p = new
Paint();
p.setColor(Color.GREEN);
p.setStrokeWidth( 10 );
switch
(ss){
// 画圆形
case
0 :
c.drawCircle( 200 , 200 , 100 , p);
break ;
// 画矩形
case
1 :
c.drawRect( 60 , 90 , 360 , 300 , p);
break ;
// 画三角形
case
2 :
Path path = new
Path();
path.moveTo( 80 , 100 );
path.lineTo( 420 , 250 );
path.lineTo( 80 , 350 );
path.close();
c.drawPath(path, p);
break ;
default :
break ;
}
}
public
void changeStyle(){
ss++;
if
(ss> 2 ){
ss= 0 ;
}
}
} |
该类就是我们自己定义的控件类,继承自View,单击时,将依次绘制出圆形、矩形和三角形。
然后,将该类加入主窗体的布局文件中,方法和加入Android自带控件的方法是一样的。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<RelativeLayout xmlns:android= "http://schemas.android.com/apk/res/android"
android:layout_width= "match_parent"
android:layout_height= "match_parent"
android:paddingBottom= "@dimen/activity_vertical_margin"
android:paddingLeft= "@dimen/activity_horizontal_margin"
android:paddingRight= "@dimen/activity_horizontal_margin"
android:paddingTop= "@dimen/activity_vertical_margin"
tools:context= ".MainActivity"
>
<com.hzhi.customview.CustomView
android:id= "@+id/cusView"
android:layout_width= "wrap_content"
android:layout_height= "wrap_content"
>
</com.hzhi.customview.CustomView>
</RelativeLayout> |
最后,是主窗体的Java文件。
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
|
package
com.hzhi.customview;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.View;
public class MainActivity extends
Activity {
CustomView cv;
@Override
protected
void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cv = (CustomView) findViewById(R.id.cusView);
cv.setOnClickListener( new
View.OnClickListener() {
@Override
public
void onClick(View v) {
Message message = new
Message();
message.what = 1 ;
myHandler.sendMessage(message);
}
});
}
Handler myHandler = new
Handler()
{
//接收到消息后处理
public
void handleMessage(Message msg)
{
switch
(msg.what)
{
case
1 :
cv.changeStyle();
cv.invalidate();
break ;
}
super .handleMessage(msg);
}
};
} |
通过findViewById()函数获得自定义控件,定义控件的单击事件,和Android自带控件的使用方法是一致的。
运行结果: