[转载]Android 自定义View之继承view重写onDraw - 梅义 - 博客园

[转载]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
<com.lottery.ui.view.BuyProgressView
               Android:id="@+id/progress"
               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"/>

 

实现原理比较简单,就不上传工程代码了,这个是我之前的一个项目中自己写的一个控件。

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