参考知识点:01.5 精通自定义 View 之绘图基础——Canvas
一、原理
这个动画的原理很简单,就是每次将裁剪区域变大,在裁剪区域内的图像就会显示出来,而裁剪区域之外的图像不会显示。而关键问题在于如何计算裁剪区域。
再来看一下动画截图,如下图所示。
从图示中可以看出,有两个裁剪区域。
裁剪区域一:从左向右,逐渐变大。假设宽度是 clipWidth,高度是 CLIP_HEIGHT,那么裁剪区域一所对应的 Rect 对象如下:
裁剪区域二:从右向左,同样逐渐变大,它的宽度、高度都与裁剪区域一相同。但它是从右向左变化的,假设图片的宽度是 width,那么裁剪区域二所对应的 Rect 对象如下:
二、示例代码
|
|
通过调用 invalidate() 函数的方式来重复触发 onDraw() 函数,然后在 onDraw() 函数中计算需要裁剪的画布。
在上述代码中,首先,由于 mPath 对象是每次都复用的,所以,在每次计算裁剪区域前, 都需要调用 mPath.reset() 函数将区域置空。
其次,根据计算裁剪区域的原理循环计算图片中每条间隔的裁剪区域并添加到 mPath 对象中。
最后,将图片绘制在裁剪过的画布上,并渐变增大裁剪区域。
需要注意的是,当裁剪区域超过图像大小时,表示当前图像已经完全被绘制出来,可以暂停当前的绘制,以免浪费 CPU 资源。
当图片宽高超过控件自身大小时,裁剪动画效果很差,因此对原图进行缩放并重置参数。其效果图如下所示: