首页 > 移动平台 > 详细

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

时间:2017-08-19 19:16:17      阅读:217      评论:0      收藏:0      [点我收藏+]

这几天一直弄关于Canvas方法调用顺序不同导致效果不一样的測试。

至于原理,我的canvas和Matrix之间的关系能够看到原因。还是就是每一个人要多去尝试,才干真正理解透彻。

接下来我解说一下第一张图五个标签的意义;

第一顺序图片是正常全屏显示在800*1280的手机上的。没有任务效果。只是原图是720*1280,所以为了满足手机的屏幕大小,他进行了等倍数的放大。

第二顺序图效果是进行PolyToPoly之后的图片,没有进行区域剪切。

第三顺序图是先剪切显示区域,然后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调用顺序不同导致的图像效果不同。

原文:http://www.cnblogs.com/ljbguanli/p/7397554.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!