效果图:

一、 介绍Paint.setXfermode() 以及PorterDuffXfermode

public class WaveView extends View {private Paint mWavePaint;private Paint mCirclePaint;private Canvas mCanvas;private Bitmap mBitmap;private int mWidth;private int mHeight;private PorterDuffXfermode mMode = new PorterDuffXfermode(PorterDuff.Mode.XOR);//设置mode 为XORpublic WaveView(Context context) {super(context, null);}public WaveView(Context context, AttributeSet attrs) {super(context, attrs, 0);mWavePaint = new Paint();mWavePaint.setColor(Color.parseColor("#33b5e5"));mCirclePaint = new Paint();mCirclePaint.setColor(Color.parseColor("#99cc00"));mBitmap = Bitmap.createBitmap(500,500, Bitmap.Config.ARGB_8888); //生成一个bitmapmCanvas = new Canvas(mBitmap);}public WaveView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int widthSize = MeasureSpec.getSize(widthMeasureSpec);int widthMode = MeasureSpec.getMode(widthMeasureSpec);int heightSize = MeasureSpec.getSize(heightMeasureSpec);int heightMode = MeasureSpec.getMode(heightMeasureSpec);if (widthMode == MeasureSpec.EXACTLY) {mWidth = widthSize;}if (heightMode == MeasureSpec.EXACTLY) {mHeight = heightSize;}setMeasuredDimension(mWidth, mHeight);}@Overrideprotected void onDraw(Canvas canvas) {mCanvas.drawCircle(100,100,100,mCirclePaint);mCanvas.drawRect(100,100,300,300,mWavePaint);canvas.drawBitmap(mBitmap,200,200,null);super.onDraw(canvas);}
}

可以看到 是我们现在自己的画布上铺了一个bitmap(这里可以理解canvas为桌子 bitmap为画纸,我们在bimap上画画), 然后在bitmap上画了 一个圆,和一个矩形。最后把我们的mBitmap画到系统的画布上(显示到屏幕上),得到了以下效果。

然后我们用setXfermode()方法给他设置一个mode,这里设置SRC_IN。效果如下:

总结各个模式如了下图:

我们要实现的是一个圆形的水波纹那种loadingview。。首要就是实现这个水波纹。这时候贝塞尔曲线就派上用场了。这里采用三阶贝塞尔, 不停地改变X 模拟水波效果。

public class WaveLoadingView extends View {private final Paint mSRCPaint;private Paint mPaint;private Paint mTextPaint;private Canvas mCanvas;private Bitmap mBitmap;private int y;private int x;private Path mPath;private boolean isLeft;private int mWidth;private int mHeight;private int mPercent;private PorterDuffXfermode mMode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);public WaveLoadingView(Context context) {this(context, null);}public WaveLoadingView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public WaveLoadingView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);mPaint = new Paint();mPaint.setStrokeWidth(10);mPaint.setAntiAlias(true);mPaint.setColor(Color.parseColor("#8800ff66"));mPath = new Path();mSRCPaint = new Paint();mSRCPaint.setAntiAlias(true);mSRCPaint.setColor(Color.parseColor("#88dddddd"));mBitmap = Bitmap.createBitmap(getResources().getDimensionPixelSize(R.dimen.bg_size),getResources().getDimensionPixelSize(R.dimen.bg_size), Bitmap.Config.ARGB_8888);mCanvas = new Canvas(mBitmap);mTextPaint = new Paint();mTextPaint.setAntiAlias(true);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int widthSize = MeasureSpec.getSize(widthMeasureSpec);int widthMode = MeasureSpec.getMode(widthMeasureSpec);int heightSize = MeasureSpec.getSize(heightMeasureSpec);int heightMode = MeasureSpec.getMode(heightMeasureSpec);if (widthMode == MeasureSpec.EXACTLY) {mWidth = widthSize;}if (heightMode == MeasureSpec.EXACTLY) {mHeight = heightSize;}y = mHeight;setMeasuredDimension(mWidth, mHeight);}@Overrideprotected void onDraw(Canvas canvas) {if (x > 100) {isLeft = true;} else if (x < 0) {isLeft = false;}if (isLeft) {x = x - 2;} else {x = x + 2;}mPath.reset();if (mPercent != 0) {y = (int) ((1 - mPercent /100f) *mHeight);mPath.moveTo(0, y);mPath.cubicTo(100 + x * 2, 50 + y, 100 + x * 2, y - 50, mWidth, y);mPath.lineTo(mWidth, mHeight);mPath.lineTo(0, mHeight);mPath.close();}//清除掉图像 不然path会重叠mBitmap.eraseColor(Color.parseColor("#00000000"));mCanvas.drawCircle(mWidth / 2, mHeight / 2, mWidth / 2, mSRCPaint);mPaint.setXfermode(mMode);mCanvas.drawPath(mPath, mPaint);mPaint.setXfermode(null);canvas.drawBitmap(mBitmap, 0, 0, null);mTextPaint.setTextSize(80);float strLen = mTextPaint.measureText(mPercent + "");canvas.drawText(mPercent + "", mWidth / 2 - strLen / 2, mHeight / 2+15, mTextPaint);mTextPaint.setTextSize(40);canvas.drawText("%", mWidth / 2 + 50, mHeight / 2 - 20, mTextPaint);postInvalidateDelayed(10);}public void setPercent(int percent){mPercent = percent;}}

效果如下:

Android圆形水波纹WaveLoading动画相关推荐

