1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Android 带文字的进度条 文字颜色随进度条的增加而渐变的效果

Android 带文字的进度条 文字颜色随进度条的增加而渐变的效果

时间:2021-01-16 22:10:09

相关推荐

Android 带文字的进度条 文字颜色随进度条的增加而渐变的效果

Android自带的ProgressBar是不带文字的,加文字的话可以参考这篇博客:/lixiaodaoaaa/article/details/9852327

本篇博客主要讲有了文字之后的ProgressBar文字的颜色随着进度条增加,看起来有一种进度条覆盖了文字的颜色,模仿点击下载和暂停等效果,效果如下:

代码中通过不断的重载setProgress方法,不停的执行onDraw方法,采用图像混合模式,对进度条和文字进行进度条重绘。主要代码如下:

@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);mWidth = getWidth() * mProgress / 100;//进度作一下处理,解决不同分辨率的适配问题mPaint.getTextBounds(mPercentText, 0, mPercentText.length(), mPercentRect);//为了获取文字的宽高以及坐标位置,get之后,rect.centerX才有值mPaint.getTextBounds(mPauseText, 0, mPauseText.length(), mPauseRect);int textX = (getWidth() / 2) - mPauseRect.centerX();//获取“暂停”文字的中心横坐标int textY = (getHeight() / 2) - mPauseRect.centerY();int percentX = (getWidth() / 2) - mPercentRect.centerX();//获取百分比文字的中心横坐标int percentY = (getHeight() / 2) - mPercentRect.centerY();Bitmap srcBitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);Canvas srcCanvas = new Canvas(srcBitmap);switch (mStateType) {case Constant.DEFAULT://默认初始化状态drawTextUI(canvas, textX, textY, mDefaultText, srcBitmap, srcCanvas);break;case Constant.PAUSE:drawTextUI(canvas, textX, textY, mPauseText, srcBitmap, srcCanvas);break;case Constant.DOWNLOAD:drawTextUI(canvas, percentX, percentY, mPercentText, srcBitmap, srcCanvas);break;case Constant.FINISH:mPaint.setColor(Color.WHITE);canvas.drawText(mFinishText, textX, textY, mPaint);break;default:drawTextUI(canvas, textX, textY, mDefaultText, srcBitmap, srcCanvas);break;

其中的drawTextUI方法主要控制图像混合模式,从而实现渐变,核心代码如下:

mPaint.setXfermode(mPorterDuffXfermode);// 设置混合模式mPaint.setColor(Color.WHITE);RectF rectF = new RectF(0, 0, mWidth, getHeight());//mWidth是不断变化的// 绘制源图形srcCanvas.drawRect(rectF, mPaint);// 绘制目标图canvas.drawBitmap(srcBitmap, 0, 0, null);// 清除混合模式mPaint.setXfermode(null);// 恢复画笔颜色mPaint.setColor(Color.parseColor("#00b38a"));

MainActivity主要控制下载和暂停的部分逻辑:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{private TextProgressBar mProgressView;private final int FOR_SCROLL = 1;private final int DELAY = 500;private float mProgress;private int mStateType = Constant.DOWNLOAD;private Handler mHandler = new Handler() {@Overridepublic void handleMessage(Message msg) {super.handleMessage(msg);switch (msg.what) {case FOR_SCROLL:if(mProgress < 100) {mProgress += 4.0;mProgressView.setProgress(mProgress);mProgressView.setStateType(Constant.DOWNLOAD);mHandler.sendEmptyMessageDelayed(FOR_SCROLL, DELAY);} else {mStateType = Constant.FINISH;mProgressView.setProgress(100);mProgressView.setStateType(mStateType);}break;}}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mProgressView = (TextProgressBar) findViewById(R.id.textProgress);mProgressView.setOnClickListener(this);mProgressView.setStateType(Constant.DEFAULT);String text = String.format("%.1f%%", 53.6897);Toast.makeText(this, text, Toast.LENGTH_SHORT).show();}@Overridepublic void onClick(View v) {if(v == null) {return;}if(v.getId() == R.id.textProgress) {switch (mStateType) {case Constant.DOWNLOAD:mStateType = Constant.PAUSE;mHandler.sendEmptyMessageDelayed(FOR_SCROLL, DELAY);break;case Constant.PAUSE:mStateType = Constant.DOWNLOAD;mProgressView.setStateType(Constant.PAUSE);mHandler.removeMessages(FOR_SCROLL);break;case Constant.FINISH:Toast.makeText(MainActivity.this, getResources().getString(R.string.ok), Toast.LENGTH_SHORT).show();break;}}}@Overrideprotected void onDestroy() {super.onDestroy();mHandler.removeMessages(FOR_SCROLL);}}

代码未作优化,大体上实现大概功能,有问题一起交流

项目源码,点击下载

-1-15更新

因为之前的源码链接积分被系统改的过高,特地重新上传了一份。

点击下载

-3-2更新

也是因为积分无缘无故被改高了,又重新手动传了一份

点击下载

9月27日14:55:10更新

同上,积分问题,又被改成了50积分,再次上传一份

点击下载

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。