大家好,今天小编来为大家解答以下的问题,关于轻松实现自定义进度条,这个很多人还不知道,现在让我们一起来看看吧!
max: 进度条的最大值progress: 进度条的完成进度progressDrawable: 设置对应的drawable对象infiniteate: 设置不确定显示进度infiniteateDrawable: 设置不显示进度条的Drawable对象infiniteateDuration: 设置不精确进度显示的时长secondaryProgress:设置第二级我们先来看看使用一些现成的进度条样式的进度条。
他们都很丑,对吧?
所以你需要定制一个
最后一项是我们自己定义的,怎么做呢?
其实就是利用一些图片素材来制作一帧一帧的动画。
看看材料:
然后在drawable目录下创建amin_bgbar.xml文件:
oneshot表示是否重复,true表示只播放一次,false表示重复
持续时间表示显示图像的持续时间
然后在布局文件中创建一个ImageView,src引用这个drawable,然后在MainActivity中使用
私有ImageView img_pgbar;
私人AnimationDrawable广告;
@覆盖
protected void onCreate(Bundle savingInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img_pgbar=(ImageView) findViewById(R.id.img_pgbar);
ad=(AnimationDrawable) img_pgbar.getDrawable();
img_pgbar.postDelayed(new Runnable() {
@覆盖
公共无效运行(){
广告.开始();
}
}, 100);
}但是,上面的例子充其量只是一个动画,无法显示当前进度。
代码
公共类CircleProgressBar 扩展View {
私有Paint mBackPaint;
私有油漆mFrontPaint;
私有Paint mTextPaint;
//画笔宽度
私有浮点数mStrokeWidth=50;
//画笔宽度的一半
私有浮点数mHalfStrokeWidth=50/2;
//半径
私有浮点数mRadius=200;
私有RectF mRect;
//当前进度
私有int mProgress=0;
//目标进度
私有int mTargetProgress=90;
//最大值
私有int mMax=100;
私有int mWidth;
私有int mHeight;
公共CircleProgressBar(上下文上下文){
这个(上下文,空,0);
}
公共CircleProgressBar(上下文上下文,AttributeSet attrs){
这(上下文,属性,0);
}
公共CircleProgressBar(上下文上下文,AttributeSet attrs,int defStyleAttr){
超级(上下文,属性,defStyleAttr);
初始化();
}
//初始化画笔
私有无效初始化(){
//背景画笔
mBackPaint=new Paint();
mBackPaint.setColor(Color.WHITE);
mBackPaint.setAntiAlias(true);
mBackPaint.setStyle(Paint.Style.STROKE);
mBackPaint.setStrokeWidth(mStrokeWidth);
//进度条刷
mFrontPaint=new Paint();
mFrontPaint.setColor(Color.GREEN);
mFrontPaint.setAntiAlias(true);
mFrontPaint.setStyle(Paint.Style.STROKE);
mFrontPaint.setStrokeWidth(mStrokeWidth);
//文本画笔
mTextPaint=new Paint();
mTextPaint.setColor(Color.GREEN);
mTextPaint.setAntiAlias(true);
mTextPaint.setTextSize(80);
mTextPaint.setTextAlign(Paint.Align.CENTER);
}
@覆盖
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mWidth=getRealSize(widthMeasureSpec);
mHeight=getRealSize(heightMeasureSpec);
setMeasuredDimension(mWidth, mHeight);
}
//计算实际大小
私有int getRealSize(intmeasureSpec) {
整数结果=1;
int 模式=MeasureSpec.getMode(measureSpec);
int 大小=MeasureSpec.getSize(measureSpec);
if (mode==MeasureSpec.AT_MOST || mode==MeasureSpec.UNSPECIFIED) {
结果=(int) (mRadius * 2 + mStrokeWidth);
} 别的{
结果=大小;
}
返回结果;
}
//设置当前进度
公共无效setProgress(int进度){
mProgress=进度;
无效();
}
私有无效initRect() {
如果(mRect==null){
mRect=新的RectF();
int viewSize=(int) (mRadius * 2);
int left=(mWidth - viewSize)/2;
int top=(mHeight - 视图大小)/2;
int 右=左+ 视图大小;
int 底部=顶部+ 视图大小;
mRect.set(左、上、右、下);
}
}
@覆盖
protected void onDraw(Canvas 画布) {
初始化矩形();
浮动角度=mProgress/(float) mMax * 360;
canvas.drawCircle(mWidth/2, mHeight/2, mRadius, mBackPaint);
canvas.drawArc(mRect, -90, 角度, false, mFrontPaint);
canvas.drawText(mProgress + "%", mWidth/2 + mHalfStrokeWidth, mHeight/2 + mHalfStrokeWidth, mTextPaint);
如果(mProgress mTargetProgress){
mProgress +=1;
//延迟更新100毫秒
后无效延迟(100);
}
}
好了,文章到此结束,希望可以帮助到大家。
【轻松实现自定义进度条】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
看起来很实用,能自己调整进度条的样子真是太棒了!
有19位网友表示赞同!
我想试试用这个自定义进度条改进一下我的项目页面。
有17位网友表示赞同!
有没有教程? 我想了解一下具体的步骤是怎么执行的。
有7位网友表示赞同!
简单自定义? 太好了,我需要一个快速高效的解决方案!
有7位网友表示赞同!
这对于新手来说是不是很容易上手呢?
有18位网友表示赞同!
进度条的样式能调整到多方面吗?比如颜色、形状等等?
有7位网友表示赞同!
这个自定义进度条可以实现动画效果吗?
有18位网友表示赞同!
如果想添加文字描述,能不能实现并显示出来?
有14位网友表示赞同!
这篇文章解决了哪些常见的进度条定制难题呢?
有9位网友表示赞同!
使用这个进度条,我是不是需要学习新的编程语言或者框架?
有11位网友表示赞同!
简单自定义,但功能强大吗? 能满足各种复杂的场景需求吗?
有12位网友表示赞同!
请问这个方法适用于不同的编程环境吗?比如Android、Web页面等等
有16位网友表示赞同!
能分享一下具体的案例吗? 让我更容易理解它是怎么工作的。
有15位网友表示赞同!
有没有开源的代码示例可以参考学习呢?
有10位网友表示赞同!
这个进度条支持实时更新吗? 可以根据程序运行情况动态变化?
有11位网友表示赞同!
用这种自定义方式,进度条的表现效果会比系统自带的更好吗?
有16位网友表示赞同!
我之前遇到过一些进度条定制的问题, 这篇文章或许能帮到我。
有6位网友表示赞同!
这个自定义方法是不是比较复杂啊? 需要花很多时间去学习和调试?
有13位网友表示赞同!
真是个好主意! 希望更多人能使用这种方法来定制自己的进度条。
有11位网友表示赞同!
如果项目规模较大,这种方法是否仍然高效呢?
有12位网友表示赞同!