ProgressBar 源码
- /**
- * @FileName CircleProgressBar.java
- * @Package com.read.view
- * @Description TODO
- * @Author Alpha
- * @Date 2015-7-30 下午4:52:24
- * @Version V1.0
- */
- package com.read.view;
- import com.read.cnblogs.R;
- import android.animation.Animator;
- import android.animation.ObjectAnimator;
- import android.animation.ValueAnimator;
- import android.content.Context;
- import android.content.res.TypedArray;
- import android.graphics.Canvas;
- import android.graphics.Color;
- import android.graphics.ColorFilter;
- import android.graphics.Paint;
- import android.graphics.PixelFormat;
- import android.graphics.Rect;
- import android.graphics.RectF;
- import android.graphics.Paint.Cap;
- import android.util.AttributeSet;
- import android.util.Property;
- import android.view.View;
- import android.view.animation.AccelerateDecelerateInterpolator;
- import android.view.animation.DecelerateInterpolator;
- import android.view.animation.Interpolator;
- import android.view.animation.LinearInterpolator;
- public class CircleProgressBar extends View {
- private static final Interpolator ANGLE_INTERPOLATOR = new LinearInterpolator();
- private static final Interpolator SWEEP_INTERPOLATOR = new AccelerateDecelerateInterpolator();
- private static final int ANGLE_ANIMATOR_DURATION = 2000;
- private static final int SWEEP_ANIMATOR_DURATION = 900;
- private static final int MIN_SWEEP_ANGLE = 30;
- private static final int DEFAULT_BORDER_WIDTH = 3;
- private final RectF fBounds = new RectF();
- private ObjectAnimator mObjectAnimatorSweep;
- private ObjectAnimator mObjectAnimatorAngle;
- private boolean mModeAppearing = true;
- private Paint mPaint;
- private float mCurrentGlobalAngleOffset;
- private float mCurrentGlobalAngle;
- private float mCurrentSweepAngle;
- private float mBorderWidth;
- private boolean mRunning;
- private int[] mColors;
- public CircleProgressBar(Context context) {
- this(context, null);
- }
- public CircleProgressBar(Context context, AttributeSet attrs) {
- this(context, attrs, 0);
- }
- public CircleProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- float density = context.getResources().getDisplayMetrics().density;
- TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircularProgress, defStyleAttr, 0);
- mBorderWidth = a.getDimension(R.styleable.CircularProgress_borderWidth,
- DEFAULT_BORDER_WIDTH * density);
- a.recycle();
- mColors = new int[2];
- mColors[0] = context.getResources().getColor(R.color.pink);
- //mColors[1]=context.getResources().getColor(R.color.pink);
- // mCurrentColorIndex = 0;
- // mNextColorIndex = 1;
- mPaint = new Paint();
- mPaint.setAntiAlias(true);
- mPaint.setStyle(Paint.Style.STROKE);
- mPaint.setStrokeCap(Cap.ROUND);
- mPaint.setStrokeWidth(mBorderWidth);
- mPaint.setColor(mColors[0]);
- setupAnimations();
- }
- private void start() {
- if (mRunning) {
- return;
- }
- mRunning = true;
- mObjectAnimatorAngle.start();
- mObjectAnimatorSweep.start();
- invalidate();
- }
- private void stop() {
- if (!mRunning) {
- return;
- }
- mRunning = false;
- mObjectAnimatorAngle.cancel();
- mObjectAnimatorSweep.cancel();
- invalidate();
- }
- @Override
- protected void onVisibilityChanged(View changedView, int visibility) {
- super.onVisibilityChanged(changedView, visibility);
- if (visibility == VISIBLE) {
- start();
- } else {
- stop();
- }
- }
- @Override
- protected void onAttachedToWindow() {
- start();
- super.onAttachedToWindow();
- }
- @Override
- protected void onDetachedFromWindow() {
- stop();
- super.onDetachedFromWindow();
- }
- @Override
- protected void onSizeChanged(int w, int h, int oldw, int oldh) {
- super.onSizeChanged(w, h, oldw, oldh);
- fBounds.left = mBorderWidth / 2f + .5f;
- fBounds.right = w - mBorderWidth / 2f - .5f;
- fBounds.top = mBorderWidth / 2f + .5f;
- fBounds.bottom = h - mBorderWidth / 2f - .5f;
- }
- @Override
- public void draw(Canvas canvas) {
- super.draw(canvas);
- float startAngle = mCurrentGlobalAngle - mCurrentGlobalAngleOffset;
- float sweepAngle = mCurrentSweepAngle;
- if (mModeAppearing) {
- mPaint.setColor(mColors[0]);
- sweepAngle += MIN_SWEEP_ANGLE;
- } else {
- startAngle = startAngle + sweepAngle;
- sweepAngle = 360 - sweepAngle - MIN_SWEEP_ANGLE;
- }
- canvas.drawArc(fBounds, startAngle, sweepAngle, false, mPaint);//画弧线
- }
- // private static int gradient(int color1, int color2, float p) {
- // int r1 = (color1 & 0xff0000) >> 16;
- // int g1 = (color1 & 0xff00) >> 8;
- // int b1 = color1 & 0xff;
- // int r2 = (color2 & 0xff0000) >> 16;
- // int g2 = (color2 & 0xff00) >> 8;
- // int b2 = color2 & 0xff;
- // int newr = (int) (r2 * p + r1 * (1 - p));
- // int newg = (int) (g2 * p + g1 * (1 - p));
- // int newb = (int) (b2 * p + b1 * (1 - p));
- // return Color.argb(200, newr, newg, newb);
- // }
- private void toggleAppearingMode() {
- mModeAppearing = !mModeAppearing;
- if (mModeAppearing) {
- // mCurrentColorIndex = ++mCurrentColorIndex % 4;
- // mNextColorIndex = ++mNextColorIndex % 4;
- mCurrentGlobalAngleOffset = (mCurrentGlobalAngleOffset + MIN_SWEEP_ANGLE * 2) % 360;
- }
- }
- // ////////////////////////////////////////////////////////////////////////////
- // ////////////// Animation
- private Property<CircleProgressBar, Float> mAngleProperty = new Property<CircleProgressBar, Float>(Float.class, "angle") {
- @Override
- public Float get(CircleProgressBar object) {
- return object.getCurrentGlobalAngle();
- }
- @Override
- public void set(CircleProgressBar object, Float value) {
- object.setCurrentGlobalAngle(value);
- }
- };
- private Property<CircleProgressBar, Float> mSweepProperty = new Property<CircleProgressBar, Float>(Float.class, "arc") {
- @Override
- public Float get(CircleProgressBar object) {
- return object.getCurrentSweepAngle();
- }
- @Override
- public void set(CircleProgressBar object, Float value) {
- object.setCurrentSweepAngle(value);
- }
- };
- private void setupAnimations() {
- mObjectAnimatorAngle = ObjectAnimator.ofFloat(this, mAngleProperty, 360f);
- mObjectAnimatorAngle.setInterpolator(ANGLE_INTERPOLATOR);
- mObjectAnimatorAngle.setDuration(ANGLE_ANIMATOR_DURATION);
- mObjectAnimatorAngle.setRepeatMode(ValueAnimator.RESTART);
- mObjectAnimatorAngle.setRepeatCount(ValueAnimator.INFINITE);
- mObjectAnimatorSweep = ObjectAnimator.ofFloat(this, mSweepProperty, 360f - MIN_SWEEP_ANGLE * 2);
- mObjectAnimatorSweep.setInterpolator(SWEEP_INTERPOLATOR);
- mObjectAnimatorSweep.setDuration(SWEEP_ANIMATOR_DURATION);
- mObjectAnimatorSweep.setRepeatMode(ValueAnimator.INFINITE);
- mObjectAnimatorSweep.setRepeatCount(ValueAnimator.INFINITE);
- mObjectAnimatorSweep.addListener(new Animator.AnimatorListener() {
- @Override
- public void onAnimationStart(Animator animation) {
- }
- @Override
- public void onAnimationEnd(Animator animation) {
- }
- @Override
- public void onAnimationCancel(Animator animation) {
- }
- @Override
- public void onAnimationRepeat(Animator animation) {
- toggleAppearingMode();
- }
- });
- }
- public void setCurrentGlobalAngle(float currentGlobalAngle) {
- mCurrentGlobalAngle = currentGlobalAngle;
- invalidate();
- }
- public float getCurrentGlobalAngle() {
- return mCurrentGlobalAngle;
- }
- public void setCurrentSweepAngle(float currentSweepAngle) {
- mCurrentSweepAngle = currentSweepAngle;
- invalidate();
- }
- public float getCurrentSweepAngle() {
- return mCurrentSweepAngle;
- }
- }
ProgressBar 源码的更多相关文章
- 45个android实例源码
分享45个android实例源码,很好很强大http://www.apkbus.com/android-20978-1-1.html andriod闹钟源代码http://www.apkbus.com ...
- 分享45个android实例源码,很好很强大
分享45个android实例源码,很好很强大 http://www.apkbus.com/android-20978-1-1.html 分享45个android实例源码,很好很强大http://www ...
- android 在线升级借助开源中国App源码
android 在线升级借助开源中国App源码 http://www.cnblogs.com/luomingui/p/3949429.html android 在线升级借助开源中国App源码分析如下: ...
- AsyncTask源码分析
在Android中,主线程是UI线程,当需要根据其他数据进行更新UI时,如果获取数据的操作比较耗时的话,会触发ANR,所以我们应该讲耗时的操作进行异步操作,尤其是请求网络数据的操作应该放在后台线程进行 ...
- ExtJS学习之路第四步:看源码,实战MessageBox
可以通过看MessageBox.js的源码来深入认识,记住它的主要用法.Ext.MessageBox是实用类,用于生成不同风格的消息框,它是Singleton(单例),别名Ext.Msg.注意Mess ...
- android源码解析(十七)-->Activity布局加载流程
版权声明:本文为博主原创文章,未经博主允许不得转载. 好吧,终于要开始讲讲Activity的布局加载流程了,大家都知道在Android体系中Activity扮演了一个界面展示的角色,这也是它与andr ...
- 转--2014年最新810多套android源码2.46GB免费一次性打包下载
转载自:http://www.eoeandroid.com/thread-497046-1-1.html 感谢该博客主人无私奉献~~ 下面的源码是从今年3月份开始不断整理源码区和其他网站上的安卓例子源 ...
- 非常出色的一款WinForm窗体重绘GUI类库源码
基本控件的演示 ScrollBar滚动条 各种圆形进度条 ProgressBar进度条 Mdi演示,仿谷歌浏览器 多种皮肤可供选择 一套专业级别的GUI控件,目前包含了窗体.进度条.滚动条以及MDI多 ...
- C#源码大汇总
C#高仿QQ2013可在广域网部署聊天系统GG叽叽 动态显示硬盘分区容量饼图 自定义ProgressBar控件高仿Win8进度条 多皮肤精美在线QQ悬浮客服插件 jQuery仿天猫首页多格焦点图片轮播 ...
随机推荐
- 查看当前正在运行的activity
找到sdk的安装路径,比如我的是 D:\prostu\Android\android-sdk\tools该路径下的: hierarchyviewer.bat 双击,可以用此工具查看设备跑的是当前的哪个 ...
- 在ubuntu上配置nginx+php+mysql+phpmyadmin
1.先更新ubuntu系统 更新命令 sudo apt-get update sudo apt-get upgrade 2 添加ubuntu nginx更新源镜像 cd /etc/apt/ sudo ...
- C++模板&泛型编程
---恢复内容开始--- 一.泛型编程 定义:编写与类型无关的逻辑代码,是代码复用的一种手段.模板是泛型编程的基础 模板分为:函数模板和类模板 函数模板:代表了一个函数家族,该函数与类型无关,在使用时 ...
- 在docker里部署网络服务
之前试着玩玩docker有一阵子了,今天算是头一回正式在docker里部署网络服务. 本来想和lxc差不多的东西那自然是手到擒来,没想到还是改了很多. 第一个遇到的问题是,远程连到docker宿主机干 ...
- Xml文件并发读写的解决方法
之前对xml的操作大都是通过XmlDocument对象来进行,但是这样的情况对于没有并发的是非常合适的,最近遇到了并发读写xml文件的情况.通过文件流来操作能解决大部分的并发情况,对于极端的情况会有问 ...
- SQL Server选取本周或上一周数据
有关SQL Server中有关周的数据查询主要思路来自下面这个语句 select getdate(), dateadd(wk, datediff(wk, 0, DateAdd(Day,-1,getda ...
- Linux 网络编程(多路复用)
服务器端代码 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/soc ...
- 免费打造自己的个人网站,免费域名、免费空间、FTP、数据库什么的,一个不能少,没钱,也可以这么任性
作为一名程序猿,拥有自己的个人网站,是一件多么有逼格的事~~至于个人网站的好处嘛?那是多的说都说不完啊~~例如我们可以放自己的作品,展示自己的风采,放自己女神的照片(女神看到后会怎么样,自己想吧,哈哈 ...
- COM思想的背后
最近看公司的一些新产品和框架 , 发现清一色的“COM思想架构 ”, 这里说的“COM思想架构”是指不完全是标准COM组件的方式,而是指在设计上用到了COM思想. COM组件技术大概在1993年产生, ...
- 《OOC》笔记(4)——自动化地将C#代码转化为C代码(结构版)
<OOC>笔记(4)——自动化地将C#代码转化为C代码(结构版) 我在<C表达面向对象语言的机制——C#版>中已经说明了从C#到C的转换方法.这次看<OOC>也是想 ...