android Launcher 自定义View 高仿hola一键清理效果
2015-10-17 14:38
447 查看
android Launcher 自定义View 高仿hola一键清理效果
package com.example.administrator.cleanviewactivity; import android.animation.Animator; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.util.AttributeSet; import android.view.View; import android.view.animation.DecelerateInterpolator; /** * ferris * 2015年10月17日 14:37:02 * TODO: 一键清理View */ public class CleanProgressView extends View { private final float mStartAngle = -90; private float mSweepAngle = 0; private float mMaxSweepAngle = 360; private int mAnimationDuration = 400; private int mMaxProgress = 100; private Paint mPaint; private RectF outerRect; private int outerWidth,middleWidth,progressWidth; public CleanProgressView(Context context) { super(context); init(null, 0); } public CleanProgressView(Context context, AttributeSet attrs) { super(context, attrs); init(attrs, 0); } public CleanProgressView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(attrs, defStyle); } private void init(AttributeSet attrs, int defStyle) { // Load attributes // final TypedArray a = getContext().obtainStyledAttributes( // attrs, R.styleable.CleanProgressView, defStyle, 0); // // mExampleString = a.getString( // R.styleable.CleanProgressView_exampleString); // mExampleColor = a.getColor( // R.styleable.CleanProgressView_exampleColor, // mExampleColor); // // Use getDimensionPixelSize or getDimensionPixelOffset when dealing with // // values that should fall on pixel boundaries. // mExampleDimension = a.getDimension( // R.styleable.CleanProgressView_exampleDimension, // mExampleDimension); // // if (a.hasValue(R.styleable.CleanProgressView_exampleDrawable)) { // mExampleDrawable = a.getDrawable( // R.styleable.CleanProgressView_exampleDrawable); // mExampleDrawable.setCallback(this); // } // // a.recycle(); } private void initClean(int width,int hight){ int cleanSize = Math.min(width, hight); outerWidth=(cleanSize-getPaddingLeft()-getPaddingRight())/3; middleWidth=outerWidth/3*2; progressWidth=middleWidth/2; if(outerRect==null){ outerRect=new RectF(); } outerRect.set(getPaddingLeft(), getPaddingTop(), cleanSize - getPaddingRight(), cleanSize - getPaddingBottom()); } private Paint getBasePaint(){ mPaint=new Paint(); mPaint.setStyle(Paint.Style.STROKE); mPaint.setFlags(Paint.ANTI_ALIAS_FLAG); mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeCap(Paint.Cap.ROUND); return mPaint; } private Paint getOuterPaint(){ if(mPaint==null){ mPaint=getBasePaint(); } mPaint.setColor(Color.BLACK); mPaint. setStrokeWidth(outerWidth); mPaint.setAlpha(30); return mPaint; } private Paint getMiddlePaint(){ if(mPaint==null){ mPaint=getBasePaint(); } mPaint.setColor(Color.BLACK); mPaint. setStrokeWidth(middleWidth); mPaint.setAlpha(100); return mPaint; } private Paint getProgressPaint(){ if(mPaint==null){ mPaint=getBasePaint(); } mPaint.setColor(Color.GREEN); mPaint. setStrokeWidth(progressWidth); mPaint.setAlpha(200); return mPaint; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawArc(outerRect, 0, 360, false, getOuterPaint()); canvas.drawArc(outerRect, 0, 360, false, getMiddlePaint()); canvas.drawArc(outerRect, mStartAngle, mSweepAngle, false, getProgressPaint()); } private float calcSweepAngleFromProgress(int progress) { return (mMaxSweepAngle / mMaxProgress) * progress; } private int calcProgressFromSweepAngle(float sweepAngle) { return (int) ((sweepAngle * mMaxProgress) / mMaxSweepAngle); } //直接设置进度信息 public void setFastProgress(int progress) { mSweepAngle = calcSweepAngleFromProgress(progress); invalidate(); } public void setProgress(int progress) { ValueAnimator animator = ValueAnimator.ofFloat(mSweepAngle, calcSweepAngleFromProgress(progress)); animator.setInterpolator(new DecelerateInterpolator()); animator.setDuration(mAnimationDuration); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { mSweepAngle = (Float) valueAnimator.getAnimatedValue(); invalidate(); } }); animator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { // TODO Auto-generated method stub } @Override public void onAnimationRepeat(Animator animation) { // TODO Auto-generated method stub } @Override public void onAnimationEnd(Animator animation) { // TODO Auto-generated method stub } @Override public void onAnimationCancel(Animator animation) { // TODO Auto-generated method stub } }); animator.start(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); initClean(w,h); } }
相关文章推荐
- android之获取联系人并按拼音排序
- Android SlidingTabLayout底部选项卡槽Tab水平居中
- android之音乐播放和音效播放
- android之保存数据一(SharedPreference)
- Android 消息处理机制
- android之Toast多次提示延时处理
- android之双击返回键退出程序
- Android 开发环境下载地址 -- 百度网盘 adt-bundle android-studio sdk adt 下载
- android之对话框“确定退出吗?”
- android全屏显示,去掉标题栏和信息栏
- android四大组件之service生命周期
- Android Studio 运行java程序
- android 时间对话框 TimePickerDialog简介
- Android自定义drawable
- android两种定时器实现
- Android学习第四天之表格布局TableLayout
- Android图片缓存框架Android-Universal-Image-Loader的使用详解
- Android:FullImageView 自定义等比缩放的铺满控件显示的ImageView
- AndroidStudio 开发报错汇总
- Android基础入门教程——10.1 TelephonyManager(电话管理器)