尊重原创转载请注明:From AigeStudio(http://blog.csdn.net/aigestudio)Power by Aige 侵权必究!
炮兵镇楼
上一节我们实现了翻页的曲线效果,但是效果有点小瑕疵不知道大家发现没有:
如图,我们发现折叠区域怪怪的,并没有实现我们之前的“弯曲”效果,为什么呢?是计算错了么?其实不是的,我们之前测试的时候使用的将canvas填色,但是这里我们用到的是一张位图,虽然我们的Path是曲线、Region有曲线区域,但是我们的Bitmap是个规规矩矩的矩形啊,怎么弯曲~怎么办呢?说起扭曲,我们首先想到的是drawBitmapMesh方法,它是我们现在了解的也是唯一的一个能对图像进行扭曲的API,而使用drawBitmapMesh方法呢我们也可以有多种思路,最简单的就是最大化恒定细分值,将图像分割成一定的网格区域,然后判断离曲线起点和顶点最近的细分线获取该区域内的细分线交点按指定方向百分比递减移动起点和顶点的距离值即可,这种方法简单粗暴,但扭曲不是很精确,正确地说精确度取决于细分,细分也大越精确当然也越耗性能,而第二种方法呢是根据曲线的起点和顶点动态生成细分值,我们可以确保在起点和顶点处都有一条细分线,这样就可以很准确地计算扭曲范围,但是我们就需要动态地去不断计算细分值相当麻烦,用哪种呢?这里鉴于时间关系还是尝试用第一种去做,首先定义宽高的细分值:
private static final int SUB_WIDTH = 19, SUB_HEIGHT = 19;// 细分值横竖各19个网格
19个网格将控件分割为20x20的网格细分线条区域,尔后我们就不需要使用drawBitmap绘制折叠区域了而是改用drawBitmapMesh。之前在讲1/6的时候有盆友多次小窗过我离屏缓冲是个什么意思需要注意什么,这里我权当演示,在绘制扭曲图像的时候使用一个单独的Bitmap并将其装载进一个额外的Canvas中: