android自定义view实现progressbar的效果

时间:2022-10-25 13:27:03

一键清理是很多Launcher都会带有的功能,其效果也比较美观。实现方式也许有很多中,其中常见的是使用图片drawable来完成的,具体可以参考这篇文章:模仿实现360桌面水晶球式的一键清理特效。本文另辟蹊径,使用自定义View来完成同样的效果,性能、效率更高。

  ProgressWheel相信很多人并不陌生,我参考了其中一些代码。有意思的是,看完它的代码,发现其中隐藏了没有使用的矩形进度条,因为项目名字的原因我估计也永远不会出现了吧。所以就在其基础之上增增改改,形成了ProgressRectangle。为了节省时间,第一版本并没有使用自定义的属性,这个以后再添加吧,毕竟有些鸡肋。代码如下:
  1. /**
  2. *
  3. */
  4. package com.kince.progressrectangle;
  5. import android.content.Context;
  6. import android.graphics.Canvas;
  7. import android.graphics.Color;
  8. import android.graphics.Paint;
  9. import android.graphics.RectF;
  10. import android.graphics.Paint.Style;
  11. import android.os.Handler;
  12. import android.os.Message;
  13. import android.util.AttributeSet;
  14. import android.util.Log;
  15. import android.view.View;
  16. /**
  17. * @author kince
  18. * @category 仿solo桌面内存清理效果
  19. * @since 2014.7.30
  20. * @version 1.0.0
  21. * {@link }
  22. *
  23. */
  24. public class ProgressRectangle extends View {
  25. // Sizes (with defaults)
  26. private int layout_height = 0;
  27. private int layout_width = 0;
  28. // Colors (with defaults)
  29. private int bgColor = Color.TRANSPARENT;
  30. private int progressColor = 0xFF339933;
  31. // Paints
  32. private Paint progressPaint = new Paint();
  33. private Paint bgPaint = new Paint();
  34. private Paint titlePaint = new Paint();
  35. private Paint usePaint = new Paint();
  36. // Rectangles
  37. private RectF rectBgBounds = new RectF();
  38. private RectF rectProgressBounds = new RectF();
  39. int progress = 100;
  40. boolean isProgress;
  41. private Handler spinHandler = new Handler() {
  42. /**
  43. * This is the code that will increment the progress variable and so
  44. * spin the wheel
  45. */
  46. @Override
  47. public void handleMessage(Message msg) {
  48. invalidate();
  49. // super.handleMessage(msg);
  50. }
  51. };
  52. /**
  53. * @param context
  54. */
  55. public ProgressRectangle(Context context) {
  56. super(context);
  57. // TODO Auto-generated constructor stub
  58. }
  59. /**
  60. * @param context
  61. * @param attrs
  62. */
  63. public ProgressRectangle(Context context, AttributeSet attrs) {
  64. super(context, attrs);
  65. // TODO Auto-generated constructor stub
  66. }
  67. /**
  68. * @param context
  69. * @param attrs
  70. * @param defStyleAttr
  71. */
  72. public ProgressRectangle(Context context, AttributeSet attrs,
  73. int defStyleAttr) {
  74. super(context, attrs, defStyleAttr);
  75. // TODO Auto-generated constructor stub
  76. }
  77. @Override
  78. protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  79. // TODO Auto-generated method stub
  80. super.onSizeChanged(w, h, oldw, oldh);
  81. // Share the dimensions
  82. layout_width = w;
  83. Log.i("layout_width", layout_width + "");
  84. layout_height = h;
  85. Log.i("layout_height", layout_height + "");
  86. setupBounds();
  87. setupPaints();
  88. invalidate();
  89. }
  90. private void setupPaints() {
  91. // TODO Auto-generated method stub
  92. bgPaint.setColor(bgColor);
  93. bgPaint.setAntiAlias(true);
  94. bgPaint.setStyle(Style.FILL);
  95. progressPaint.setColor(progressColor);
  96. progressPaint.setAntiAlias(true);
  97. progressPaint.setStyle(Style.FILL);
  98. titlePaint.setColor(Color.WHITE);
  99. titlePaint.setTextSize(20);
  100. titlePaint.setAntiAlias(true);
  101. titlePaint.setStyle(Style.FILL);
  102. usePaint.setColor(Color.WHITE);
  103. usePaint.setAntiAlias(true);
  104. usePaint.setTextSize(30);
  105. usePaint.setStyle(Style.FILL);
  106. }
  107. private void setupBounds() {
  108. // TODO Auto-generated method stub
  109. int width = getWidth(); // this.getLayoutParams().width;
  110. Log.i("width", width + "");
  111. int height = getHeight(); // this.getLayoutParams().height;
  112. Log.i("height", height + "");
  113. rectBgBounds = new RectF(0, 0, width, height);
  114. }
  115. @Override
  116. protected void onDraw(Canvas canvas) {
  117. // TODO Auto-generated method stub
  118. super.onDraw(canvas);
  119. canvas.drawRect(rectBgBounds, bgPaint);
  120. Log.i("progress", progress + "");
  121. rectProgressBounds = new RectF(0, 0, progress, layout_height);
  122. canvas.drawRect(rectProgressBounds, progressPaint);
  123. canvas.drawText("使用内存", 25, 25, titlePaint);
  124. canvas.drawText(progress + "M" + "/1024M", 25, 60, usePaint);
  125. }
  126. /**
  127. * Increment the progress by 1 (of 100)
  128. */
  129. public void incrementProgress() {
  130. isProgress = true;
  131. progress++;
  132. if (progress > 200)
  133. progress = 100;
  134. // setText(Math.round(((float) progress / 360) * 100) + "%");
  135. spinHandler.sendEmptyMessage(0);
  136. }
  137. /**
  138. * Increment the progress by 1 (of 100)
  139. */
  140. public void unIncrementProgress() {
  141. isProgress = true;
  142. progress--;
  143. if (progress < 1)
  144. progress = 100;
  145. // setText(Math.round(((float) progress / 360) * 100) + "%");
  146. spinHandler.sendEmptyMessage(0);
  147. }
  148. /**
  149. * Set the progress to a specific value
  150. */
  151. public void setProgress(int i) {
  152. progress = i;
  153. spinHandler.sendEmptyMessage(0);
  154. }
  155. }
  实现思路也是很简单的,就是在onDraw()方法里面绘制进度条的背景以及进度,进度的参数是传递进来的数值。Activity的代码如下:
  1. package com.kince.progressrectangle;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.util.Log;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.widget.Button;
  8. public class RecActivity extends Activity {
  9. boolean running;
  10. int progress = 0;
  11. ProgressRectangle progressRectangle;
  12. @Override
  13. protected void onCreate(Bundle savedInstanceState) {
  14. // TODO Auto-generated method stub
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.activity_rec);
  17. progressRectangle=(ProgressRectangle) findViewById(R.id.progressBar);
  18. final Runnable r = new Runnable() {
  19. public void run() {
  20. running = true;
  21. while(progress<100) {
  22. progressRectangle.incrementProgress();
  23. progress++;
  24. try {
  25. Thread.sleep(15);
  26. } catch (InterruptedException e) {
  27. // TODO Auto-generated catch block
  28. e.printStackTrace();
  29. }
  30. }
  31. while(progress>0) {
  32. progressRectangle.unIncrementProgress();
  33. progress--;
  34. try {
  35. Thread.sleep(15);
  36. } catch (InterruptedException e) {
  37. // TODO Auto-generated catch block
  38. e.printStackTrace();
  39. }
  40. }
  41. running = false;
  42. }
  43. };
  44. Button increment = (Button) findViewById(R.id.btn_increment);
  45. increment.setOnClickListener(new OnClickListener() {
  46. public void onClick(View v) {
  47. if(!running) {
  48. progress = 0;
  49. Thread s = new Thread(r);
  50. s.start();
  51. }
  52. }
  53. });
  54. }
  55. }

