一、概述

本自定义动画进度酷炫View,是加载进度动画的自定义View,继承于ImageView来实现,主要实现蒙层加载进度的加载进度效果。

支持水平左右加载和垂直上下加载四个方向,同时也支持自定义蒙层进度颜色。

直接看下面的效果图吧。

二、效果图

废话不说,先来看看效果图吧~~

三、实现原理方案

1、自定义View-XCLoadingImageView,继承ImageVIew来实现,这样就不用自己再处理drawable和测量的工作内容。

2、根据蒙层颜色创建一个蒙层bitmap,然后根据这个bitmap来创建一个ClipDrawable,最后利用ClipDrawable的level属性

来裁剪显示区域进度,从而达到加载进度的效果。

3、最后利用属性动画技术或ClipDrawable的setLevel()方法来达到进度的效果。

四、自定义加载进度效果XCLoadingImageView的具体实现

1、初始化需要用到的数据变量以及画笔以及属性

private Paint mImagePaint; private int mImageHeight, mImageWidth; private boolean mIsAutoStart = false; private int mMaskColor = Color.TRANSPARENT; private ClipDrawable mClipDrawable; private Drawable mMaskDrawable; private int maskHeight; private int mProgress; private ObjectAnimator mAnimator; private long mAnimDuration = 2500; private float mScaleX, mScaleY; private int mGravity = Gravity.BOTTOM; private int mOrientaion = ClipDrawable.VERTICAL; private int mMaskOrientation = MaskOrientation.BottomToTop; //Loading oriention

public static final class MaskOrientation { public static final int LeftToRight = 1; public static final int RightToLeft = 2; public static final int TopToBottom = 3; public static final int BottomToTop = 4;

}/**

* initial attributes */

private void initAttrs(Context context, AttributeSet attrs) { if (attrs == null) { return;

}

TypedArray t = context.obtainStyledAttributes(attrs, R.styleable.XCLoadingImageView);

mMaskColor = t.getColor(R.styleable.XCLoadingImageView_mask_color, mMaskColor);

mIsAutoStart = t.getBoolean(R.styleable.XCLoadingImageView_auto_start_anim, mIsAutoStart);

setMaskColor(mMaskColor);

t.recycle();

} /**

* initial paint */

private void init() { if (mImagePaint == null) {

mImagePaint = new Paint(Paint.ANTI_ALIAS_FLAG);

mImagePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));

}

}

2、初始化蒙层Bitmap以及创建加载进度用的ClipDrawable

private void initMaskBitmap(int maskColor) {

Drawable drawable = getDrawable();

if (drawable == null) {

return;

}

Bitmap bgBmp = ((BitmapDrawable) drawable).getBitmap();

mImageWidth = drawable.getIntrinsicWidth();

mImageHeight = drawable.getIntrinsicHeight();

Bitmap fgBmp = Bitmap.createBitmap(mImageWidth, mImageHeight, Bitmap.Config.ARGB_8888);

Canvas fgCanvas = new Canvas(fgBmp);

fgCanvas.drawColor(maskColor);

Bitmap bitmap = combineBitmap(bgBmp, fgBmp);

mMaskDrawable = new BitmapDrawable(null, bitmap);

mClipDrawable = new ClipDrawable(mMaskDrawable, mGravity, mOrientaion);

}

3、合并蒙层Bitmap和ImageView的src的drawable为新的Bitmap

/**

* combine tow bitmap to one bitmap

*/

private Bitmap combineBitmap(Bitmap bg, Bitmap fg) {

Bitmap bmp = Bitmap.createBitmap(mImageWidth, mImageHeight, Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(bmp);

canvas.drawBitmap(bg, 0, 0, null);

canvas.drawBitmap(fg, 0, 0, mImagePaint);

return bmp;

}

4、重写ImageVIew的onDraw()方法来把创建的ClipDrawable绘制到Canvas上

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

canvas.save();

canvas.scale(mScaleX, mScaleY);

mClipDrawable.setBounds(getDrawable().getBounds());

mClipDrawable.draw(canvas);

canvas.restore();

}

5、弹通过属性动画或者setLevel,并调用postInvalidate()来重绘,从而达到进度刷新的效果

private void initAnim() {

stopAnim();

mAnimator = ObjectAnimator.ofInt(mClipDrawable, "level", 0, 10000);

mAnimator.setDuration(mAnimDuration);

mAnimator.setRepeatCount(ValueAnimator.INFINITE);

mAnimator.setRepeatMode(ValueAnimator.RESTART);

mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator animation) {

postInvalidate();

}

});

if (mIsAutoStart) {

mAnimator.start();

}

}

public void setProgress(int progress){

mProgress = progress;

mClipDrawable.setLevel(mProgress * 100);

postInvalidate();

}

五、如何使用该自定义LoadingView控件

1、使用该自定义LoadingView非常简单,和使用普通ImageView差不对哦,只需设置下方向和蒙层颜色即可

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

XCLoadingImageView imageView2 = (XCLoadingImageView) findViewById(R.id.img2);

