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"/>
实现原理比较简单,就不上传工程代码了,这个是我之前的一个项目中自己写的一个控件。