自定义进度按钮
来源:互联网 发布:源码查看 编辑:程序博客网 时间: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);
}
}
}
- 自定义进度按钮
- Android自定义圆形按钮点击进度动画
- 自定义滚动按钮(滚轮)进度调节器
- 自定义View 绘制进度按钮(ProgressButton)
- 自定义view--带进度显示的下载按钮
- 自定义View----带进度的返回顶部按钮
- 自定义进度
- Qml圆形进度按钮
- 安卓开发之自定义带加载进度的按钮ProgressButton
- Android自定义控件之带下载进度的下载按钮DownloadProgressButton
- android 显示进度的按钮
- [UWP]创建一个进度按钮
- 自定义加载进度动画
- Android自定义进度框
- 自定义进度圆环
- Swift自定义进度圆
- 自定义进度弧形条
- 十七、自定义进度对话框
- 2013年终总结
- Hibernate事务管理
- android-getTextSize返回值是以像素(px)为单位的,setTextSize()以sp为单位
- android 实现button双击事件
- 字符串中最后一个单词的长度 Length of Last Word
- 自定义进度按钮
- android自定义控件--横向滑动的ListView
- 编程网站
- android:屏幕自适应
- WPF 列表选择,动态调用ResourceDictionary内资源
- 如何在GitHub上下载自己喜欢的开源代码并提交修改
- 山东理工大学ACM平台题答案关于C语言 1259 Bad Hair Day
- 正则表达式
- springmvc文件上传错误