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);
     }

}

实现思路也是很简单的,就是在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

-->

Android 一键清理动画

时间: 2024-11-15 18:09:51

Android 一键清理动画的相关文章

Android特效专辑(七)——飞机升空特效,一键清理缓存,灵活运用动画会有不一样的感受

Android特效专辑(七)--飞机升空特效,一键清理缓存,灵活运用属性动画 最近的几篇博文反响还不错,也会继续的写下去的,关于这些特效的专辑,大多数也是借鉴大神的,最近由于工作的关系,会深入的了解一下Android BLE与硬件设备的串口通讯相关的内容,也会时不时的分享出来,当然,大家是一起学习,我毕竟也是初学者,今天讲的是小火箭的动画效果,用到了属性动画做了一些偷梁换柱的事情,明天还是后天,再更新一个心型起泡飞舞的特效,就不会这么持续的更新特效专辑这一系列了,毕竟<Only>这个软件也正在

Android 双进程Service常驻后台,无惧“一键清理”

本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处! 最近项目用到Service常驻后台,研究了一下发现手Q和微信都是使用了双进程来保证一键清理后自动复活,copy网上双进程Service的例子,再结合onTrimMemory(),基本实现一键清理后自动复活. 使用双进程Service,关键是在AndroidManifest.xml里面定义Service时加入android:process=":service1": <service andro

仿360一键清理实现(二)

--------------------------------------------------------------------- 编译环境:Android 4.0 测试环境:Android 4.2.2模拟器 屏幕分辨率:480*800 作者:疯狂小强 注意: 1.资源采集于网上,如有侵权请及时联系,以便处理. 2.代码仅用于学习交流,请勿商业化. -------------------------------------------------------------------- 仿

Windows在生产体系Android开关机动画

在Windows根据系统.办Android开关机动画,几个需要注意的问题: 1.压缩的选择 2.压缩的格式: 版权声明:本文博客原创文章,博客,未经同意,不得转载.

Android下的动画

        ------你需要努力,你还没资格休息----- Android下的动画有三种: tween补间动画.frame帧动画.property属性动画(Android3.0后提出来的). 补间动画: Translation(平移).Rotation(旋转).Alpha(透明).Scale(缩放) 代码方式:透明动画AlphaAnimation alpha=new AlphaAnimation(0,1); alpha.setDuration(2000);//执行的时间 alpha.set

Android开发之动画效果浅析

Android开发之动画效果浅析 请尊重他人的劳动成果,转载请注明出处:Android开发之动画效果浅析 程序运行效果图: Android动画主要包含补间动画(Tween)View Animation.帧动画(Frame)Drawable Animation.以及属性动画Property Animation.下面依次介绍一下各个动画. 1.   补间动画(Tween) Tween动画,通过对View 的内容进行一系列的图形变换 (包括平移.缩放.旋转.改变透明度)来实现动画效果.动画效果的定义可

android Title滑块动画实现(适合新闻客户端多种栏目的展示)

先上效果图,选择不同的模块,滑动会通过动画形式滑过去,这种适合新闻客户端多种栏目的展示: 这么写Layout: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background

Android 应用启动动画代码

requestWindowFeature(Window.FEATURE_NO_TITLE);//设置无标题 setContentView(R.layout.activity_main); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//设置全屏 ImageView welcomeImg = (ImageView) findVi

android 逐帧动画的播放与播放结束操作对象

逐帧动画的xml代码: 1 <?xml version="1.0" encoding="utf-8"?> 2 <animation-list xmlns:android="http://schemas.android.com/apk/res/android" 3 android:oneshot="true" > 4 5 <item 6 android:drawable="@drawabl