android中canvas的clipRect和concate调用顺序不同导致的图像效果不同。

不操千曲而后晓声,观千剑而后识器。这篇文章主要讲述android中canvas的clipRect和concate调用顺序不同导致的图像效果不同。相关的知识,希望能为你提供帮助。
这几天一直弄关于Canvas方法调用顺序不同导致效果不一样的測试。
至于原理,我的canvas和Matrix之间的关系能够看到原因。还是就是每一个人要多去尝试,才干真正理解透彻。

接下来我解说一下第一张图五个标签的意义;
第一顺序图片是正常全屏显示在800*1280的手机上的。没有任务效果。只是原图是720*1280,所以为了满足手机的屏幕大小,他进行了等倍数的放大。

第二顺序图效果是进行PolyToPoly之后的图片,没有进行区域剪切。
【android中canvas的clipRect和concate调用顺序不同导致的图像效果不同。】第三顺序图是先剪切显示区域,然后PolyToPoly以后的图。
第四顺序图是仅仅是剪切显示区域,没有polytopoly。

第五顺序图表示先polytopoly,然后剪切区域。
既然这样,那就谈谈自己对这样效果的看法。假设有什么不正确的地方,网友能够留言给我。
第三顺序的图的源代码是:
mBmp=BitmapFactory.decodeResource(getResources(), R.drawable.guide_page01);
canvas.save();  
float src[]={0,0,getWidth(),0,getWidth(),getHeight(),0,getHeight()};
float sou[]={0,0,(float)(getWidth()),(float)(100),(float)(getWidth()),(float)(200),0,(float)(getHeight())};
m.setPolyToPoly(src, 0, sou, 0, src.length/2);
canvas.clipRect(getWidth()/2-getWidth()/6, getHeight()/2-getWidth()/6, getWidth()/2+ getWidth()/6, getHeight()/2+ getHeight()/6);
canvas.concat(m);

canvas.drawBitmap(mBmp,0,0,null);
super.onDraw(canvas);
canvas.restore();  

表示的是,我已经剪切好要显示的区域,以后不管图片怎样变化矩阵,我仅仅是显示当前的区域。所以polytopoly尽管对全局进行了变化。可是显示区域还是一样不变。

第四顺序图的源代码是:

mBmp=BitmapFactory.decodeResource(getResources(), R.drawable.guide_page01);
canvas.save();  
float src[]={0,0,getWidth(),0,getWidth(),getHeight(),0,getHeight()};
float sou[]={0,0,(float)(getWidth()),(float)(100),(float)(getWidth()),(float)(200),0,(float)(getHeight())};
m.setPolyToPoly(src, 0, sou, 0, src.length/2);
canvas.clipRect(getWidth()/2-getWidth()/6, getHeight()/2-getWidth()/6, getWidth()/2+ getWidth()/6, getHeight()/2+ getHeight()/6);
//canvas.concat(m);

canvas.drawBitmap(mBmp,0,0,null);
super.onDraw(canvas);
canvas.restore();  
表示除去polytopoly的矩阵变化。
仅仅是显示剪切区域的图片显示。
第五顺序图的源代码是:

mBmp=BitmapFactory.decodeResource(getResources(), R.drawable.guide_page01);
canvas.save();  
float src[]={0,0,getWidth(),0,getWidth(),getHeight(),0,getHeight()};
float sou[]={0,0,(float)(getWidth()),(float)(100),(float)(getWidth()),(float)(200),0,(float)(getHeight())};
m.setPolyToPoly(src, 0, sou, 0, src.length/2);
canvas.concat(m);
canvas.clipRect(getWidth()/2-getWidth()/6, getHeight()/2-getWidth()/6, getWidth()/2+ getWidth()/6, getHeight()/2+ getHeight()/6);
canvas.drawBitmap(mBmp,0,0,null);
super.onDraw(canvas);
canvas.restore();  
他对第四顺序图的polytopoly矩阵变化。他表示的是,我想进行polytopoly矩阵变化,可是我想要看到的变换区域就仅仅有我想要剪切的区域。
所以就呈现例如以下第五顺序的效果。
从以上得出一个结论:polytopoly矩阵变换仅仅对后面的图形剪切才有效。前面的剪切不会影响后面原图的变换。仅仅是固定了显示区域。

android中canvas的clipRect和concate调用顺序不同导致的图像效果不同。

文章图片
android中canvas的clipRect和concate调用顺序不同导致的图像效果不同。

文章图片
android中canvas的clipRect和concate调用顺序不同导致的图像效果不同。

文章图片
android中canvas的clipRect和concate调用顺序不同导致的图像效果不同。

文章图片
android中canvas的clipRect和concate调用顺序不同导致的图像效果不同。

文章图片
android中canvas的clipRect和concate调用顺序不同导致的图像效果不同。

文章图片




























    推荐阅读