android开发背景波浪,关于学习Android开源项目之背景有波浪效果的TextView教程

Android中提供了Shader类专门用来渲染图像以及一些几何图形,Shader下面包括几个直接子类,分别是BitmaPshader、 ComposeShader、LinearGradient、RadialGradient、SweepGradient。 BitmapShader主要用来渲染图像,LinearGradient 用来进行梯度渲染,RadialGradient 用来进行环形渲染,SweepGradient 用来进行梯度渲染,ComposeShader则是一个 混合渲染,可以和其它几个子类组合起来使用,本文主要介绍Android开源项目解析之背景有波浪效果的TextView——从Titanic项目学习BitmapShader的使用。

439319ebe45ad026fcc9bc2151d8b20b.png

项目介绍

这篇文章,会介绍一个开源项目,叫做Titanic,是的,中文名就叫“泰坦尼克”…

要实现的效果是下面这样滴

e2b07186a124e84935c43e18f5ab94cd.gif

我的想法

如果你是一个程序员,那么在你第一眼看到这个效果的时候,你可能会想,如果我要实现类似的效果,应该怎么做呢?

我不知道你们会有什么样的思路,我第一眼看到的时候,我想起了PorterDuffXfermode,前面是一张文字的图片,后面一张波浪的图片,然后设置相交模式,从而出现这种文字和图片的交叉效果,不断的改变后面图片位置,实现动态的效果。

当然,我只是想了一想,然后就抱着这个想法看源码去了,看完源码才发现,作者的实现思路更加的NB~通过BitmapShader实现了这种效果,下面,我会参照源码,给你介绍一下实现思路,非常简单,不要眨眼哦~

实现思路

Titanic这个项目非常的简单,只有两个类,分别是Titanic和TitanicTextView,那么如何使用呢?非常简单:

c3f548f99b8fb0d1201916e386c52608.png

如果你不想设置特殊字体,那么中间的代码删除也可以,两行代码搞定,是不是非常easy~

那么Titanic这个类是干嘛的呢?

为了方便理解和观看,我将不重要代码省略了,你可以对照源码观看

我们调用了Titanic的start()之后,就执行了下面的代码了:

1903a9f664f288d28d71f0b383fde8b1.png

14fef0ee09193deb7769ba69cbe43c57.png

这段代码是不是非常简单?但是有点奇怪啊,里面为什么声明Runnable对象呢?而且这里没开线程啊,而是直接调用的run(),好诡异的代码!

其实这个不需要多想,作者只不过是为了代码复用,所用把需要的代码放在run()方法,方便调用,但是这个代码风格我并不喜欢,因为这会让其他阅读代码的人产生误会,比如我就为了这一块代码,想了半个多小时他为什么这样写…

我们看不惯,就可以改成下面的这种方式:

c9abc4aebc68f230dd706ecb56f35d94.png

e66b31fe4e1451070f2af24f8d0b1594.png

都是为了代码复用,这种代码风格我更喜欢一些。

ok,不扯淡,我们看看在start()里面到底做了些什么!

dbb3d0a0b504bdb96fe0479f12b5e605.png

这段代码也很好理解,设置了个标志位,表示我们要开始下沉了哈!然后使用两个ObjectAnimator来进行动画,这个动画是控制干嘛的呢?

看里面的参数,maskX和maskY,作者的注释写的很清楚,maskX的范围是0-200,200是图片的高度,什么图片?当然是后面波浪效果的图片啦,见下图(啥?没有图片!?白色的看不出来…右键保存看吧):

0e6f4a2b3fcb56e99dc3d5b0b6255301.png

注意哦,这张图片的上半部分是透明的,下面是白色的,宽高为200*300。

maskY的变化范围是h/2到-h/2,h则是TextView的高度,也就是上下浮动高度为h,那么这个maskX和maskY到底是干嘛的,这两个属性控制的是什么呢?

首先,我们知道,如果要使用ObjectAnimator实现这种效果,那么我们的控件里面必须有这个属性的getter和setter才行,所以这两个属性肯定是自定义的,我们去看TitanicTextView的代码验证一下:

cfa0499c19c0307287fca124f0250cab.png

果然,我们看到,作者自己定义了这两个成员变量,那么改变这两个值到底有什么作用呢?我们找一下代码里面有什么地方用到了这两个值:

c1aacfea6dc9b5ae7acf7fe2f8ab0047.png

耶,在onDraw()里面,在super.onDraw()之前,用到了这两个参数,这里面有几个变量,我们还没有介绍

sinking 用于判断是否开始浮动动画

shader 这是一个BitmapShader,这是今天我们的男主角

shaderMatrix 这是一个变换矩阵,在这里主要进行了setTranslate操作,参数正是我们的maskX和maskY还有offsetY

这个offsetY是啥子?代码里找找

e2267e67daaf028974c19c93acec1700.png

在最后计算了offsetY,TextView的高度减去waveH,然后除以二,这得到的其实就是wave或者说b的y坐标,在这个基础上,再进行以下操作,就可以实现上下左右移动的动画效果

5fec2f5609ac7dc86f4d01180fb7f35d.png

那么这个shader到底是干嘛的?为啥是我们的男主角?

我们在上面的代码里面,可以看到不仅对offsetY进行了初始化,而且也对shader进行了初始化,里面传入了三个参数

new BitmapShader(b, Shader.TileMode.REPEAT, Shader.TileMode.CLAMP);

第一个参数b是设置Shader要使用的Bitmap对象,第二个参数设置x轴上图像的扩展方式,第三个参数则是y轴上的扩展方式,这个参数共有以下三种

CLAMP :如果渲染器超出原始边界范围,会复制范围内边缘染色

REPEAT :横向和纵向的重复渲染器图片,平铺

MIRROR:镜像方式平铺。

那么上面的写法我们就很明白了,作者在x轴上复制重复,在y轴上渲染边缘颜色,那么,wave得到的Shader就是下面这个样子()

fc13fa976ba617e6dd002e5230209d98.png

还要注意一点,就是创建BitmapShader时,第一个参数的得来

caf0a5bff40eca38b9c9c93555fb0b26.png

首先根据wave的Drawable对象的长宽,构建一个一样大的Bitmap对象,然后去创建了个Canvas对象,然后画了一个和当前文字颜色的背景,这时候,我们Shader上面的透明颜色,就变成了我们的文字颜色,然后给Drawable设置Bounds之后,draw了一下,这样,我们的Bitmap对象,就是一个和wave的Drawable大小相同,下半部分是白色波浪,上半部分是文字颜色背景的一张图片啦,这个时候在创建一个BitmapShader,就可以得到我们想要的了,然后

39b73946e2b4155c6d497c930e98142b.png

设置给paint,这样用这支笔写出来的字,就是以我们创建好的BitmapShader为背景的字了~

波浪效果呢?

开启动画之后,改变maskX和maskY,然后用矩阵移动BitmapShader的位置,字体的背景颜色就变化咯,而我们看到的效果就是波浪效果~

还记得maskY的变化范围吗?

h/2 到 -h/2

这样就能够从最下面没有波浪,一直增长到白色波浪沾满整个高度,然后就出现这个效果啦~

如果这篇文章你看明白了,那么另外一个类似的项目,你应该就很容易知道是怎么实现的了吧~

7ccc6a0935db39a24a2f7ee04b3cac4a.gif

Shimmer-Android项目

综上文主要是介绍Titani开源项目,要实现这个开源项目用到两个类,分别是Titanic和TitanicTextView,详细介绍了调用了Titanic的start(),以及使用参数maskX和maskY等其他一些相关的参数以及方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值