android 微票效果,Android ShimmerLayout实现微光效果解析

前阵子在github上看到一个很不错的动画效果,叫做ShimmerLayout,是一个用于实现内部视图微光效果的布局。

0e62365842ec235caff254a3739ed3cc.gif

如何实现

通过使用PorterDuff,我们可以制造出微光效果。PorterDuff是canvas绘制图像处理中的一种渲染模式,当我们需要绘制出区域覆盖的图形效果的时候,我们可以使用这种方式来绘制。

这里我们采用的是PorterDuff.MODE.SRC_IN,意思是在绘制的时候,显示上下图层相交的部分,且这部分显示上层图层。

b7d6d409e8d3fc0362961cfdbe4d34b9.png

1) 首先我们需要绘制出最上层的微光,这里通过LinearGradient线性渐变渲染器来绘制微光渐变效果,为了使得渐变自然,我们看到,代码里在前后两端都加入了透明色。

private Bitmap getSourceMaskBitmap() {

if (sourceMaskBitmap != null) {

return sourceMaskBitmap;

}

int width = maskRect.width();

int height = getHeight();

/* 通过LinearGradient在遮罩Bitmap上绘制渐变效果 */

final int edgeColor = reduceColorAlphaValueToZero(shimmerColor);

LinearGradient gradient = new LinearGradient(

-maskRect.left, 0,

width + maskRect.left, 0,

/* 透明色 - 微光颜色 - 微光颜色 - 透明色 */

new int[]{edgeColor, shimmerColor, shimmerColor, edgeColor},

new float[]{0.25F, 0.47F, 0.53F, 0.75F},

Shader.TileMode.CLAMP);

Paint paint = new Paint();

paint.setShader(gradient);

sourceMaskBitmap = createBitmap(width, height);

/* 对微光效果的bitmap做一些旋转效果 */

Canvas canvas = new Canvas(sourceMaskBitmap);

canvas.rotate(shimmerAngle, width / 2, height / 2);

canvas.drawRect(-maskRect.left, maskRect.top, width + maskRect.left, maskRect.bottom, paint);

return sourceMaskBitmap;

}

2)、然后,我们需要把微光效果的图层和视图本身的界面混合,使用PorterDuff.MODE.SRC_IN混合效果。首先如何绘制视图本身的界面,这里很简单,直接调用父类的绘制方法super.dispatchDraw(Canvas),紧接着再绘制微光效果的图层。

/* 获取微光效果Bitmap */

localMaskBitmap = getSourceMaskBitmap();

canvas.save();

/* 先绘制GroupView本身的界面 */

super.dispatchDraw(canvas);

/* 再绘制微光效果Bitmap */

canvas.drawBitmap(localMaskBitmap, 0, 0, maskPaint);

canvas.restore();

3) 最后我们发现,微光效果是从左向右移动过去的,如何实现?

通过不断位移localMaskBitmap的位置,这里通过控制偏移值maskOffsetX,实现了微光慢慢位移的效果。

/* 获取微光效果Bitmap */

localMaskBitmap = getSourceMaskBitmap();

canvas.save();

/* canvas 裁剪显示 */

canvas.clipRect(maskOffsetX, 0,

maskOffsetX + localMaskBitmap.getWidth(),

getHeight());

/* 先绘制GroupView本身的界面 */

super.dispatchDraw(canvas);

/* 再绘制微光效果Bitmap */

canvas.drawBitmap(localMaskBitmap, maskOffsetX, 0, maskPaint);

canvas.restore();

这个动画原理本身很简单,不过在内存方面,因为创建了多个bitmap,如果当前界面不包含大图,对内存的消耗还是很低的,适用于为比较轻量级的界面添加效果。

更多细节,看看作者的原文介绍以及GitHub

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值