本文实例为大家分享了Android自定义view渐变圆形动画的具体代码,供大家参考,具体内容如下

直接上效果图

自定义属性

attrs.xml文件

创建一个类 ProgressRing继承自 view

public class ProgressRing extends View {

private int progressStartColor;

private int progressEndColor;

private int bgStartColor;

private int bgMidColor;

private int bgEndColor;

private int progress;

private float progressWidth;

private int startAngle;

private int sweepAngle;

private boolean showAnim;

private int mMeasureHeight;

private int mMeasureWidth;

private Paint bgPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);

private Paint progressPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);

private RectF pRectF;

private float unitAngle;

private int curProgress = 0;

public ProgressRing(Context context, AttributeSet attrs) {

super(context, attrs);

TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.ProgressRing);

progressStartColor = ta.getColor(R.styleable.ProgressRing_pr_progress_start_color, Color.YELLOW);

progressEndColor = ta.getColor(R.styleable.ProgressRing_pr_progress_end_color, progressStartColor);

bgStartColor = ta.getColor(R.styleable.ProgressRing_pr_bg_start_color, Color.LTGRAY);

bgMidColor = ta.getColor(R.styleable.ProgressRing_pr_bg_mid_color, bgStartColor);

bgEndColor = ta.getColor(R.styleable.ProgressRing_pr_bg_end_color, bgStartColor);

progress = ta.getInt(R.styleable.ProgressRing_pr_progress, 0);

progressWidth = ta.getDimension(R.styleable.ProgressRing_pr_progress_width, 8f);

startAngle = ta.getInt(R.styleable.ProgressRing_pr_start_angle, 150);

sweepAngle = ta.getInt(R.styleable.ProgressRing_pr_sweep_angle, 240);

showAnim = ta.getBoolean(R.styleable.ProgressRing_pr_show_anim, true);

ta.recycle();

unitAngle = (float) (sweepAngle / 100.0);

bgPaint.setStyle(Paint.Style.STROKE);

bgPaint.setStrokeCap(Paint.Cap.ROUND);

bgPaint.setStrokeWidth(progressWidth);

progressPaint.setStyle(Paint.Style.STROKE);

progressPaint.setStrokeCap(Paint.Cap.ROUND);

progressPaint.setStrokeWidth(progressWidth);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

/*for (int i = 0, end = (int) (progress * unitAngle); i <= end; i++) {

progressPaint.setColor(getGradient(i / (float) end, progressStartColor, progressEndColor));

canvas.drawArc(pRectF,

startAngle + i,

1,

false,

progressPaint);

}*/

if (!showAnim) {

curProgress = progress;

}

drawBg(canvas);

drawProgress(canvas);

if (curProgress < progress) {

curProgress++;

postInvalidate();

}

}

// 只需要画进度之外的背景即可

private void drawBg(Canvas canvas) {

float halfSweep = sweepAngle / 2;

for (int i = sweepAngle, st = (int) (curProgress * unitAngle); i > st; --i) {

if (i - halfSweep > 0) {

bgPaint.setColor(getGradient((i - halfSweep) / halfSweep, bgMidColor, bgEndColor));

} else {

bgPaint.setColor(getGradient((halfSweep - i) / halfSweep, bgMidColor, bgStartColor));

}

canvas.drawArc(pRectF,

startAngle + i,

1,

false,

bgPaint);

}

}

private void drawProgress(Canvas canvas) {

for (int i = 0, end = (int) (curProgress * unitAngle); i <= end; i++) {

progressPaint.setColor(getGradient(i / (float) end, progressStartColor, progressEndColor));

canvas.drawArc(pRectF,

startAngle + i,

1,

false,

progressPaint);

}

}

public void setProgress(@IntRange(from = 0, to = 100) int progress) {

this.progress = progress;

invalidate();

}

public int getProgress() {

return progress;

}

public int getGradient(float fraction, int startColor, int endColor) {

if (fraction > 1) fraction = 1;

int alphaStart = Color.alpha(startColor);

int redStart = Color.red(startColor);

int blueStart = Color.blue(startColor);

int greenStart = Color.green(startColor);

int alphaEnd = Color.alpha(endColor);

int redEnd = Color.red(endColor);

int blueEnd = Color.blue(endColor);

int greenEnd = Color.green(endColor);

int alphaDifference = alphaEnd - alphaStart;

int redDifference = redEnd - redStart;

int blueDifference = blueEnd - blueStart;

int greenDifference = greenEnd - greenStart;

int alphaCurrent = (int) (alphaStart + fraction * alphaDifference);

int redCurrent = (int) (redStart + fraction * redDifference);

int blueCurrent = (int) (blueStart + fraction * blueDifference);

int greenCurrent = (int) (greenStart + fraction * greenDifference);

return Color.argb(alphaCurrent, redCurrent, greenCurrent, blueCurrent);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

mMeasureWidth = getMeasuredWidth();

mMeasureHeight = getMeasuredHeight();

if (pRectF == null) {

float halfProgressWidth = progressWidth / 2;

pRectF = new RectF(halfProgressWidth + getPaddingLeft(),

halfProgressWidth + getPaddingTop(),

mMeasureWidth - halfProgressWidth - getPaddingRight(),

mMeasureHeight - halfProgressWidth - getPaddingBottom());

}

}

}

xml布局

