Android自定义View的方式有很多,可以继承View也可以继承更高级一点的控件,比如TextView,RelativeLayout等等。
今天主要讲继承View,重写onDraw,onMeasure等
先看效果图(一个可以显示当前进度的控件)

第一步:添加属性定义
<?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
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中引用
xmlns:buyProgressView="http://schemas.android.com/apk/res/com.lottery"
<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"/>
实现原理比较简单,就不上传工程代码了,这个是我之前的一个项目中自己写的一个控件。
浙公网安备 33010602011771号