自定义进度按钮

来源:互联网 发布:源码查看 编辑:程序博客网 时间:2024/05/01 19:15

自定义进度控件
开源的一个改了一下实现如下:外围跑进度圈,中间数字更新
  ########
  #      #
  #  48  #
  #    #     
    ########

/**
 * 自定义进度按钮
 *
 * @time 下午12:24:50
 * @author retacn yue
 * @Email zhenhuayue@sina.com
 */
public class ProgressButton extends CompoundButton {
 /* 默认是从0-100 */
 private int mMax;
 /* 起始值为0 */
 private int mProgress;
 /* 按钮的unpinned状态 */
 private Drawable mUnpinnedDrawable;
 /* 按钮的pinned状态 */
 private Drawable mPinnedDrawable;
 /* 按钮使用隐影 */
 private Drawable mShadowDrawable;
 /* 隐影 画笔 */
 private Paint mCirclePaint;
 /**
  * 关于进度的几个属性值
  */
 // 进度画笔
 private Paint mProgressPaint;
 // 隐影大小
 private int mDrawableSize;
 // 正方形
 private Rect mTempRect = new Rect();
 // private RectF mTempRectF = new RectF();
 private RectF mTempRectF = new RectF(270, 370, 330, 430);
 // 进度半径
 private int mInnerSize;

 private Paint mTextPaint;

 /**
  *
  * @return 返回进度最大值
  */
 public int getmMax() {
  return mMax;
 }

 /**
  * 设置最大进度值
  *
  * @param mMax
  */
 public void setmMax(int mMax) {
  this.mMax = mMax;
  invalidate();// 更新界面
 }

 /**
  *
  * @return 返回当前进度值
  */
 public int getProgress() {
  return mProgress;
 }

 /**
  * 设置当前进度值
  *
  * @param mProgress
  */
 public void setProgress(int Progress) {
  if (Progress > mMax || Progress < 0) {
   throw new IllegalArgumentException(String.format("Progress(%d) must be between %d and %d", Progress, 0, mMax));
  }
  this.mProgress = Progress;
  invalidate();// 更新界面
 }

 /**
  *
  * @return 返回当前进度的颜色
  */
 public int getProgressColor() {
  return mProgressPaint.getColor();
 }

 /**
  * 设置当前进度颜色
  *
  * @param progressColor
  */
 public void setProgressColor(int progressColor) {
  mProgressPaint.setColor(progressColor);
  invalidate();
 }

 /**
  *
  *
  * @return 返回当前圆背景颜色
  */
 public int getCircleColor() {
  return mCirclePaint.getColor();
 }

 /**
  * 设置当前圆背景颜色
  *
  * @param circleColor
  */
 public void setCircleColor(int circleColor) {
  mCirclePaint.setColor(circleColor);
  invalidate();
 }

 public int getmInnerSize() {
  return mInnerSize;
 }

 public void setmInnerSize(int mInnerSize) {
  this.mInnerSize = mInnerSize;
 }

 /**
  *
  * @return 取得选中状态背景
  */
 public Drawable getPinnedDrawable() {
  return mPinnedDrawable;
 }

 /**
  * 设置选中状态背景
  *
  * @param pinnedDrawable
  */
 public void setPinnedDrawable(Drawable pinnedDrawable) {
  mPinnedDrawable = pinnedDrawable;
  invalidate();
 }

 /**
  *
  * @return 返回未选中状态背景
  */
 public Drawable getUnpinnedDrawable() {
  return mUnpinnedDrawable;
 }

 /**
  * 设置未选中状态背景
  *
  * @param unpinnedDrawable
  */
 public void setUnpinnedDrawable(Drawable unpinnedDrawable) {
  mUnpinnedDrawable = unpinnedDrawable;
  invalidate();
 }

 /**
  *
  * @return 返回外隐影背景
  */
 public Drawable getShadowDrawable() {
  return mShadowDrawable;
 }

 /**
  * 设置 外隐影背景
  *
  * @param shadowDrawable
  */
 public void setShadowDrawable(Drawable shadowDrawable) {
  mShadowDrawable = shadowDrawable;
  mDrawableSize = mShadowDrawable.getIntrinsicWidth();
  invalidate();
 }

 /**
  *
  * @return 返回当前按钮状态
  */
 public boolean isPinned() {
  return isChecked();
 }

 /**
  * 设置按钮状态
  *
  * @param pinned
  */
 public void setPinned(boolean pinned) {
  setChecked(pinned);
 }

 /*************** 构造器 ******************************/
 public ProgressButton(Context context) {
  this(context, null);
 }

 public ProgressButton(Context context, AttributeSet attrs) {
  this(context, attrs, R.attr.progressButtonStyle);
 }

 public ProgressButton(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  init(context, attrs, defStyle);
 }

 /*******************************************************/

 /**
  * 初始化进度按钮
  *
  * @param context
  *            应用的上下文
  * @param attrs
  *            属性
  * @param defStyle
  *            未使用
  */
 @SuppressWarnings("deprecation")
 private void init(Context context, AttributeSet attrs, int defStyle) {
  final TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ProgressButton, R.attr.progressButtonStyle, R.style.ProgressButton_Pin);
  final Resources res = getResources();
  // 初始化起始值和最大值
  mProgress = a.getInteger(R.styleable.ProgressButton_progress, 0);
  mMax = a.getInteger(R.styleable.ProgressButton_max, 100);

  // 默认圆的颜色
  int circleColor = res.getColor(R.color.progress_default_circle_color);
  circleColor = a.getColor(R.styleable.ProgressButton_circleColor, circleColor);
  // 进度颜色
  int progressColor = res.getColor(R.color.progress_default_progress_color);
  progressColor = a.getColor(R.styleable.ProgressButton_progressColor, progressColor);

  // 按钮的两种状态,及回调
  int pinnedDrawable = a.getResourceId(R.styleable.ProgressButton_pinnedDrawable, R.drawable.pin_progress_pinned);
  mPinnedDrawable = res.getDrawable(pinnedDrawable);
  mPinnedDrawable.setCallback(this);

  int unpinnedDrawable = a.getResourceId(R.styleable.ProgressButton_unpinnedDrawable, R.drawable.pin_progress_unpinned);
  mUnpinnedDrawable = res.getDrawable(unpinnedDrawable);
  mUnpinnedDrawable.setCallback(this);

  // 隐影及回调
  int shadowDrawable = a.getResourceId(R.styleable.ProgressButton_shadowDrawable, R.drawable.pin_progress_shadow);
  mShadowDrawable = res.getDrawable(shadowDrawable);
  mShadowDrawable.setCallback(this);
  // 进度半径
  mInnerSize = a.getDimensionPixelSize(R.styleable.ProgressButton_innerSize, mInnerSize);
  setChecked(a.getBoolean(R.styleable.ProgressButton_pinned, false));
  setClickable(a.getBoolean(R.styleable.ProgressButton_android_clickable, false));
  setFocusable(a.getBoolean(R.styleable.ProgressButton_android_focusable, false));
  setBackgroundDrawable(a.getDrawable(R.styleable.ProgressButton_android_selectableItemBackground));

  a.recycle();
  mDrawableSize = mShadowDrawable.getIntrinsicWidth();

  // 初始化隐影圆画笔
  mCirclePaint = new Paint();
  mCirclePaint.setColor(circleColor);
  mCirclePaint.setAntiAlias(true);
  // 初始化进度圆画笔
  mProgressPaint = new Paint();
  mProgressPaint.setColor(progressColor);
  mProgressPaint.setAntiAlias(true);
  mProgressPaint.setStyle(Paint.Style.STROKE);
  mProgressPaint.setStrokeWidth(4);

  mTextPaint = new Paint();
  mTextPaint.setTextSize(20);
  mTextPaint.setStyle(Paint.Style.FILL);
 }

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  setMeasuredDimension(resolveSize(mDrawableSize, widthMeasureSpec), resolveSize(mDrawableSize, heightMeasureSpec));
 }

 @Override
 protected void drawableStateChanged() {
  super.drawableStateChanged();
  if (mPinnedDrawable.isStateful()) {
   mPinnedDrawable.setState(getDrawableState());
  }
  if (mUnpinnedDrawable.isStateful()) {
   mUnpinnedDrawable.setState(getDrawableState());
  }
  if (mShadowDrawable.isStateful()) {
   mShadowDrawable.setState(getDrawableState());
  }
 }

 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);

  mTempRect.set(0, 0, mDrawableSize, mDrawableSize);
  mTempRect.offset((getWidth() - mDrawableSize) / 2, (getHeight() - mDrawableSize) / 2);

  mTempRectF.set(-0.5f, -0.5f, mInnerSize + 0.5f, mInnerSize + 0.5f);
  mTempRectF.offset((getWidth() - mInnerSize) / 2, (getHeight() - mInnerSize) / 2);

  // 绘制圆
  canvas.drawArc(mTempRectF, 0, 360, true, mCirclePaint);
  canvas.drawArc(mTempRectF, -90, 360 * mProgress / mMax, false, mProgressPaint);
  // 绘制进度值
  canvas.drawText(mProgress + "", 40, 50, mTextPaint);

  Drawable iconDrawable = isChecked() ? mPinnedDrawable : mUnpinnedDrawable;
  iconDrawable.setBounds(mTempRect);
  iconDrawable.draw(canvas);

  mShadowDrawable.setBounds(mTempRect);
  mShadowDrawable.draw(canvas);
 }

 @Override
 public Parcelable onSaveInstanceState() {
  Parcelable superState = super.onSaveInstanceState();
  if (isSaveEnabled()) {
   SavedState ss = new SavedState(superState);
   ss.mMax = mMax;
   ss.mProgress = mProgress;
   return ss;
  }
  return superState;
 }

 @Override
 public void onRestoreInstanceState(Parcelable state) {
  if (!(state instanceof SavedState)) {
   super.onRestoreInstanceState(state);
   return;
  }

  SavedState ss = (SavedState) state;
  super.onRestoreInstanceState(ss.getSuperState());

  mMax = ss.mMax;
  mProgress = ss.mProgress;
 }

 /** A {@link android.os.Parcelable} representing the{@link ProgressButton}'s state. */
 public static class SavedState extends BaseSavedState {
  public static final Creator<SavedState> CREATOR = new Creator<SavedState>() {
   @Override
   public SavedState createFromParcel(Parcel parcel) {
    return new SavedState(parcel);
   }

   @Override
   public SavedState[] newArray(int size) {
    return new SavedState[size];
   }
  };
  private int mProgress;
  private int mMax;

  public SavedState(Parcelable superState) {
   super(superState);
  }

  private SavedState(Parcel in) {
   super(in);
   mProgress = in.readInt();
   mMax = in.readInt();
  }

  @Override
  public void writeToParcel(Parcel out, int flags) {
   super.writeToParcel(out, flags);
   out.writeInt(mProgress);
   out.writeInt(mMax);
  }
 }
}

0 0
原创粉丝点击