android自定义view实现progressbar的效果

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

ProgressWheel相信很多人并不陌生,我参考了其中一些代码。有意思的是,看完它的代码,发现其中隐藏了没有使用的矩形进度条,因为项目名字的原因我估计也永远不会出现了吧。所以就在其基础之上增增改改,形成了ProgressRectangle。为了节省时间,第一版本并没有使用自定义的属性,这个以后再添加吧,毕竟有些鸡肋。代码如下:

/**  
*   
*/  
package com.kince.progressrectangle;  
 
import android.content.Context;  
import android.graphics.Canvas;  
import android.graphics.Color;  
import android.graphics.Paint;  
import android.graphics.RectF;  
import android.graphics.Paint.Style;  
import android.os.Handler;  
import android.os.Message;  
import android.util.AttributeSet;  
import android.util.Log;  
import android.view.View;  
 
/**  
* @author kince  
* @category 仿solo桌面内存清理效果  
* @since 2014.7.30  
* @version 1.0.0  
* {@link }  
*   
*/  
public class ProgressRectangle extends View {  
 
     // Sizes (with defaults)  
     private int layout_height = 0;  
     private int layout_width = 0;  
     // Colors (with defaults)  
     private int bgColor = Color.TRANSPARENT;  
     private int progressColor = 0xFF339933;  
     // Paints  
     private Paint progressPaint = new Paint();  
     private Paint bgPaint = new Paint();  
     private Paint titlePaint = new Paint();  
     private Paint usePaint = new Paint();  
     // Rectangles  
     private RectF rectBgBounds = new RectF();  
     private RectF rectProgressBounds = new RectF();  
 
     int progress = 100;  
     boolean isProgress;  
 
     private Handler spinHandler = new Handler() {  
          /**  
          * This is the code that will increment the progress variable and so  
          * spin the wheel  
          */  
          @Override  
          public void handleMessage(Message msg) {  
               invalidate();  
 
               // super.handleMessage(msg);  
          }  
     };  
 
     /**  
     * @param context  
     */  
     public ProgressRectangle(Context context) {  
          super(context);  
          // TODO Auto-generated constructor stub  
     }  
 
     /**  
     * @param context  
     * @param attrs  
     */  
     public ProgressRectangle(Context context, AttributeSet attrs) {  
          super(context, attrs);  
          // TODO Auto-generated constructor stub  
     }  
 
     /**  
     * @param context  
     * @param attrs  
     * @param defStyleAttr  
     */  
     public ProgressRectangle(Context context, AttributeSet attrs,  
               int defStyleAttr) {  
          super(context, attrs, defStyleAttr);  
          // TODO Auto-generated constructor stub  
     }  
 
     @Override  
     protected void onSizeChanged(int w, int h, int oldw, int oldh) {  
          // TODO Auto-generated method stub  
          super.onSizeChanged(w, h, oldw, oldh);  
          // Share the dimensions  
 layout_width = w;  
          Log.i("layout_width", layout_width + "");  
 
 layout_height = h;  
          Log.i("layout_height", layout_height + "");  
          setupBounds();  
          setupPaints();  
          invalidate();  
 
     }  
 
     private void setupPaints() {  
          // TODO Auto-generated method stub  
          bgPaint.setColor(bgColor);  
          bgPaint.setAntiAlias(true);  
          bgPaint.setStyle(Style.FILL);  
 
          progressPaint.setColor(progressColor);  
          progressPaint.setAntiAlias(true);  
          progressPaint.setStyle(Style.FILL);  
 
          titlePaint.setColor(Color.WHITE);  
          titlePaint.setTextSize(20);  
          titlePaint.setAntiAlias(true);  
          titlePaint.setStyle(Style.FILL);  
 
          usePaint.setColor(Color.WHITE);  
          usePaint.setAntiAlias(true);  
          usePaint.setTextSize(30);  
          usePaint.setStyle(Style.FILL);  
 
     }  
 
     private void setupBounds() {  
          // TODO Auto-generated method stub  
          int width = getWidth(); // this.getLayoutParams().width;  
          Log.i("width", width + "");  
          int height = getHeight(); // this.getLayoutParams().height;  
          Log.i("height", height + "");  
 rectBgBounds = new RectF(0, 0, width, height);  
     }  
 
     @Override  
     protected void onDraw(Canvas canvas) {  
          // TODO Auto-generated method stub  
          super.onDraw(canvas);  
 
          canvas.drawRect(rectBgBounds, bgPaint);  
 
          Log.i("progress", progress + "");  
 rectProgressBounds = new RectF(0, 0, progress, layout_height);  
          canvas.drawRect(rectProgressBounds, progressPaint);  
          canvas.drawText("使用内存", 25, 25, titlePaint);  
          canvas.drawText(progress + "M" + "/1024M", 25, 60, usePaint);  
 
     }  
 
     /**  
     * Increment the progress by 1 (of 100)  
     */  
     public void incrementProgress() {  
 isProgress = true;  
          progress++;  
          if (progress > 200)  
 progress = 100;  
          // setText(Math.round(((float) progress / 360) * 100) + "%");  
          spinHandler.sendEmptyMessage(0);  
     }  
 
     /**  
     * Increment the progress by 1 (of 100)  
     */  
     public void unIncrementProgress() {  
 isProgress = true;  
          progress--;  
          if (progress < 1)  
 progress = 100;  
          // setText(Math.round(((float) progress / 360) * 100) + "%");  
          spinHandler.sendEmptyMessage(0);  
     }  
 
     /**  
     * Set the progress to a specific value  
     */  
     public void setProgress(int i) {  
 
 progress = i;  
          spinHandler.sendEmptyMessage(0);  
     }  
 
}  

  实现思路也是很简单的,就是在onDraw()方法里面绘制进度条的背景以及进度,进度的参数是传递进来的数值。Activity的代码如下:

package com.kince.progressrectangle;  
 
import android.app.Activity;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
 
public class RecActivity extends Activity {  
 
     boolean running;  
     int progress = 0;  
     ProgressRectangle progressRectangle;  
 
     @Override  
     protected void onCreate(Bundle savedInstanceState) {  
          // TODO Auto-generated method stub  
          super.onCreate(savedInstanceState);  
          setContentView(R.layout.activity_rec);  
 
 progressRectangle=(ProgressRectangle) findViewById(R.id.progressBar);  
          final Runnable r = new Runnable() {  
                    public void run() {  
 running = true;  
                         while(progress<100) {  
                              progressRectangle.incrementProgress();  
                              progress++;  
                              try {  
                                   Thread.sleep(15);  
                              } catch (InterruptedException e) {  
                                   // TODO Auto-generated catch block  
                                   e.printStackTrace();  
                              }  
                         }  
                         while(progress>0) {  
                              progressRectangle.unIncrementProgress();  
                              progress--;  
                              try {  
                                   Thread.sleep(15);  
                              } catch (InterruptedException e) {  
                                   // TODO Auto-generated catch block  
                                   e.printStackTrace();  
                              }  
                         }  
 
 running = false;  
                    }  
             };  
 
          Button increment = (Button) findViewById(R.id.btn_increment);  
        increment.setOnClickListener(new OnClickListener() {  
               public void onClick(View v) {  
                    if(!running) {  
 progress = 0;  
                         Thread s = new Thread(r);  
                         s.start();  
                    }  
               }  
        });  
     }  
}  

  效果如下:

  总体来说,就是通过绘制矩形来达到目的。当然,在实际使用中的效果还是有所差异的,欢迎大家反馈、交流。

  <--

  csdn下载:http://download.csdn.net/detail/wangjinyu501/7694607

  gitub地址:https://github.com/wangjinyu501/ProgressRectangle

  -->

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android Note

Android-水平和垂直方向都可滑动的RecycleView

1842
来自专栏Android干货

Android项目实战(三十二):圆角对话框Dialog

3766
来自专栏Android开发经验

ScrollView里面基于某个View弹出PopupWindow,PopupWindow不会跟着View滚动?

1742
来自专栏Android干货园

Android--仿淘宝商品详情(继续拖动查看详情)及标题栏渐变

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/80...

1421
来自专栏三好码农的三亩自留地

教你搞定Android自定义ViewGroup

我们知道ViewGroup就是View的容器类,我们经常用的LinearLayout,RelativeLayout等都是ViewGroup的子类,因为ViewG...

761
来自专栏程序员叨叨叨

【Android】手把手教你上滑解锁的效果

最近,公司开发的APP中要实现类似上滑解锁效果的推荐页,捣腾了两天,基本实现了效果,附效果图如上。接下来和大家聊聊如何实现这样的效果。

5372
来自专栏刘望舒

Android View体系(九)自定义View

相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属...

21810
来自专栏Android源码框架分析

三句代码创建全屏Dialog或者DialogFragment:带你从源码角度实现全屏Dialog

Dialog是APP开发中常用的控件,同Activity类似,拥有独立的Window窗口,但是Dialog跟Activity还是有一定区别的,最明显的就是:默认...

3694
来自专栏Android开发与分享

【Android】RecyclerView的使用

2745
来自专栏Jack的Android之旅

模仿企鹅FM播放主页面滑动动态改变各视图的大小

国庆的一个任务就是把自己之前写的代码搬到博客。这次给各位带来的是通过滑动来动态改变各个View的大小进而达到企鹅FM播放页面的滑动效果(仅仅是滑动效果),老规矩...

1012

扫码关注云+社区

领取腾讯云代金券