自定义按钮进度条

来源:互联网 发布:服务器与域名的关系 编辑:程序博客网 时间:2024/06/06 04:00
  • 应用场景: 点击下载的时候,按钮有进度条的显示.
  • 使用到的东西:
    • 自定义控件
    • Handler
    • butterknife(很方便findViewById)
    • 先看效果图
      动态图
  • 下面上代码
//这是 很简单的自定义控件,主要是动态的计算矩形right 的位置public class ProgressBtn extends Button {    private boolean isProgressEnable = true;    private long mMax = 100;    private long mProgress;    private ColorDrawable mBlueBg;    /***     * 是否允许进度     *     * @param isProgressEnable     */    public void setIsProgressEnable(boolean isProgressEnable) {        this.isProgressEnable = isProgressEnable;    }    /**     * 设置进度的最大值     *     * @param max     */    public void setMax(long max) {        mMax = max;    }    /**     * 设置进度的当前值     *     * @param progress     */    public void setProgress(long progress) {        mProgress = progress;        //重绘进度        invalidate();    }    public ProgressBtn(Context context) {        super(context);    }    public ProgressBtn(Context context, AttributeSet attrs) {        super(context, attrs);    }    @Override    protected void onDraw(Canvas canvas) {        //之前//        canvas.drawText("haha", 20, 20, getPaint());        if (isProgressEnable) {            if (mBlueBg == null) {                mBlueBg = new ColorDrawable(Color.BLUE);            }            int left = 0;            int top = 0;            int right = (int) (mProgress * 1.0f / mMax * getMeasuredWidth() + .5f);//动态计算 重点...  +.5 是为了四舍五入            int bottom = getBottom();            mBlueBg.setBounds(left, top, right, bottom);            mBlueBg.draw(canvas);        }        super.onDraw(canvas);//默认绘制    }}
  • 下面主界面的测试代码,我是用handler 模拟的
public class MainActivity extends AppCompatActivity {    private static final int PROGRESS_UPDATE = 0;    private static final int END = 1;    private MTask mTask;    @Bind(R.id.btn_progress)    ProgressBtn btnProgress;    private Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            switch (msg.what) {                case PROGRESS_UPDATE:                    int i = (int) msg.obj;//                  btnProgress.setBackgroundColor(Color.BLUE);//                  btnProgress.setIsProgressEnable(false);                    btnProgress.setProgress(i);                    int index = (int) (i * 1.0f / 100 * 100 + .5f);                    btnProgress.setText(index + "%");                    if (i == 100) {                        btnProgress.setText("下载完成");                        btnProgress.setTextColor(Color.BLACK);                        btnProgress.setProgress(0);                        mTask = null;                    }                    break;                case END:                    break;            }        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ButterKnife.bind(this);        btnProgress.setMax(100);    }    @OnClick(R.id.btn_progress)    public void onClick() {        if (mTask == null) {            mTask = new MTask();            new Thread(mTask).start();        }    }    class MTask implements Runnable {        @Override        public void run() {            for (int i = 0; i <= 100; i++) {                SystemClock.sleep(100);                Message msg = Message.obtain();                msg.what = PROGRESS_UPDATE;                msg.obj = i;                mHandler.sendMessage(msg);            }        }    }}
  • 需要改进的地方 , 没有暂停按钮,还不实用,
  • 没有自定义属性,设置不方便
0 0
原创粉丝点击