  1. android曲线水波纹录音动画,Android-贝塞尔曲线实现水波纹动画

    Android 系统api提供了quadTo和rQuadTo实现二阶贝塞尔曲线,三阶贝塞尔曲线在这不做阐述,只不过是两个控制点. 效果图 首先看张二阶贝赛尔的曲线 Path path = new Pa ...

  2. Android自定义水波纹动画Layout

    Android自定义水波纹动画Layout 源码是双11的时候就写好了,但是我觉得当天发不太好,所以推迟了几天,没想到过了双11女友就变成了前女友,桑心.唉不说了,来看看代码吧. 展示效果 Hi前辈 ...

  3. android水平波浪扩散动画,Android实现水波纹扩散效果

    本文实例为大家分享了Android实现水波纹扩散效果的具体代码,供大家参考,具体内容如下 先上图 ?澹∶挥型计??跃湍昧诵"泊?媪恕?/p> 先看一下如何使用这个View. andro ...

  4. Android Material Design 之 Activity 跳转水波纹扩散动画

    博主声明: 转载请在开头附加本文链接及作者信息,并标记为转载.本文由博主 威威喵 原创,请多支持与指教. 本文首发于此   博主:威威喵  |  博客主页:https://blog.csdn.net/ ...

  5. android动画水波纹外扩,Android实现水波纹外扩效果的实例代码

    微信曾经推出了一个查找附近好友的功能,大致功能是这样的:屏幕上有一个按钮,长按按钮的时候,会有一圈圈水波纹的动画向外扩散,松手后,动画结束. 现在简单来实现这样的一个动画功能: 思路: 主要用到了下面 ...

  6. Android实现水波纹外扩效果

    微信曾经推出了一个查找附近好友的功能,大致功能是这样的:屏幕上有一个按钮,长按按钮的时候,会有一圈圈水波纹的动画向外扩散,松手后,动画结束. 现在简单来实现这样的一个动画功能: 思路: 主要用到了下面 ...

  7. FLASH水波纹效果动画制作教程图文自编

    这个教程很简单也好学,希望对初步认识FLASH的动画爱好者有帮助,废话少说,下面我们开始制作 教程吧 教程准备,准备一张带水的风景图片为例,其他没有什么需求 一,首先打开FLASH软件8.0,这个版本 ...

  8. android开发控件水波纹,Android实现水波纹控件的方法

    有很多app使用过水波纹的这样的效果,看着很酷酷的样子,所以自己就撸码写了一个. 实现思路: 利用贝塞尔曲线绘制圆弧(也就是水波的波纹) 通过动画改变绘制的起始点使水波纹平移 首先,定义我们需要的自定 ...

  9. android自定义水波纹,android 自定义view-水波纹进度球

    android 进阶之路-自定义view-水波纹进度球 如果你是老司机,一看标题就会就return吧,嘻嘻. 在我们的日常开发中自定义控件还是用的挺多的,设计师或者产品为了更好的漂亮,美观,交互都会做 ...

最新文章

  1. 一文弄懂神经网络中的反向传播法——BackPropagation
  2. mysql 字段存放小图标_让MySQL支持emoji图标存储
  3. CCNP张SIR的视频教程(完全可以下载)
  4. jenkins linux虚拟机,Linux系统中jenkins使用的简单介绍
  5. 游戏人生,谈谈自己的游戏经历
  6. Linux硬盘检测命令smartctl
  7. 如何在Exchange 2013中禁用对ECP的外部访问
  8. php cms 那个安全,PHPCMS系统安全设置步骤
  9. API接口文档生成方案调研
  10. c++语言常量,C++常量(constant)
  11. Android自定义Behavior
  12. 关于Windows 7操作系统进行磁盘碎片整理时提示“已使用其他程序计划了磁盘碎片整理程序”的解决办法
  13. VUE3 响应式 API 之 toRef 与 toRefs
  14. 腾讯推页游平台’”页游乐园”YY.QQ.com
  15. 【CentOS7联网】保姆级手把手解决CentOS7的上网问题
  16. 服务器2012系统备份方法,服务器2012系统如何备份数据库备份
  17. 个人信息管理系统数据表设计
  18. java使用grok解析日志文件
  19. 2.2总线的性能指标
  20. 物联网系列--整体框架搭建

热门文章

  1. 矿山井下IT配电系统绝缘监测研究及应用
  2. 快播倒下后,电影站长该如何面对转型之痛
  3. 【freecodecamp】Apply Functional Programming to Convert Strings to URL Slugs
  4. AGC的作用(自动增益控制)
  5. WebGL+shader实现素描效果渲染
  6. 18考研感悟-大三考研狗一路的学习生活感悟
  7. 保存美丽记忆 用ASP.NET创建网络相册
  8. 利用 assistant_如何在没有编程经验的情况下为Google Assistant构建应用
  9. python 乱码 无效_python写入csv中文乱码问题,encoding=’utf-8’无效还是乱码——吕江民·日常随笔...
  10. MRT(MODIS Reprojection Tool) 使用教程