最近在写一个关于Clip图片的Android demo,遇到了一个小问题。
如果有问题,欢迎交流:leehong2005@163.com。
我这个DEMO的功能是能从SDCard中找出所有的图片,然后选择一张图片后,浏览大图,能上下翻页,当点击图片时,翻页按钮显示(有一个动画过程),过一段时间(3秒),按钮又会隐藏,这其中也有一个动画。
按理说上面的代码没有问题,但现实是有的,问题就出在clipRect这个函数,我把它注掉,就没有问题了。最后我发现,是clipRect的第二参数引起的问题,也就是Op.XOR,这个Op是个什么东西:
Op是一个枚举:有以下几个值:
DIFFERENCE(0),
// 第一次不同于第二次的部分显示出来
INTERSECT(1),
// 默认的
UNION(2),
// 取全集
XOR(3),
// 补集,就是全集的减去交集的剩余部分显示
REVERSE_DIFFERENCE(4),
// 第二次不同于第一次的部分显示
REPLACE(5);
// 显示第二次的
把 canvas.clipRect(m_highlightRect, Op.XOR);
改为 canvas.clipRect(m_highlightRect, Op.
DIFFERENCE
);
就好了,但不知道其根本原因是什么,望知道的朋友,告诉我一声。
如果有问题,欢迎交流:leehong2005@163.com。
我这个DEMO的功能是能从SDCard中找出所有的图片,然后选择一张图片后,浏览大图,能上下翻页,当点击图片时,翻页按钮显示(有一个动画过程),过一段时间(3秒),按钮又会隐藏,这其中也有一个动画。
运行效果图
图一:从SDCard中找出图片
图二:选择一张图片后,高亮矩形框可以改变大小,移动。翻页按钮显示与隐藏都有动画效果。
我遇到的问题是什么呢?
当按钮做动画时(其实就是改变alpha,从0 - 255或从255 - 0),它会导致ImageView重新绘制,因为我重写了ImageView的onDraw方法,在它里面绘制了黄色矩形框,按理说重新导致onDraw也没有什么问题呀,无非就是多画几次,可能效率不高,但它会导致绘制时,画出一些奇怪的东西,如下图:
图三:这个图是在真机的面截的,图一图二是在模拟器上截的,可能看到的不太一样,在模拟器上不会出现这种情况,每次当动画开始时,都会出现像上图的那个现象。
@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是一个枚举:有以下几个值:
怎么解决这个问题呢?
之前我去DEBUG,跟到View是怎么绘制的,但也没有搞明白哪里出的问题,最后想起可能是这个Op引起的问题,所以,我把这几个值都试了一遍,发现用 DIFFERENCE 没有问题,也能达到效果。这个问题就这样解决了。把 canvas.clipRect(m_highlightRect, Op.XOR);
就好了,但不知道其根本原因是什么,望知道的朋友,告诉我一声。