[转载]Android 自定义View之继承view重写onDraw – 梅义 – 博客园.
Android自定义View的方式有很多,可以继承View也可以继承更高级一点的控件,比如TextView,RelativeLayout等等。
今天主要讲继承View,重写onDraw,onMeasure等
先看效果图(一个可以显示当前进度的控件)
第一步:添加属性定义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?xml version= "1.0" encoding= "utf-8" ?> <resources> <declare-styleable name= "BuyProgressView" > <attr format= "integer" name= "bought_color" /> <!-- 已买颜色 --> <attr format= "integer" name= "base_color" /> <!-- 底色 --> <attr format= "integer" name= "text_color" /> <!-- 文本颜色 --> <attr format= "dimension" name= "text_size" /> <!-- 文本字体大小 --> </declare-styleable> </resources> |
第二步:实现自定义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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
public class ProgressBarDialog extends Dialog { private ProgressBar mProgress; // 进度提示控件 private TextView mMessageView; // 进度消息控件 private String mMessage; // 进度消息字符串 private boolean mIndeterminate; // 是否indeterminate模式 private Drawable mIndeterminateDrawable; // 进度提示图片; public ProgressBarDialog(Context context) { super (context, R.style.DialogTheme); } @Override protected void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.d_progress_spinner); // 初始化进度控件 mProgress = (ProgressBar) findViewById(R.id.progress); // 初始化信息控件 mMessageView = (TextView) findViewById(R.id.message); // 显示消息 setMessage(mMessage); // 设置indeterminate模式 setIndeterminate(mIndeterminate); // 设置进度控件提示图片 if (mIndeterminateDrawable != null ) { setIndeterminateDrawable(mIndeterminateDrawable); } } @Override public void onAttachedToWindow() { // TODO Auto-generated method stub super .onAttachedToWindow(); Window w = getWindow(); WindowManager.LayoutParams lp = w.getAttributes(); DisplayMetrics dm = getContext().getResources().getDisplayMetrics(); lp.width = dm.widthPixels; lp.height = dm.heightPixels; // onWindowAttributesChanged(lp); lp.format=PixelFormat.TRANSLUCENT; lp.gravity=Gravity.CENTER; lp.dimAmount= 0 .1f; w.setAttributes(lp); } /** * 设置进度提示图片资源 * * @param d */ public void setIndeterminateDrawable(Drawable d) { if (mProgress != null ) { mProgress.setIndeterminateDrawable(d); } else { mIndeterminateDrawable = d; } } /** * 设置indeterminate模式 * * @param indeterminate */ public void setIndeterminate( boolean indeterminate) { if (mProgress != null ) { mProgress.setIndeterminate(indeterminate); } else { mIndeterminate = indeterminate; } } /** * 是否indeterminate模式 */ public boolean isIndeterminate() { if (mProgress != null ) { return mProgress.isIndeterminate(); } return mIndeterminate; } /** * 设置提示信息 * * @param message */ public void setMessage(String message) { if (mMessageView != null ) { // 已有控件,直接修改显示; if (!StringUtils.isNull(message)) { mMessageView.setText(message); mMessageView.setVisibility(View.VISIBLE); } else { mMessageView.setText(message); mMessageView.setVisibility(View.GONE); } } mMessage = message; } } |
第三步:在xml layout中引用
1
2
3
4
5
6
7
8
9
10
11
12
|
xmlns:buyProgressView= "http://schemas.android.com/apk/res/com.lottery" <com.lottery.ui.view.BuyProgressView android:layout_width= "50dp" android:gravity= "center" buyProgressView:base_color= "0xffffce2b" buyProgressView:bought_color= "0xffdc1a38" buyProgressView:text_color= "0xff3d6500" buyProgressView:text_size= "12sp" android:layout_height= "50dp" /> |
实现原理比较简单,就不上传工程代码了,这个是我之前的一个项目中自己写的一个控件。