资源描述:
《自定义View——PorterDuffXfermode》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、自定义View——PorterDuffXfermode楔子我们在自定义的过程,经常会遇到多个图形相交的问题(如下图),那么系统是如何处理图片相交部分的绘制的呢?View的基本框架(之后的代码都是基于该View):publicclassPorterDuffXfermodeViewextendsView{//画笔privatefinalPaintmPaint=newPaint();//View的宽高privateintmViewWidth;privateintmViewHeight;publicPor
2、terDuffXfermodeView(Contextcontext){this(context,null);}publicPorterDuffXfermodeView(Contextcontext,AttributeSetattrs){this(context,attrs,0);}publicPorterDuffXfermodeView(Contextcontext,AttributeSetattrs,intdefStyleAttr){super(context,attrs,defStyleAt
3、tr);initWidget();}privatevoidinitWidget(){//初始化画笔mPaint.setStyle(Paint.Style.FILL);mPaint.setAntiAlias(true);mPaint.setDither(true);}@OverrideprotectedvoidonSizeChanged(intw,inth,intoldw,intoldh){super.onSizeChanged(w,h,oldw,oldh);mViewWidth=w;mViewHe
4、ight=h;}@OverrideprotectedvoidonDraw(Canvascanvas){super.onDraw(canvas);}实现代码://自定义View@OverrideprotectedvoidonDraw(Canvascanvas){super.onDraw(canvas);canvas.translate(mViewWidth/2,mViewHeight/2);firstExample(canvas);}/***制作具有相交部分的圆和正方形*/privatevoidfi
5、rstExample(Canvascanvas){//绘制一个正方型mPaint.setColor(Color.BLUE);canvas.drawRect(-300,-300,0,0,mPaint);//绘制一个圆mPaint.setColor(Color.RED);canvas.drawCircle(0,0,200,mPaint);}首先我们要知道系统是如何绘制图形的,系统每绘制一个图形(如:canvas.drawXxx())就代表创建了一个图层,那么什么叫做图层?我们看一张图就明白了1、图片中
6、的三个颜色分别代表一个图层,每个图层的内容就是绘制的图形。2、系统默认是图层向上累加绘制,也就是红色是最先绘制的,蓝色是之后绘制的,黄色是最后绘制的。所以图形相交的部分,就被上层的图层的内容给掩盖了。既然明白了图层的概念,我们就可以回到正题,如何处理图层的相交部分。Android为我们提供了PorterDuffXfermode这个类,来处理关于图层相交的问题。PorterDuffXfermode的使用PorterDuffXfermode能够实现的功能首先我们来看一下PorterDuffXfermo
7、de有哪些功能注:(dst表示先绘制的图,src表示后绘制的图)稍微简单的解释一下常用的功能:凡是带有IN的表示:取两个图层的相交部分,关于相交部分显示什么内容有DST和SRC决定。凡是带有OUT的表示:取两个图层中另一方不相交的部分。凡是带有OVER的表示:当俩个图层存在相交部分时,显示哪个图层的内容PorterDuffXfermode的简单使用作用一:图层的交换任务:将第一幅图的正方形显示在顶部,圆形显示在底部。首先如何创建PorterDuffXfermode。//构造方法/***Porter
8、Duff.Mode:这是一个枚举类,枚举类的参数为上面的示意图*/PorterDuffXfermode(PorterDuff.Modemode)然后,将创建好的PorterDuffXfermode放入Paint中mPaint.setXfermode(newPorterDuffXfermode(mode))为什么是将模式放入到画笔中00,这是表示画笔当遇到图形相交的问题的时候,按照这种方式来解决。代码的实现:privatevoidsecondExample(Canvascanvas)