一、概述

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

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

直接看下面的效果图吧。

二、效果图

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

三、实现原理方案

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

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

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

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

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

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

privatePaint mImagePaint;private intmImageHeight, mImageWidth;private boolean mIsAutoStart = false;private int mMaskColor =Color.TRANSPARENT;privateClipDrawable mClipDrawable;privateDrawable mMaskDrawable;private intmaskHeight;private intmProgress;privateObjectAnimator mAnimator;private long mAnimDuration = 2500;private floatmScaleX, mScaleY;private int mGravity =Gravity.BOTTOM;private int mOrientaion =ClipDrawable.VERTICAL;private int mMaskOrientation =MaskOrientation.BottomToTop;//Loading oriention

public static final classMaskOrientation {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 voidinitAttrs(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 voidinit() {if (mImagePaint == null) {

mImagePaint= newPaint(Paint.ANTI_ALIAS_FLAG);

mImagePaint.setXfermode(newPorterDuffXfermode(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);

}

}

六、源码下载

原文:http://www.cnblogs.com/JczmDeveloper/p/5037068.html

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

  1. Android基础控件——ProgressBar自定义的介绍、动画效果实现、附加三个漂亮的进度条

    ProgressBar自定义的介绍.动画效果实现.附加三个漂亮的进度条 shape属性介绍: corners 圆角   gradient 渐变   padding 内容离边界距离   size 大小 ...

  2. android图片消失动画效果,用setAnimationStyle来设置popwindow显示消失的动画效果

    popwindow通过setAnimationStyle(int animationStyle)函数来设置动画效果 android:windowEnterAnimation表示进入窗口动画 andro ...

  3. android 自定义view 动画效果,Android自定义view实现阻尼效果的加载动画

    效果: 需要知识: 1. 二次贝塞尔曲线 2. 动画知识 3. 基础自定义view知识 先来解释下什么叫阻尼运动 阻尼振动是指,由于振动系统受到摩擦和介质阻力或其他能耗而使振幅随时间逐渐衰减的振动,又 ...

  4. android 自定义加载动画效果,Android自定义View实现loading动画加载效果

    项目开发中对Loading的处理是比较常见的,安卓系统提供的不太美观,引入第三发又太麻烦,这时候自己定义View来实现这个效果,并且进行封装抽取给项目提供统一的loading样式是最好的解决方式了. ...

  5. android 自定义view 动画效果,Android自定义view----音乐播放动画

    先给大家看一下效果,因为我也不知道这个东西具体叫什么,标题上面写的是"音乐播放动画",可能描述的不太准确. 效果图.gif 前言 最近项目中做了一个音频播放的功能,播放条上需要一个 ...

  6. android 加载更多动画效果,Android实践之带加载效果的下拉刷新上拉加载更多

    前言 之前写的一个LoadingBar,这次把LoadingBar加到下拉刷新的头部.从头写一个下拉刷新,附赠上拉加载更多.下面话不多说了,来一起看看详细的介绍吧. 效果图: 实现过程 首先是自定义属 ...

  7. android的三个基础控件,Android基础控件——ProgressBar自定义的介绍、动画效果实现、附加三个漂亮的进度条...

    xml文件: android:centerColor="#00ff00" android:endColor="#0000ff" android:startCol ...

  8. android app启动图片 加动画效果,Android Studio开发APP启动程序时开屏简单动画效果快速有效解决方案...

    Android Studio开发APP启动程序时开屏简单动画效果快速有效解决方案 大家在设计APP的末期,都会想给APP搞一些"花里胡哨"的特效来提高APP的B格.博主表示亲测有效 ...

  9. android listview下拉动画效果,Android开发中利用ListView实现一个渐变式的下拉刷新动画...

    Android开发中利用ListView实现一个渐变式的下拉刷新动画 发布时间:2020-11-23 16:50:31 来源:亿速云 阅读:80 作者:Leah 本篇文章给大家分享的是有关Androi ...

最新文章

  1. python用表达式解密密文_基于Python解密仿射密码
  2. Java学习需要掌握哪些技能?
  3. php打印模板插件,smarty的插件功能是smarty模板的精华
  4. 3月6日云栖精选夜读:如何实现32.5万笔/秒的交易峰值?阿里交易系统TMF2.0技术揭秘...
  5. mysql可以创建多少条数据类型_mysql支持的数据类型
  6. (91)如何网表文件?
  7. TCP/IP四层模型与OSI七层模型
  8. 请领导批阅文件怎么说_有请考过的说物业经理资格证怎么考?
  9. android网络框架OkHttp之get请求(源码初识)
  10. 机器学习 -- PCA(Ⅱ 梯度上升法解决主成分分析问题)
  11. ERDAS遥感影像处理-专题图制作
  12. 【Docker】11、IDEA集成Docker插件实现一键部署SpringBoot项目
  13. SAS的基本使用介绍2(变量的输入输出格式)
  14. oracle 导出数据库和导入数据库
  15. 计算机网络第4章(网际层)
  16. [Qt] QWidget QWindow 窗口管理器(WM)
  17. 数据分析师只适合男生吗,女生可不可以胜任?
  18. php 源生 命令行执行
  19. 一文入门USB设备的驱动编写方法
  20. c语言如何重命名文件夹,VC 复制移动删除重命名文件文件夹

热门文章

  1. 360算法技术解密与实践-技术干货满满哒
  2. request failed with status code 500翻译_英语歌词的文言文翻译:文艺清新还是矫揉造作?...
  3. 读书日记 莫雨 《一个程序员的奋斗史》Java 面试 感悟 程序员
  4. machinery入门看这一篇(异步任务队列)
  5. java8使用stream操作集合类,如何使用bigDicemal计算工资?
  6. Spring Cloud Sleuth+Zipkin 构建微服务链路跟踪系统
  7. Java高并发编程详解系列-线程安全数据同步
  8. 关于计算机游戏的英语读法,关于电脑游戏的英语作文
  9. 视频移动侦测VMD的实现
  10. 来聊一聊,Go 的相对路径问题