imageView2.setMaskOrientation(XCLoadingImageView.MaskOrientation.LeftToRight);

imageView2.setProgress(50);

}

}

六、项目结构目录截图

注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

android 蒙层动画,Android酷炫加载进度动画相关推荐

  1. html实现图片加载动画效果,HTML5+javascript实现图片加载进度动画效果

    在网上找资料的时候,看到网上有图片加载进度的效果,手痒就自己也写了一个. 图片加载完后,隐藏loading效果. 想看加载效果,请ctrel+F5强制刷新或者清理缓存. 效果预览: 0% 代码如下: ...

  2. android 自定义加载动画效果,Android 自定义View修炼-自定义加载进度动画LoadingImageView...

    一.概述 本自定义View,是加载进度动画的自定义View,继承于ImageView来实现,主要实现蒙层加载进度的加载进度效果. 支持水平左右加载和垂直上下加载四个方向,同时也支持自定义蒙层进度颜色. ...

  3. android 加载条封装,Android基于JsBridge封装的高效带加载进度的WebView

    图片发自简书App 概述 从去年4月项目就一直用起了JsBridge,前面也针对jsBridge使用姿势介绍过一篇入门篇,<Android JsBridge实战 打造专属你的Hybrid APP ...

  4. ae制h5文字动画_html5酷炫的文字打字动画特效

    特效描述:html5 酷炫的文字 打字动画特效.html5和css3制作键盘输入文字酷炫的打字动画特效. 代码结构 1. 引入JS 2. HTML代码 0 1 2 3 4 5 6 7 8 9 10 1 ...

  5. android 自定义view 加载图片,Android自定义View基础开发之图片加载进度条

    学会了Paint,Canvas的基本用法之后,我们就可以动手开始实践了,先写个简单的图片加载进度条看看. 按照惯例,先看效果图,再决定要不要往下看: 既然看到这里了,应该是想了解这个图片加载进度条了, ...

  6. android图片查看器,实现图片加载进度监听,实现保存图片

    1.添加依赖 implementation 'com.github.bumptech.glide:glide:4.6.1' compile 'com.github.chrisbanes:PhotoVi ...

  7. flutter 动画json_使用lottie加载json动画

    先上效果图,这个是做的一个仿抖音的点赞动画: giphy.gif 众所周知,属性动画.补间动画通常只能做一些效果简单的,而做复杂的动画可采用gif图,帧动画,但是这样资源空间增大导致apk增大不小.而 ...

  8. android 酷炫加载动画,一款非常简单酷炫的LoadingView动画效果

    今天看到一个银行的APP上面的loadingview 挺好的,就尝试着自己实现,觉得很简单,但自己实现起来还是发现了一些问题. LoadingView和下图类似: 实现的代码也不是很复杂,就是小球的运 ...

  9. ios 旋转加载gif_加载GIF动画方法 iOS

    方法一 使用UIWebView _codeStr为gif网址      如果是本地的gif可以直接使用dataWithContentsOfFile方法 NSData *data = [NSData d ...

最新文章

  1. 有上下界网络流 ---- P4843 清理雪道(DAG图上最小路径重复边覆盖)【模板】有源汇上下界最小流
  2. 信息太多,时间太少: 大脑如何区分重要和不重要的事?
  3. 17. javacript高级程序设计-错误处理与调试
  4. SSE3 和 SSSE3 Intrinsics各函数介绍
  5. optee3.14.0 qemu_v8的环境搭建篇(ubuntu20.10)--终极篇
  6. linux下51单片机开发解决方案
  7. 深入理解计算机系统读书笔记
  8. apache配置-html碎片shtml格式
  9. python如何提取图片特征向量_在python中计算图像的特征向量
  10. php for循环建数据
  11. Creating and Destroying Objects
  12. 小程序授权登录的体验优化
  13. [转载]linux+nginx+python+mysql安装文档
  14. Flask和WebSocket
  15. 从字节理解Unicode(UTF8/UTF16)
  16. mat opencv 修改roi_OpenCV开发笔记(七十三):红胖子8分钟带你使用opencv+dnn+yolov3识别物体...
  17. 『Tableau』 地图显示不正确的一种可能原因
  18. Facebook更名Meta,扎克伯格押注元宇宙
  19. 一位年薪 180 万的蚂蚁金服大佬扔给我的笔记,建议看完
  20. bal插口_调音台上的英文缩写都是什么意思 调音台上面那几个插口是什么作用...

热门文章

  1. 企业元老级员工的激励方式两大解决方案
  2. 笔记本重置找不到恢复环境_win10重置此电脑恢复环境找不到要如何处理
  3. 31、Flutter之Hero动画
  4. 51单片机控制小舵机
  5. 搭建代理服务器获取大量IP
  6. 忻州师范学院2020普通话测试软件,关于2020年普通话测试报名的通知
  7. Node.js 入门
  8. 英雄杀朱雀之章在线活动
  9. 老男孩-筷子兄弟(歌词)
  10. VERO VISI安装教程