带进度条的按钮
来源:互联网 发布:计算机的软件组成 编辑:程序博客网 时间:2024/04/30 05:15
一、定义ProgressButton的自定义属性
在attrs文件中定义ProgressButton的基本属性:主要有进度条颜色、进度条的背景颜色、按钮正常和被点击状态时的颜色、按钮的边角半径和是否显示进度信息。
<declare-styleable name="progressbutton"> <attr name="progressColor" format="color" /> <attr name="progressBgColor" format="color" /> <attr name="buttonNormalColor" format="color" /> <attr name="buttonPressedColor" format="color" /> <attr name="buttonCornerRadius" format="dimension"/> <attr name="showProgressNum" format="boolean"/></declare-styleable>
二、继承Button自定义ProgressButton
package com.cxmscb.cxm.progressbutton;
import Android.annotation.TargetApi;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.StateListDrawable;
import android.os.Build;
import android.util.AttributeSet;
import android.widget.Button;
/**
* Created by cxm on 2016/9/7.
*/
public class ProgressButton extends Button {
private int mProgress; //当前进度private int mMaxProgress = 100; //最大进度:默认为100private int mMinProgress = 0;//最小进度:默认为0private GradientDrawable mProgressDrawable;// 加载进度时的进度颜色private GradientDrawable mProgressDrawableBg;// 加载进度时的背景色private StateListDrawable mNormalDrawable; // 按钮在不同状态的颜色效果private boolean isShowProgress; //是否展示进度private boolean isFinish; // 结束状态private boolean isStop;// 停止状态private boolean isStart ; // 刚开始的状态private OnStateListener onStateListener; //结束时的监听private float cornerRadius; // 圆角半径public ProgressButton(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs);}public ProgressButton(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs);}@TargetApi(Build.VERSION_CODES.LOLLIPOP)public ProgressButton(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(context, attrs);}private void init(Context context,AttributeSet attributeSet) { // 初始化按钮状态Drawable mNormalDrawable = new StateListDrawable(); // 初始化进度条Drawable mProgressDrawable = (GradientDrawable)getResources().getDrawable( R.drawable.rect_progress).mutate(); // 初始化进度条背景Drawable mProgressDrawableBg = (GradientDrawable)getResources().getDrawable( R.drawable.rect_progressbg).mutate(); TypedArray attr = context.obtainStyledAttributes(attributeSet, R.styleable.progressbutton); try { // 默认的圆角大小 float defValue = getResources().getDimension(R.dimen.corner_radius); // 获取圆角大小 cornerRadius = attr.getDimension(R.styleable.progressbutton_buttonCornerRadius, defValue); // 获取是否显示进度信息的属性 isShowProgress = attr.getBoolean(R.styleable.progressbutton_showProgressNum,true); // 给按钮的状态Drawable添加被点击时的状态 mNormalDrawable.addState(new int[]{android.R.attr.state_pressed}, getPressedDrawable(attr)); // 给按钮的状态Drawable添加其他时候的状态 mNormalDrawable.addState(new int[] { }, getNormalDrawable(attr)); // 获取进度条颜色属性值 int defaultProgressColor = getResources().getColor(R.color.purple_progress); int progressColor = attr.getColor(R.styleable.progressbutton_progressColor,defaultProgressColor); // 设置进度条Drawable的颜色 mProgressDrawable.setColor(progressColor); // 获取进度条背景颜色属性值 int defaultProgressBgColor = getResources().getColor(R.color.progress_bg); int progressBgColor = attr.getColor(R.styleable.progressbutton_progressBgColor,defaultProgressBgColor); // 设置进度条背景Drawable的颜色 mProgressDrawableBg.setColor(progressBgColor); } finally { attr.recycle(); } // 初始化状态 isFinish = false; isStop = true; isStart = false; // 设置圆角 mProgressDrawable.setCornerRadius(cornerRadius); mProgressDrawableBg.setCornerRadius(cornerRadius); // 设置按钮背景为状态Drawable setBackgroundCompat(mNormalDrawable);}@Overrideprotected void onDraw(Canvas canvas) { if (mProgress > mMinProgress && mProgress <= mMaxProgress && !isFinish) { // 更新进度: float scale = (float) getProgress() / (float) mMaxProgress; float indicatorWidth = (float) getMeasuredWidth() * scale; mProgressDrawable.setBounds(0, 0, (int) indicatorWidth, getMeasuredHeight()); mProgressDrawable.draw(canvas); // 进度完成时回调方法,并更变状态 if(mProgress==mMaxProgress) { setBackgroundCompat(mProgressDrawable); isFinish = true; if(onStateListener!=null) { onStateListener.onFinish(); } } } super.onDraw(canvas);}// 设置进度信息public void setProgress(int progress) { if(!isFinish&&!isStop){ mProgress = progress; if(isShowProgress) setText(mProgress + " %"); // 设置背景 setBackgroundCompat(mProgressDrawableBg); invalidate(); }}// 获取进度public int getProgress() { return mProgress;}// 设置为停止状态public void setStop(boolean stop) { isStop = stop; invalidate();}public boolean isStop() { return isStop;}public boolean isFinish() { return isFinish;}// 切换状态:public void toggle(){ if(!isFinish&&isStart){ if(isStop){ setStop(false); onStateListener.onContinue(); } else { setStop(true); onStateListener.onStop(); } }else { setStop(false); isStart = true; }}// 设置按钮背景private void setBackgroundCompat(Drawable drawable) { int pL = getPaddingLeft(); int pT = getPaddingTop(); int pR = getPaddingRight(); int pB = getPaddingBottom(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { setBackground(drawable); } else { setBackgroundDrawable(drawable); } setPadding(pL, pT, pR, pB);}// 初始化状态public void initState(){ setBackgroundCompat(mNormalDrawable); isFinish = false; isStop = true; isStart = false; mProgress = 0;}// 获取状态Drawable的正常状态下的背景private Drawable getNormalDrawable( TypedArray attr) { GradientDrawable drawableNormal = (GradientDrawable) getResources().getDrawable(R.drawable.rect_normal).mutate();// 修改时就不会影响其它drawable对象的状态 drawableNormal.setCornerRadius(cornerRadius); // 设置圆角半径 int defaultNormal = getResources().getColor(R.color.blue_normal); int colorNormal = attr.getColor(R.styleable.progressbutton_buttonNormalColor,defaultNormal); drawableNormal.setColor(colorNormal);//设置颜色 return drawableNormal;}// 获取按钮被点击时的Drawableprivate Drawable getPressedDrawable( TypedArray attr) { GradientDrawable drawablePressed = (GradientDrawable) getResources().getDrawable(R.drawable.rect_pressed).mutate();// 修改时就不会影响其它drawable对象的状态 drawablePressed.setCornerRadius(cornerRadius);// 设置圆角半径 int defaultPressed = getResources().getColor(R.color.blue_pressed); int colorPressed = attr.getColor(R.styleable.progressbutton_buttonPressedColor,defaultPressed); drawablePressed.setColor(colorPressed);//设置颜色 return drawablePressed;}// 设置状态监听接口interface OnStateListener{ abstract void onFinish(); abstract void onStop(); abstract void onContinue();}public void setOnStateListener(OnStateListener onStateListener){ this.onStateListener = onStateListener;}public void isShowProgressNum(boolean b){ this.isShowProgress = b;}
}
三、ProgressButton的使用示例:
public class MainActivity extends AppCompatActivity {
private ProgressButton progressButton;private ProgressThread pt;private Boolean isPause = false;public Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { progressButton.setProgress(msg.arg1); }};private int z=0;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); progressButton = (ProgressButton) findViewById(R.id.pb); progressButton.setTag(0); progressButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 防止开启多个异步线程 if((Integer)progressButton.getTag()==0) { pt = new ProgressThread(); pt.start(); progressButton.setTag(1); } if(!progressButton.isFinish()){ progressButton.toggle(); } } }); progressButton.setOnStateListener(new ProgressButton.OnStateListener() { @Override public void onFinish() { isPause = true; synchronized (this) { pt.interrupt(); } progressButton.setText("完 成"); // progressButton.initState(); Toast.makeText(MainActivity.this,"Finish",Toast.LENGTH_SHORT).show(); } @Override public void onStop() { Log.i("zz","stop"); progressButton.setText("继 续"); isPause = true; } @Override public void onContinue() { Log.i("zz","continue"); isPause = false; } });}public class ProgressThread extends Thread{ private int z = 0; @Override public void run() { while (true) { synchronized (this) { if (!isPause) { z += 2; Message msg = Message.obtain(); msg.arg1 = z; handler.sendMessage(msg); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } } } }@Overrideprotected void onDestroy() { super.onDestroy(); handler.removeCallbacksAndMessages(null);}
}
0 0
- 带进度条的按钮
- Android自定义视频录制时的带进度条的按钮
- 带文字的进度条
- 带进度条的WebView
- 带进度条的webview
- 带进度条的JFrame
- 带进度条的WebView
- 带进度条的webview
- 带进度条的WebView
- 带进度条的WebView
- 带进度条的x5WebView
- 带进度条的WKWebView
- 带进度条的WebView
- 带进度条的WebView
- Android UI组件进阶(1)——带进度条的按钮
- 带进度条的文件拷贝
- 带进度条的文件夹拷贝
- 带进度条的Loading制作
- 贫穷
- android中的动画
- Unity 物理分层碰撞
- hdu 1241 Oil Deposits(搜索基础题)
- android中多线程
- 带进度条的按钮
- EventBus源码解析
- 管程机制处理进程同步问题
- 小程序探究
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(55)-Web打印
- OC-沙箱&归档
- STM32的通用定时器的配置
- 约瑟夫问题各种求解办法
- mysql 5.7.14 安装配置方法图文教程