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"/>

 

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

 

posted on 2014-01-03 16:38  梅义  阅读(2025)  评论(0编辑  收藏  举报