android:layout_width="320dp"

android:layout_height="320dp"

android:layout_gravity="center_horizontal"

app:pr_bg_end_color="#00ffffff"

app:pr_bg_mid_color="#CCCCCC"

app:pr_bg_start_color="#00ffffff"

app:pr_progress="70"

app:pr_progress_end_color="#F78930"

app:pr_progress_start_color="#00ffffff"

app:pr_progress_width="40dp" />

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程圈。

android view 渐变动画,Android自定义view渐变圆形动画相关推荐

  1. Android 雪花飘落动画效果 自定义View

    在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天.每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不 ...

  2. Android按下录音录音动画效果 ,自定义录音、播放动画View

    Android按下录音录音动画效果 ,自定义录音.播放动画View https://download.csdn.net/download/abc2522/10327428?spm=1001.2101. ...

  3. Android属性动画与自定义View——实现vivo x6更新系统的动画效果

    晚上好,现在是凌晨两点半,然后我还在写代码.电脑里播放着<凌晨两点半>,晚上写代码,脑子更清醒,思路更清晰. 今天聊聊属性动画和自定义View搭配使用,前面都讲到自定义View和属性动画, ...

  4. Android 气泡动画(自定义View类)

    Android 气泡动画(自定义View类) 一.前言 二.代码 1. 随机移动的气泡 2.热水气泡 一.前言 最近有需求制作一个水壶的气泡动画,首先在网上查找了一番,找到了一个文章. https:/ ...

  5. Carson带你学Android:源码解析自定义View Draw过程

    前言 自定义View是Android开发者必须了解的基础 网上有大量关于自定义View原理的文章,但存在一些问题:内容不全.思路不清晰.无源码分析.简单问题复杂化 等 今天,我将全面总结自定义View ...

  6. Android软件开发之盘点自定义View界面大合集(二)

    Android软件开发之盘点自定义View界面大合集(二) - 雨松MOMO的程序世界 - 51CTO技术博客 雨松MOMO带大家盘点Android 中的自定义View界面的绘制 今天我用自己写的一个 ...

  7. Android中实现Bitmap在自定义View中的放大与拖动

    一基本实现思路: 基于View类实现自定义View –MyImageView类.在使用View的Activity类中完成OnTouchListener接口,实现对MotionEvent事件的监听与处理 ...

  8. Android初级教程初谈自定义view自定义属性

    有些时候,自己要在布局文件中重复书写大量的代码来定义一个布局.这是最基本的使用,当然要掌握:但是有些场景都去对应的布局里面写对应的属性,就显得很无力.会发现,系统自带的控件无法满足我们的要求,这个时候 ...

  9. android 仿360浮动,Android仿360悬浮小球自定义view实现示例

    Android仿360悬浮小球自定义view实现示例 效果图如下: 实现当前这种类似的效果 和360小球 悬浮桌面差不错类似.这种效果是如何实现的呢.废话不多说 ,直接上代码. 1.新建工程,添加悬浮 ...

  10. Android仿IOS滑动关机-自定义view系列(6)

    Android仿IOS滑动关机-自定义view系列 功能简介 GIf演示 主要实现步骤-具体内容看github项目里的代码 Android技术生活交流 更多其他页面-自定义View-实用功能合集:点击 ...

最新文章

  1. html作业登陆界面
  2. 在centos6.5安装MariaDB(mysql)
  3. eclipse中maven的user settings和global settings的区别
  4. Blazor带我重玩前端(四)
  5. 单处理机系统的进程调度实验_Chcore -- 上交IPADS操作系统银杏书配套Lab实验笔记 - Lab3进程与异常(一)...
  6. java swing 图层_用Swing制作精美的图层叠加图
  7. 那些月入1万的自媒体大咖,惯用的4个爆款选题分享给你
  8. 八种常用的排序算法(转)
  9. ×××的两种组网方式
  10. 家庭宽带上网_03_IP城域网
  11. ubuntu16.04升级18.04时问题, (appstreamcli:5132): GLib-CRITICAL **: g_strchomp: assertion 'string != NULL'
  12. 【开源代码】在criteo数据集用MLP跑出AUC=0.809的结果
  13. 万象优鲜生鲜配送系统源码 团队开发
  14. Ubuntu 经验 :软件安装 :安装.AppImage文件
  15. LabVIEW中VI的运行和调试
  16. GitHub CEO 说:开源已经胜利,等;开源之道每周评论(2019 11 18)
  17. Matlab:写入到 Diary 文件
  18. Codeforce题解:Shurikens
  19. python不同的版本有什么区别_多版本python的区别方法
  20. Dreamweaver中如何调整同行图片的距离

热门文章

  1. java.lang.IllegalStateException: Calling [asyncError()] is not valid for a request with Async state
  2. struts工作流程
  3. 分布式数据库CAP原理和Base
  4. python 单点登录_清华园计算机系联合推出的Java+Python视频曝光
  5. 树莓4派开机动画_树莓派4+无屏幕安装系统+ssh远程+远程桌面
  6. 北京大学计算机研究所所长,北大计算机研究所所长郭宗明:探索新机制,释放科研创新能力...
  7. spring boot+mybatis执行controller中拼接后的SQL
  8. JAVA判断输入的是数字、字符还是汉字
  9. jfinal上传文件
  10. Fibonacci in the Pocket