一键清理是很多Launcher都会带有的功能,其效果也比较美观。实现方式也许有很多中,其中常见的是使用图片drawable来完成的,具体可以参考这篇文章:模仿实现360桌面水晶球式的一键清理特效。本文另辟蹊径,使用自定义View来完成同样的效果,性能、效率更高。
- /**
- *
- */
- 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);
- }
- }
- 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();
- }
- }
- });
- }
- }
效果如下:
![android自定义view实现progressbar的效果 android自定义view实现progressbar的效果](https://image.shishitao.com:8440/aHR0cDovL2Jic21heC5pa2FmYW4uY29tL3N0YXRpYy9MM0J5YjNoNUwyaDBkSEF2YVcxbkxtSnNiMmN1WTNOa2JpNXVaWFF2TWpBeE5EQTNNekF4TXpBME5USTROVGsvZDJGMFpYSnRZWEpyTHpJdmRHVjRkQzloU0ZJd1kwUnZka3d5U25OaU1tTjFXVE5PYTJKcE5YVmFXRkYyWkRKR2RWb3ljSEJpYm13eFRsUkJlQzltYjI1MEx6VmhOa3cxVERKVUwyWnZiblJ6YVhwbEx6UXdNQzltYVd4c0wwa3dTa0pSYTBaRFRVRTlQUzlrYVhOemIyeDJaUzgzTUM5bmNtRjJhWFI1TDFOdmRYUm9SV0Z6ZEE9PS5qcGc%3D.jpg?w=700)
![android自定义view实现progressbar的效果 android自定义view实现progressbar的效果](https://image.shishitao.com:8440/aHR0cDovL2Jic21heC5pa2FmYW4uY29tL3N0YXRpYy9MM0J5YjNoNUwyaDBkSEF2YVcxbkxtSnNiMmN1WTNOa2JpNXVaWFF2TWpBeE5EQTNNekF4TXpBM016VTBOakUvZDJGMFpYSnRZWEpyTHpJdmRHVjRkQzloU0ZJd1kwUnZka3d5U25OaU1tTjFXVE5PYTJKcE5YVmFXRkYyWkRKR2RWb3ljSEJpYm13eFRsUkJlQzltYjI1MEx6VmhOa3cxVERKVUwyWnZiblJ6YVhwbEx6UXdNQzltYVd4c0wwa3dTa0pSYTBaRFRVRTlQUzlrYVhOemIyeDJaUzgzTUM5bmNtRjJhWFI1TDFOdmRYUm9SV0Z6ZEE9PS5qcGc%3D.jpg?w=700)
android自定义view实现progressbar的效果的更多相关文章
-
Android自定义View之ProgressBar出场记
关于自定义View,我们前面已经有三篇文章在介绍了,如果筒子们还没阅读,建议先看一下,分别是android自定义View之钟表诞生记.android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检 ...
-
Android 自定义view实现水波纹效果
http://blog.csdn.net/tianjian4592/article/details/44222565 在实际的开发中,很多时候还会遇到相对比较复杂的需求,比如产品妹纸或UI妹纸在哪看了 ...
-
android自定义View之3D索引效果
效果图: 我的小霸王太卡了. 最近工作比较忙,今天搞了一下午才搞出来这个效果,这种效果有很多种实现方式,最常见的应该是用贝塞尔曲线实现的.今天我们来看另一种不同的实现方式,只需要用到 canvas.s ...
-
Android自定义View——刮刮卡效果
想要红包的实现效果的可以关注我的博客,仿饿了么红包 下层图片:我们的红包的图片 上层图片:有两部分 一部分是灰色背景 一部分是拥有透明度为0,并且模式为交集的画笔 使用滑动监听,滑动时,用透明度为0的 ...
-
Android自定义View 画弧形,文字,并增加动画效果
一个简单的Android自定义View的demo,画弧形,文字,开启一个多线程更新ui界面,在子线程更新ui是不允许的,但是View提供了方法,让我们来了解下吧. 1.封装一个抽象的View类 B ...
-
Android自定义View(LimitScrollerView-仿天猫广告栏上下滚动效果)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/53303872 本文出自:[openXu的博客] 1分析 2定义组合控件布局 3继承最外层控件 ...
-
我的Android进阶之旅------>Android自定义View实现带数字的进度条(NumberProgressBar)
今天在Github上面看到一个来自于 daimajia所写的关于Android自定义View实现带数字的进度条(NumberProgressBar)的精彩案例,在这里分享给大家一起来学习学习!同时感谢 ...
-
Android 自定义View合集
自定义控件学习 https://github.com/GcsSloop/AndroidNote/tree/master/CustomView 小良自定义控件合集 https://github.com/ ...
-
Android 自定义 view(三)&mdash;&mdash; onDraw 方法理解
前言: 上一篇已经介绍了用自己定义的属性怎么简单定义一个view<Android 自定义view(二) -- attr 使用>,那么接下来我们继续深究自定义view,下一步将要去简单理解自 ...
随机推荐
-
判断手机端用户打开页面时是android还是ios,并将判断结果通过ajax返回给url接口,传递回去
首先判断页面是android还是ios,然后利用ajax将结果通过接口url返回回去,记录到log日志中,以统计android和ios用户访问该页面的数量(数据统计) <script type= ...
-
Mysql的一些常用命令
Mysql基本操作 创建表: create table test01_02(id varchar(50) not null auto_increment primary key, name nvarc ...
-
21Mybatis_订单商品数据模型_一对多查询——resultMap方式
这篇文章延续订单商品数据模型,这张讲述的是一对多的查询.(用resultMap) 给出几张表的内容: User表:
-
仿AS语法来写HTML5—第1章,显示一张图片
最近开始学习html5,因为一直都是研究as,所以还是觉得as顺眼一点,但是html5也不能不学,于是就想出了,可以把html5用as的语法来写出来,做游戏应该来的比较顺手一些,下面开始第一篇 第一篇 ...
-
bzoj1641 [Usaco2007 Nov]Cow Hurdles 奶牛跨栏
Description Farmer John 想让她的奶牛准备郡级跳跃比赛,贝茜和她的伙伴们正在练习跨栏.她们很累,所以她们想消耗最少的能量来跨栏. 显然,对于一头奶牛跳过几个矮栏是很容易的,但是高 ...
-
(转)微信禁用右上角的分享按钮,WeixinJSBridge API以及隐藏分享的子按钮等菜单项
<!--禁用微信分享按钮--> <script> function onBridgeReady() { WeixinJSBridge.call('hideOptionMenu' ...
-
Otto事件总线框架的使用
Otto是一个在Android中的事件总线框架,它是square的一个开源框架,具体介绍点击这里,项目下载点击这里 为什么要使用Otto事件总线: 通常来说在Android中: 1.Activity与 ...
-
新建SpringBoot项目运行页面报错Whitelabel Error Page This application has no explicit mapping for /error, so yo
新建SpringBoot项目运行页面报错Whitelabel Error Page This application has no explicit mapping for /error, so yo ...
-
将struct转为map
package main import ( "fmt" "reflect" "time" ) type User struct { Id i ...
-
golang(01) linux环境搭建和编码
1 在自己的工作目录下建立一个goproject文件夹 /home/secondtonone/goproject 2 在文件夹下建立如下三个文件 bin pkg srcbin 保存执行go insta ...