Android实现仿iOS图标下载View动画效果

完整的代码请看:

https://github.com/xiaweizi/DownloadLoadingView

功能分析

面对这样的需要应该怎么实现呢?其实实现的方式可能不止我想的这种,我就讲述一下我是如何处理的。

预览图

首先,可以分成三部分:

  • 半透明的背景

  • 全透明的环

  • 实心全透明的弧

那怎么实现背景半透明,而圆环和弧又是全透明的。顿时有个想法,要是两张图片重叠的部分能被抠出掉,也就是变成全透明,那岂不是非常容易就实现了。

圆环和弧既然是盖在了背景上,理当直接变成透明。那 Android 有对应处理的 API吗?答案是肯定的。 setXfermode() 用于设置图像的过度模式,其中 PorterDuff.Mode.CLEAR 为清除模式则可以实现上述的效果。

具体实现

一系列的初始化

public DownloadLoadingView(Context context, AttributeSet attrs) {

super(context, attrs);

TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.DownloadLoadingView);

mRadius = typedArray.getDimension(R.styleable.DownloadLoadingView_radius, RADIUS_DEFAULT);

mStrokeWidth = typedArray.getDimension(R.styleable.DownloadLoadingView_strokeWidth, STROKE_WIDTH_DEFAULT);

mMaxProgress = typedArray.getInteger(R.styleable.DownloadLoadingView_maxProgress, MAX_PROGRESS_DEFAULT);

mRoundRadius = typedArray.getDimension(R.styleable.DownloadLoadingView_roundRadius, ROUND_RADIUS_DEFAULT);

mBackgroundColor = typedArray.getColor(R.styleable.DownloadLoadingView_backgroundColor, getResources().getColor(R.color.bg_default));

Log.i(TAG, “radius:” + mRadius);

typedArray.recycle();

setLayerType(View.LAYER_TYPE_SOFTWARE, null);//关闭硬件加速

paint = new Paint(Paint.ANTI_ALIAS_FLAG);

}

记得需要关闭硬件加速,不然会没有效果。

绘制背景

paint.setColor(mBackgroundColor);

paint.setStyle(Paint.Style.FILL);

RectF round = new RectF(0, 0, getWidth(), getHeight());

canvas.drawRoundRect(round, mRoundRadius, mRoundRadius, paint);

设置背景颜色,样式为填充,绘制圆角矩形

设置背景颜色,样式为填充,绘制圆角矩形

绘制圆环

paint.setColor(Color.RED);

paint.setStrokeWidth(mStrokeWidth);

// 采用 clear 的方式

paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

paint.setStyle(Paint.Style.STROKE);

canvas.drawCircle(getWidth() / 2, getHeight() / 2, mRadius, paint);

圆环的颜色可以随意设置,毕竟最后会被抠除掉,

设置 PorterDuff.Mode.CLEAR 类型模式绘制圆环

绘制圆

paint.setStyle(Paint.Style.FILL);float sweepAngle = 360 * mProgress / mMaxProgress;RectF rectF = new RectF(getWidth() / 2 - mRadius, getHeight() / 2 - mRadius, getWidth() / 2 + mRadius, getHeight() / 2 + mRadius);canvas.drawArc(rectF, -90, sweepAngle, true, paint);// 记得设置为 null 不然会没有效果paint.setXfermode(null);

根据当前的进度绘制相对应的弧,并且结束的时候将 Xfermode 模式置为 null

完整的代码请看:

https://github.com/xiaweizi/DownloadLoadingView

拓展

文中提到了 PorterDuff.Mode,里面存储了大量的枚举,当我们需要处理图像的时候就会用到,但是对每种类型并没有特别的了解。每次使用的时候都需要查资料,然后确定到底需要使用哪种模式。

public Xfermode setXfermode(Xfermode xfermode) {

long xfermodeNative = 0;

if (xfermode != null)

xfermodeNative = xfermode.native_instance;

native_setXfermode(mNativePaint, xfermodeNative);

mXfermode = xfermode;

return xfermode;。

}

具体的模式:

public enum Mode {

/** [0, 0] */

CLEAR (0),

/** [Sa, Sc] */

最后

那我们该怎么做才能做到年薪60万+呢,对于程序员来说,只有不断学习,不断提升自己的实力。我之前有篇文章提到过,感兴趣的可以看看,到底要学习哪些知识才能达到年薪60万+。

通过职友集数据可以查看,以北京 Android 相关岗位为例,其中 【20k-30k】 薪酬的 Android 工程师,占到了整体从业者的 30.8%!

北京 Android 工程师「工资收入水平 」

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

今天重点内容是怎么去学,怎么提高自己的技术。

1.合理安排时间

2.找对好的系统的学习资料

3.有老师带,可以随时解决问题

4.有明确的学习路线

当然图中有什么需要补充的或者是需要改善的,可以在评论区写下来,一起交流学习。

15690)]

北京 Android 工程师「工资收入水平 」

[外链图片转存中…(img-QEwi8UXy-1716042915690)]

今天重点内容是怎么去学,怎么提高自己的技术。

1.合理安排时间

2.找对好的系统的学习资料

3.有老师带,可以随时解决问题

4.有明确的学习路线

当然图中有什么需要补充的或者是需要改善的,可以在评论区写下来,一起交流学习。

[外链图片转存中…(img-0YZXhMw0-1716042915690)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值