自定义样式及带数字ProgressBar
2015-09-25 17:13
555 查看
Android系统自带的ProgressBar样式简单,很多时候不能满足项目需求。最近因项目需要,下了一番功夫研究了一下并自定义了一个ProgressBar,特此记录,并希望能帮助到有需要的朋友们~~~
先上效果图:
其中第一个为系统样式,不多说。
第二个为自定义样式的ProgressBar。具体实现方式:
1.在drawable目录下新建一个xml文件,本例中为progress_drawable.xml,具体代码如下:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 设置背景资源 --> <item android:id="@android:id/background">
<nine-patch android:src="@drawable/img_39e3c5"/> </item>
<!-- 设置进度条资源 --> <item android:id="@android:id/progress">
<clip> <nine-patch android:src="@drawable/img_94fbdf"/> </clip> </item></layer-list>定义了一个layer-list标签的图层样式,其中包含的两个标签分别表示ProgressBar的背景样式及进度样式。
2.在布局文件中将步骤1中的样式指定给ProgressBar的progressDrawable属性,具体代码如下:
第三个样式为带文字的ProgressBar,先上代码
在这个自定义View中,核心代码为onDraw()方法,其中设置了绘制区域,并通过修改文字绘制的起始点坐标,最后调用drawText方法绘制。
是否显示右端的文字是通过setDrawSecondTxt()方法设置的,另外还提供了设置文字大小和文字颜色的API,可根据需求定制文字样式。
如文章有错漏或demo有BUG,欢迎指正,求教育,求教导~~~
源码下载地址
先上效果图:
其中第一个为系统样式,不多说。
第二个为自定义样式的ProgressBar。具体实现方式:
1.在drawable目录下新建一个xml文件,本例中为progress_drawable.xml,具体代码如下:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 设置背景资源 --> <item android:id="@android:id/background">
<nine-patch android:src="@drawable/img_39e3c5"/> </item>
<!-- 设置进度条资源 --> <item android:id="@android:id/progress">
<clip> <nine-patch android:src="@drawable/img_94fbdf"/> </clip> </item></layer-list>定义了一个layer-list标签的图层样式,其中包含的两个标签分别表示ProgressBar的背景样式及进度样式。
2.在布局文件中将步骤1中的样式指定给ProgressBar的progressDrawable属性,具体代码如下:
<ProgressBar android:id="@+id/custom_pb" android:layout_marginTop="5dp" android:progressDrawable="@drawable/progress_drawable" style="?android:attr/progressBarStyleHorizontal" android:layout_width="200dp" android:layout_height="35dp"/>
第三个样式为带文字的ProgressBar,先上代码
package com.bruce.customprogressbardemo.view; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.util.AttributeSet; import android.widget.ProgressBar; /** * Created by Bruce on 2015/9/23. */ public class DigitProgressBar extends ProgressBar { private float textSize = 45.0f; private Paint mPaint; private String mText, mSecondText; private Rect mRect; private int textColor = 0xFF2A2A2A; private boolean drawSecondTxt = false; public DigitProgressBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(); } public DigitProgressBar(Context context, AttributeSet attrs) { super(context, attrs); init(); } public DigitProgressBar(Context context) { super(context); init(); } private void init() { mPaint = new Paint(Paint.FAKE_BOLD_TEXT_FLAG);//设置文字粗体 mPaint.setAntiAlias(true); // 设置画笔的锯齿效果 mPaint.setColor(textColor); mPaint.setTextSize(textSize); mRect = new Rect(); } @Override public synchronized void setProgress(int progress) { setProgressText(progress); super.setProgress(progress); } private void setProgressText(int progress) { mText = formatDecim2Per(progress * 1.0 / getMax() * 100); mSecondText = formatDecim2Per((1 - (progress * 1.0 / getMax())) * 100); } @Override protected synchronized void onDraw(Canvas canvas) { super.onDraw(canvas); //绘制第一个百分比 mPaint.getTextBounds(mText, 0, mText.length(), mRect); int x = 25; int y = (getHeight() / 2) - mRect.centerY(); canvas.drawText(mText, x, y, mPaint); //绘制第二个百分比 if (drawSecondTxt) { mPaint.getTextBounds(mSecondText, 0, mSecondText.length(), mRect); int secondx = getWidth() - 25 - mRect.width(); int secondy = (getHeight() / 2) - mRect.centerY(); canvas.drawText(mSecondText, secondx, secondy, mPaint); } } public float getTextSize() { return textSize; } public void setTextSize(float textSize) { this.textSize = textSize; } public int getTextColor() { return textColor; } public void setTextColor(int textColor) { this.textColor = textColor; } public boolean isDrawSecondTxt() { return drawSecondTxt; } public void setDrawSecondTxt(boolean drawSecondTxt) { this.drawSecondTxt = drawSecondTxt; } public static String formatDecim2Per(double decim) { String result = String.format("%.2f", decim); return result + "%"; } }
在这个自定义View中,核心代码为onDraw()方法,其中设置了绘制区域,并通过修改文字绘制的起始点坐标,最后调用drawText方法绘制。
是否显示右端的文字是通过setDrawSecondTxt()方法设置的,另外还提供了设置文字大小和文字颜色的API,可根据需求定制文字样式。
如文章有错漏或demo有BUG,欢迎指正,求教育,求教导~~~
源码下载地址
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories