zoukankan      html  css  js  c++  java
  • Android 一键清理动画

    版本号:1.0 
    日期:2014.7.29 2014.7.30
    版权:© 2014 kince 转载注明出处

      一键清理是非常多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);
         }
    
    }
      实现思路也是非常easy的,就是在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
      -->


  • 相关阅读:
    centos7 & ubuntu14.02安装sublime 3
    flask之flask-restful
    ubuntu14.04安装python3.7.1
    vim中多行注释和多行删除命令
    python3之scrapy安装使用
    python3 之 linux命令实现
    ubuntu14.04安装pyspider
    升级3.4成3.6 ubuntu14.04 和miniconda虚拟环境
    python3 之初学者常犯的5个错误
    python3 之 格式化json
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/7234214.html
Copyright © 2011-2022 走看看