Android clipRect与Animation连用引起的问题

最近在写一个关于Clip图片的Android demo,遇到了一个小问题。
如果有问题,欢迎交流:[email protected]

我这个DEMO的功能是能从SDCard中找出所有的图片,然后选择一张图片后,浏览大图,能上下翻页,当点击图片时,翻页按钮显示(有一个动画过程),过一段时间(3秒),按钮又会隐藏,这其中也有一个动画。

运行效果图

Android clipRect与Animation连用引起的问题_第1张图片

图一:从SDCard中找出图片


Android clipRect与Animation连用引起的问题_第2张图片

图二:选择一张图片后,高亮矩形框可以改变大小,移动。翻页按钮显示与隐藏都有动画效果。


我遇到的问题是什么呢?

当按钮做动画时(其实就是改变alpha,从0 - 255或从255 - 0),它会导致ImageView重新绘制,因为我重写了ImageView的onDraw方法,在它里面绘制了黄色矩形框,按理说重新导致onDraw也没有什么问题呀,无非就是多画几次,可能效率不高,但它会导致绘制时,画出一些奇怪的东西,如下图:

Android clipRect与Animation连用引起的问题_第3张图片

图三:这个图是在真机的面截的,图一图二是在模拟器上截的,可能看到的不太一样,在模拟器上不会出现这种情况,每次当动画开始时,都会出现像上图的那个现象。

    @Override
    protected void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);
        onDrawHighlightView(canvas);
    }

    protected void onDrawHighlightView(Canvas canvas)
    {
        canvas.save();
        canvas.clipRect(m_highlightRect, Op.XOR);          // 先设置一个剪裁区域,大小为m_highlightRect
        canvas.drawColor(Color.argb(158, 75, 75, 75));     // 再画一个半透明的颜色
        canvas.restore();
        canvas.drawPath(m_highlightPath, m_highlightRectPaint);     // 再画出黄色的Path
    }

按理说上面的代码没有问题,但现实是有的,问题就出在clipRect这个函数,我把它注掉,就没有问题了。最后我发现,是clipRect的第二参数引起的问题,也就是Op.XOR,这个Op是个什么东西:
Op是一个枚举:有以下几个值:
               DIFFERENCE(0),                                                           // 第一次不同于第二次的部分显示出来
               INTERSECT(1),                                                               // 默认的
               UNION(2),                                                                           // 取全集
               XOR(3),                                                                                     // 补集,就是全集的减去交集的剩余部分显示
               REVERSE_DIFFERENCE(4),                         // 第二次不同于第一次的部分显示
               REPLACE(5);                                                                     // 显示第二次的

怎么解决这个问题呢?

之前我去DEBUG,跟到View是怎么绘制的,但也没有搞明白哪里出的问题,最后想起可能是这个Op引起的问题,所以,我把这几个值都试了一遍,发现用 DIFFERENCE 没有问题,也能达到效果。这个问题就这样解决了。

把 canvas.clipRect(m_highlightRect, Op.XOR);   改为 canvas.clipRect(m_highlightRect, Op. DIFFERENCE );
就好了,但不知道其根本原因是什么,望知道的朋友,告诉我一声。




你可能感兴趣的:(Android clipRect与Animation连用引起的问题)