效果如下:

android自定义view实现progressbar的效果
android自定义view实现progressbar的效果

  总体来说,就是通过绘制矩形来达到目的。当然,在实际使用中的效果还是有所差异的,欢迎大家反馈、交流。
  <--
  csdn下载:http://download.csdn.net/detail/wangjinyu501/7694607
  gitub地址:https://github.com/wangjinyu501/ProgressRectangle
  -->

android自定义view实现progressbar的效果的更多相关文章

  1. Android自定义View之ProgressBar出场记

    关于自定义View,我们前面已经有三篇文章在介绍了,如果筒子们还没阅读,建议先看一下,分别是android自定义View之钟表诞生记.android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检 ...

  2. Android 自定义view实现水波纹效果

    http://blog.csdn.net/tianjian4592/article/details/44222565 在实际的开发中,很多时候还会遇到相对比较复杂的需求,比如产品妹纸或UI妹纸在哪看了 ...

  3. android自定义View之3D索引效果

    效果图: 我的小霸王太卡了. 最近工作比较忙,今天搞了一下午才搞出来这个效果,这种效果有很多种实现方式,最常见的应该是用贝塞尔曲线实现的.今天我们来看另一种不同的实现方式,只需要用到 canvas.s ...

  4. Android自定义View——刮刮卡效果

    想要红包的实现效果的可以关注我的博客,仿饿了么红包 下层图片:我们的红包的图片 上层图片:有两部分 一部分是灰色背景 一部分是拥有透明度为0,并且模式为交集的画笔 使用滑动监听,滑动时,用透明度为0的 ...

  5. Android自定义View 画弧形&comma;文字&comma;并增加动画效果

    一个简单的Android自定义View的demo,画弧形,文字,开启一个多线程更新ui界面,在子线程更新ui是不允许的,但是View提供了方法,让我们来了解下吧. 1.封装一个抽象的View类   B ...

  6. Android自定义View(LimitScrollerView-仿天猫广告栏上下滚动效果)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/53303872 本文出自:[openXu的博客] 1分析 2定义组合控件布局 3继承最外层控件 ...

  7. 我的Android进阶之旅------>Android自定义View实现带数字的进度条(NumberProgressBar)

    今天在Github上面看到一个来自于 daimajia所写的关于Android自定义View实现带数字的进度条(NumberProgressBar)的精彩案例,在这里分享给大家一起来学习学习!同时感谢 ...

  8. Android 自定义View合集

    自定义控件学习 https://github.com/GcsSloop/AndroidNote/tree/master/CustomView 小良自定义控件合集 https://github.com/ ...

  9. Android 自定义 view(三)&mdash&semi;&mdash&semi; onDraw 方法理解

    前言: 上一篇已经介绍了用自己定义的属性怎么简单定义一个view<Android 自定义view(二) -- attr 使用>,那么接下来我们继续深究自定义view,下一步将要去简单理解自 ...

随机推荐

  1. 判断手机端用户打开页面时是android还是ios&comma;并将判断结果通过ajax返回给url接口,传递回去

    首先判断页面是android还是ios,然后利用ajax将结果通过接口url返回回去,记录到log日志中,以统计android和ios用户访问该页面的数量(数据统计) <script type= ...

  2. Mysql的一些常用命令

    Mysql基本操作 创建表: create table test01_02(id varchar(50) not null auto_increment primary key, name nvarc ...

  3. 21Mybatis&lowbar;订单商品数据模型&lowbar;一对多查询——resultMap方式

    这篇文章延续订单商品数据模型,这张讲述的是一对多的查询.(用resultMap) 给出几张表的内容: User表:

  4. 仿AS语法来写HTML5—第1章,显示一张图片

    最近开始学习html5,因为一直都是研究as,所以还是觉得as顺眼一点,但是html5也不能不学,于是就想出了,可以把html5用as的语法来写出来,做游戏应该来的比较顺手一些,下面开始第一篇 第一篇 ...

  5. bzoj1641 &lbrack;Usaco2007 Nov&rsqb;Cow Hurdles 奶牛跨栏

    Description Farmer John 想让她的奶牛准备郡级跳跃比赛,贝茜和她的伙伴们正在练习跨栏.她们很累,所以她们想消耗最少的能量来跨栏. 显然,对于一头奶牛跳过几个矮栏是很容易的,但是高 ...

  6. &lpar;转&rpar;微信禁用右上角的分享按钮,WeixinJSBridge API以及隐藏分享的子按钮等菜单项

    <!--禁用微信分享按钮--> <script> function onBridgeReady() { WeixinJSBridge.call('hideOptionMenu' ...

  7. Otto事件总线框架的使用

    Otto是一个在Android中的事件总线框架,它是square的一个开源框架,具体介绍点击这里,项目下载点击这里 为什么要使用Otto事件总线: 通常来说在Android中: 1.Activity与 ...

  8. 新建SpringBoot项目运行页面报错Whitelabel Error Page This application has no explicit mapping for &sol;error&comma; so yo

    新建SpringBoot项目运行页面报错Whitelabel Error Page This application has no explicit mapping for /error, so yo ...

  9. 将struct转为map

    package main import ( "fmt" "reflect" "time" ) type User struct { Id i ...

  10. golang&lpar;01&rpar; linux环境搭建和编码

    1 在自己的工作目录下建立一个goproject文件夹 /home/secondtonone/goproject 2 在文件夹下建立如下三个文件 bin pkg srcbin 保存执行go insta ...