自定义Material风格Android进度条
60 浏览量
更新于2024-09-04
收藏 55KB PDF 举报
"创建Android自定义Material风格的进度条效果"
在Android开发中,为了提供更好的用户体验,我们常常需要对系统默认的UI组件进行自定义,以满足特定的设计需求。本示例主要讲解如何实现一个自定义的Material设计风格的圆形进度条。通过自定义View,我们可以调整进度条的颜色、宽度以及其它视觉效果,使其更符合应用的整体风格。
首先,我们来看一下描述中给出的布局文件。这个布局包含了一个LinearLayout,设置了背景颜色为白色,并且居中显示。LinearLayout内嵌套了一个名为CircleProgressBar的自定义View,这是我们的自定义进度条。CircleProgressBar的宽度和高度都设置为60dp,进度条的颜色为#566da9,线条宽度为3dp。
要创建自定义的CircleProgressBar,我们需要编写一个继承自View的类。在这个类中,我们将实现进度条的绘制逻辑。关键步骤包括:
1. 定义属性:在res/values/attrs.xml文件中声明自定义属性,如`mlpb_progress_color`用于设置进度条颜色,`mlpb_progress_stoke_width`用于设置线条宽度等。这样可以在XML布局文件中方便地设置这些属性。
```xml
<declare-styleable name="CircleProgressBar">
<attr name="mlpb_inner_radius" format="dimension"/>
<attr name="mlpb_background_color" format="color"/>
<attr name="mlpb_progress_color" format="color"/>
<!-- 其它需要的属性 -->
</declare-styleable>
```
2. 构造函数:在CircleProgressBar类中,初始化画布和画笔,读取自定义属性值。
```java
public CircleProgressBar(Context context, AttributeSet attrs) {
super(context, attrs);
// 使用TypedArray获取自定义属性值
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CircleProgressBar, 0, 0);
try {
mProgressColor = a.getColor(R.styleable.CircleProgressBar_mlpb_progress_color, DEFAULT_PROGRESS_COLOR);
mProgressStrokeWidth = a.getDimensionPixelSize(R.styleable.CircleProgressBar_mlpb_progress_stoke_width, DEFAULT_STROKE_WIDTH);
// 获取其他属性值
} finally {
a.recycle();
}
}
```
3. 重写onDraw()方法:这是绘制自定义视图的核心部分。在这里,我们将根据进度值画出进度条和背景圆环。
```java
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 绘制背景圆环
drawBackground(canvas);
// 绘制进度条
drawProgress(canvas);
}
private void drawBackground(Canvas canvas) {
// 创建背景圆环的画笔
Paint backgroundPaint = new Paint();
backgroundPaint.setColor(getBackgroundColor());
backgroundPaint.setStyle(Paint.Style.STROKE);
backgroundPaint.setStrokeWidth(mProgressStrokeWidth);
// 绘制背景圆环
canvas.drawCircle(getMeasuredWidth() / 2, getMeasuredHeight() / 2, getInnerRadius(), backgroundPaint);
}
private void drawProgress(Canvas canvas) {
// 创建进度条的画笔
Paint progressPaint = new Paint();
progressPaint.setColor(mProgressColor);
progressPaint.setStyle(Paint.Style.STROKE);
progressPaint.setStrokeWidth(mProgressStrokeWidth);
// 根据进度值计算弧度
float sweepAngle = (float) (getProgress() / 100 * 360);
// 绘制进度条
canvas.drawArc(new RectF(0, 0, getMeasuredWidth(), getMeasuredHeight()), -90, sweepAngle, false, progressPaint);
}
```
4. 计算内部半径和获取背景颜色:根据进度条的宽度,计算实际绘制的内圆半径,以便在有限的空间内绘制圆环。同时,提供一个方法获取背景颜色。
```java
private float getInnerRadius() {
return (getMeasuredWidth() - mProgressStrokeWidth) / 2;
}
private int getBackgroundColor() {
return getResources().getColor(R.color.default_background_color); // 或者从属性中获取
}
```
5. 进度更新:为了动态更新进度,需要添加一个方法来设置和获取进度值,并在进度改变时调用`invalidate()`方法重新绘制。
```java
public void setProgress(int progress) {
if (mProgress != progress) {
mProgress = Math.min(Math.max(progress, 0), 100);
invalidate(); // 通知视图需要重绘
}
}
public int getProgress() {
return mProgress;
}
```
通过以上步骤,我们就成功创建了一个自定义的Material风格进度条。在实际项目中,可以根据需求进一步扩展,例如添加动画效果,使进度条平滑过渡,或者添加更多自定义属性以提供更多定制选项。自定义View是Android开发中的一个重要技巧,能够帮助开发者构建独特且具有吸引力的用户界面。
128 浏览量
181 浏览量
点击了解资源详情
2015-04-22 上传
2020-08-31 上传
2016-09-06 上传
点击了解资源详情
2019-08-02 上传
2019-08-02 上传
weixin_38504417
- 粉丝: 5
- 资源: 937
最新资源
- Fisher Iris Setosa数据的主成分分析及可视化- Matlab实现
- 深入理解JavaScript类与面向对象编程
- Argspect-0.0.1版本Python包发布与使用说明
- OpenNetAdmin v09.07.15 PHP项目源码下载
- 掌握Node.js: 构建高性能Web服务器与应用程序
- Matlab矢量绘图工具:polarG函数使用详解
- 实现Vue.js中PDF文件的签名显示功能
- 开源项目PSPSolver:资源约束调度问题求解器库
- 探索vwru系统:大众的虚拟现实招聘平台
- 深入理解cJSON:案例与源文件解析
- 多边形扩展算法在MATLAB中的应用与实现
- 用React类组件创建迷你待办事项列表指南
- Python库setuptools-58.5.3助力高效开发
- fmfiles工具:在MATLAB中查找丢失文件并列出错误
- 老枪二级域名系统PHP源码简易版发布
- 探索DOSGUI开源库:C/C++图形界面开发新篇章