Android自定义谷歌风格ProgressBar
发布时间 - 2026-01-10 23:07:22 点击率:次本文实例为大家分享了谷歌风格ProgressBar的具体代码,供大家参考,具体内容如下
具体代码
package zms.demo.colorprogress;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Interpolator;
import android.view.animation.LinearInterpolator;
import android.widget.ProgressBar;
public class GoogleProgressBar extends ProgressBar {
private static final int INTERPOLATOR_ACCELERATE = 0;
private static final int INTERPOLATOR_LINEAR = 1;
private static final int INTERPOLATOR_ACCELERATEDECELERATE = 2;
private static final int INTERPOLATOR_DECELERATE = 3;
public GoogleProgressBar(Context context) {
this(context, null);
}
public GoogleProgressBar(Context context, AttributeSet attrs) {
this(context, attrs, R.attr.googleProgressStyle);
}
public GoogleProgressBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
if (isInEditMode()) {
setIndeterminateDrawable(new GoogleProgressDrawable.Builder(
context, true).build());
return;
}
Resources res = context.getResources();
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.GoogleStyleProgressBar, defStyle, 0);
final int color = a.getColor(R.styleable.GoogleStyleProgressBar_color,
res.getColor(R.color.default_color));
final int sectionsCount = a.getInteger(
R.styleable.GoogleStyleProgressBar_sections_count,
res.getInteger(R.integer.default_sections_count));
final int separatorLength = a
.getDimensionPixelSize(
R.styleable.GoogleStyleProgressBar_stroke_separator_length,
res.getDimensionPixelSize(R.dimen.default_stroke_separator_length));
final float strokeWidth = a.getDimension(
R.styleable.GoogleStyleProgressBar_stroke_width,
res.getDimension(R.dimen.default_stroke_width));
final float speed = a.getFloat(
R.styleable.GoogleStyleProgressBar_speed,
Float.parseFloat(res.getString(R.string.default_speed)));
final float speedProgressiveStart = a.getFloat(
R.styleable.GoogleStyleProgressBar_progressiveStart_speed,
speed);
final float speedProgressiveStop = a
.getFloat(
R.styleable.GoogleStyleProgressBar_progressiveStop_speed,
speed);
final int iInterpolator = a.getInteger(
R.styleable.GoogleStyleProgressBar_interpolator, -1);
final boolean reversed = a.getBoolean(
R.styleable.GoogleStyleProgressBar_reversed,
res.getBoolean(R.bool.default_reversed));
final boolean mirrorMode = a.getBoolean(
R.styleable.GoogleStyleProgressBar_mirror_mode,
res.getBoolean(R.bool.default_mirror_mode));
final int colorsId = a.getResourceId(
R.styleable.GoogleStyleProgressBar_colors, 0);
final boolean progressiveStartActivated = a.getBoolean(
R.styleable.GoogleStyleProgressBar_progressiveStart_activated,
res.getBoolean(R.bool.default_progressiveStart_activated));
final Drawable backgroundDrawable = a
.getDrawable(R.styleable.GoogleStyleProgressBar_background);
final boolean generateBackgroundWithColors = a
.getBoolean(
R.styleable.GoogleStyleProgressBar_generate_background_with_colors,
false);
final boolean gradients = a.getBoolean(
R.styleable.GoogleStyleProgressBar_gradients, false);
a.recycle();
// interpolator
Interpolator interpolator = null;
if (iInterpolator == -1) {
interpolator = getInterpolator();
}
if (interpolator == null) {
switch (iInterpolator) {
case INTERPOLATOR_ACCELERATEDECELERATE:
interpolator = new AccelerateDecelerateInterpolator();
break;
case INTERPOLATOR_DECELERATE:
interpolator = new DecelerateInterpolator();
break;
case INTERPOLATOR_LINEAR:
interpolator = new LinearInterpolator();
break;
case INTERPOLATOR_ACCELERATE:
default:
interpolator = new AccelerateInterpolator();
}
}
int[] colors = null;
// colors
if (colorsId != 0) {
colors = res.getIntArray(colorsId);
}
GoogleProgressDrawable.Builder builder = new GoogleProgressDrawable.Builder(
context).speed(speed)
.progressiveStartSpeed(speedProgressiveStart)
.progressiveStopSpeed(speedProgressiveStop)
.interpolator(interpolator).sectionsCount(sectionsCount)
.separatorLength(separatorLength).strokeWidth(strokeWidth)
.reversed(reversed).mirrorMode(mirrorMode)
.progressiveStart(progressiveStartActivated)
.gradients(gradients);
if (backgroundDrawable != null) {
builder.backgroundDrawable(backgroundDrawable);
}
if (generateBackgroundWithColors) {
builder.generateBackgroundUsingColors();
}
if (colors != null && colors.length > 0)
builder.colors(colors);
else
builder.color(color);
GoogleProgressDrawable d = builder.build();
setIndeterminateDrawable(d);
}
public void applyStyle(int styleResId) {
TypedArray a = getContext().obtainStyledAttributes(null,
R.styleable.GoogleStyleProgressBar, 0, styleResId);
if (a.hasValue(R.styleable.GoogleStyleProgressBar_color)) {
setSmoothProgressDrawableColor(a.getColor(
R.styleable.GoogleStyleProgressBar_color, 0));
}
if (a.hasValue(R.styleable.GoogleStyleProgressBar_colors)) {
int colorsId = a.getResourceId(
R.styleable.GoogleStyleProgressBar_colors, 0);
if (colorsId != 0) {
int[] colors = getResources().getIntArray(colorsId);
if (colors != null && colors.length > 0)
setSmoothProgressDrawableColors(colors);
}
}
if (a.hasValue(R.styleable.GoogleStyleProgressBar_sections_count)) {
setSmoothProgressDrawableSectionsCount(a.getInteger(
R.styleable.GoogleStyleProgressBar_sections_count, 0));
}
if (a.hasValue(R.styleable.GoogleStyleProgressBar_stroke_separator_length)) {
setSmoothProgressDrawableSeparatorLength(a.getDimensionPixelSize(
R.styleable.GoogleStyleProgressBar_stroke_separator_length,
0));
}
if (a.hasValue(R.styleable.GoogleStyleProgressBar_stroke_width)) {
setSmoothProgressDrawableStrokeWidth(a.getDimension(
R.styleable.GoogleStyleProgressBar_stroke_width, 0));
}
if (a.hasValue(R.styleable.GoogleStyleProgressBar_speed)) {
setSmoothProgressDrawableSpeed(a.getFloat(
R.styleable.GoogleStyleProgressBar_speed, 0));
}
if (a.hasValue(R.styleable.GoogleStyleProgressBar_progressiveStart_speed)) {
setSmoothProgressDrawableProgressiveStartSpeed(a.getFloat(
R.styleable.GoogleStyleProgressBar_progressiveStart_speed,
0));
}
if (a.hasValue(R.styleable.GoogleStyleProgressBar_progressiveStop_speed)) {
setSmoothProgressDrawableProgressiveStopSpeed(a
.getFloat(
R.styleable.GoogleStyleProgressBar_progressiveStop_speed,
0));
}
if (a.hasValue(R.styleable.GoogleStyleProgressBar_reversed)) {
setSmoothProgressDrawableReversed(a.getBoolean(
R.styleable.GoogleStyleProgressBar_reversed, false));
}
if (a.hasValue(R.styleable.GoogleStyleProgressBar_mirror_mode)) {
setSmoothProgressDrawableMirrorMode(a.getBoolean(
R.styleable.GoogleStyleProgressBar_mirror_mode, false));
}
if (a.hasValue(R.styleable.GoogleStyleProgressBar_progressiveStart_activated)) {
setProgressiveStartActivated(a
.getBoolean(
R.styleable.GoogleStyleProgressBar_progressiveStart_activated,
false));
}
if (a.hasValue(R.styleable.GoogleStyleProgressBar_progressiveStart_activated)) {
setProgressiveStartActivated(a
.getBoolean(
R.styleable.GoogleStyleProgressBar_progressiveStart_activated,
false));
}
if (a.hasValue(R.styleable.GoogleStyleProgressBar_gradients)) {
setSmoothProgressDrawableUseGradients(a.getBoolean(
R.styleable.GoogleStyleProgressBar_gradients, false));
}
if (a.hasValue(R.styleable.GoogleStyleProgressBar_generate_background_with_colors)) {
if (a.getBoolean(
R.styleable.GoogleStyleProgressBar_generate_background_with_colors,
false)) {
setSmoothProgressDrawableBackgroundDrawable(GoogleProgressBarUtils
.generateDrawableWithColors(
checkIndeterminateDrawable().getColors(),
checkIndeterminateDrawable().getStrokeWidth()));
}
}
if (a.hasValue(R.styleable.GoogleStyleProgressBar_interpolator)) {
int iInterpolator = a.getInteger(
R.styleable.GoogleStyleProgressBar_interpolator, -1);
Interpolator interpolator;
switch (iInterpolator) {
case INTERPOLATOR_ACCELERATEDECELERATE:
interpolator = new AccelerateDecelerateInterpolator();
break;
case INTERPOLATOR_DECELERATE:
interpolator = new DecelerateInterpolator();
break;
case INTERPOLATOR_LINEAR:
interpolator = new LinearInterpolator();
break;
case INTERPOLATOR_ACCELERATE:
interpolator = new AccelerateInterpolator();
break;
default:
interpolator = null;
}
if (interpolator != null) {
setInterpolator(interpolator);
}
}
a.recycle();
}
@Override
protected synchronized void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (isIndeterminate()
&& getIndeterminateDrawable() instanceof GoogleProgressDrawable
&& !((GoogleProgressDrawable) getIndeterminateDrawable())
.isRunning()) {
getIndeterminateDrawable().draw(canvas);
}
}
private GoogleProgressDrawable checkIndeterminateDrawable() {
Drawable ret = getIndeterminateDrawable();
if (ret == null || !(ret instanceof GoogleProgressDrawable))
throw new RuntimeException(
"The drawable is not a SmoothProgressDrawable");
return (GoogleProgressDrawable) ret;
}
@Override
public void setInterpolator(Interpolator interpolator) {
super.setInterpolator(interpolator);
Drawable ret = getIndeterminateDrawable();
if (ret != null && (ret instanceof GoogleProgressDrawable))
((GoogleProgressDrawable) ret).setInterpolator(interpolator);
}
public void setSmoothProgressDrawableInterpolator(Interpolator interpolator) {
checkIndeterminateDrawable().setInterpolator(interpolator);
}
public void setSmoothProgressDrawableColors(int[] colors) {
checkIndeterminateDrawable().setColors(colors);
}
public void setSmoothProgressDrawableColor(int color) {
checkIndeterminateDrawable().setColor(color);
}
public void setSmoothProgressDrawableSpeed(float speed) {
checkIndeterminateDrawable().setSpeed(speed);
}
public void setSmoothProgressDrawableProgressiveStartSpeed(float speed) {
checkIndeterminateDrawable().setProgressiveStartSpeed(speed);
}
public void setSmoothProgressDrawableProgressiveStopSpeed(float speed) {
checkIndeterminateDrawable().setProgressiveStopSpeed(speed);
}
public void setSmoothProgressDrawableSectionsCount(int sectionsCount) {
checkIndeterminateDrawable().setSectionsCount(sectionsCount);
}
public void setSmoothProgressDrawableSeparatorLength(int separatorLength) {
checkIndeterminateDrawable().setSeparatorLength(separatorLength);
}
public void setSmoothProgressDrawableStrokeWidth(float strokeWidth) {
checkIndeterminateDrawable().setStrokeWidth(strokeWidth);
}
public void setSmoothProgressDrawableReversed(boolean reversed) {
checkIndeterminateDrawable().setReversed(reversed);
}
public void setSmoothProgressDrawableMirrorMode(boolean mirrorMode) {
checkIndeterminateDrawable().setMirrorMode(mirrorMode);
}
public void setProgressiveStartActivated(boolean progressiveStartActivated) {
checkIndeterminateDrawable().setProgressiveStartActivated(
progressiveStartActivated);
}
public void setSmoothProgressDrawableCallbacks(
GoogleProgressDrawable.Callbacks listener) {
checkIndeterminateDrawable().setCallbacks(listener);
}
public void setSmoothProgressDrawableBackgroundDrawable(Drawable drawable) {
checkIndeterminateDrawable().setBackgroundDrawable(drawable);
}
public void setSmoothProgressDrawableUseGradients(boolean useGradients) {
checkIndeterminateDrawable().setUseGradients(useGradients);
}
public void progressiveStart() {
checkIndeterminateDrawable().progressiveStart();
}
public void progressiveStop() {
checkIndeterminateDrawable().progressiveStop();
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android
# ProgressBar
# Android自定义View 使用PathMeasure简单模仿系统ProgressBar(四)
# Android编程实现自定义ProgressBar样式示例(背景色及一级、二级进度条颜色)
# Android三种方式实现ProgressBar自定义圆形进度条
# Android编程ProgressBar自定义样式之动画模式实现方法
# android ListView和ProgressBar(进度条控件)的使用方法
# Android ProgressBar进度条和ProgressDialog进度框的展示DEMO
# Android ProgressBar进度条使用详解
# Android编程之自定义ProgressBar示例
# 大家分享
# 具体内容
# 大家多多
# styleable
# GoogleStyleProgressBar
# color
# return
# getResources
# obtainStyledAttributes
# sectionsCount
# getInteger
# GoogleStyleProgressBar_sections_count
# getColor
# GoogleStyleProgressBar_color
# default_color
# googleProgressStyle
# defStyle
# super
# null
# attrs
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法
Laravel如何使用Livewire构建动态组件?(入门代码)
魔方云NAT建站如何实现端口转发?
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤
独立制作一个网站多少钱,建立网站需要花多少钱?
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
如何用5美元大硬盘VPS安全高效搭建个人网站?
Laravel如何创建自定义Artisan命令?(代码示例)
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
微信推文制作网站有哪些,怎么做微信推文,急?
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
Linux系统命令中tree命令详解
如何快速配置高效服务器建站软件?
Python图片处理进阶教程_Pillow滤镜与图像增强
如何在七牛云存储上搭建网站并设置自定义域名?
香港服务器部署网站为何提示未备案?
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
JavaScript如何实现音频处理_Web Audio API如何工作?
手机网站制作与建设方案,手机网站如何建设?
如何有效防御Web建站篡改攻击?
如何快速完成中国万网建站详细流程?
北京的网站制作公司有哪些,哪个视频网站最好?
如何快速搭建高效简练网站?
谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
如何在腾讯云服务器快速搭建个人网站?
Python函数文档自动校验_规范解析【教程】
简历没回改:利用AI润色让你的文字更专业
新三国志曹操传主线渭水交兵攻略
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
微信小程序 闭包写法详细介绍
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
想要更高端的建设网站,这些原则一定要坚持!
Python正则表达式进阶教程_复杂匹配与分组替换解析
Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧
EditPlus 正则表达式 实战(3)
香港服务器如何优化才能显著提升网站加载速度?
javascript中闭包概念与用法深入理解
如何挑选最适合建站的高性能VPS主机?
详解Oracle修改字段类型方法总结
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
Laravel怎么在Blade中安全地输出原始HTML内容
制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?
大连 网站制作,大连天途有线官网?

