canvas剪裁(一)

来源:互联网 发布:web二手交易网站源码 编辑:程序博客网 时间:2024/05/18 01:12

网上有很多这样的demo,但是在最初调试的时候显示总是不对,后来修改了<uses-sdk android:minSdkVersion="13" /> 以后才可以 (<13也可以)

package com.test.canvas.clip;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.graphics.Region;import android.util.AttributeSet;import android.view.View;public class TestView extends View {private Paint mPaint = new Paint();public TestView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);drawBg(canvas);drawDiff(canvas);drawReplace(canvas);drawUnion(canvas);drawXor(canvas);drawReverse(canvas);drawIntersect(canvas);}//背景private void drawScene(Canvas canvas) {canvas.clipRect(0, 0, 100, 100);canvas.drawColor(Color.WHITE);mPaint.setColor(Color.RED);canvas.drawLine(0, 0, 100, 100, mPaint);mPaint.setColor(Color.GREEN);canvas.drawCircle(30, 70, 30, mPaint);mPaint.setColor(Color.BLUE);canvas.drawText("Clipping", 50, 50, mPaint);}//背景private void drawBg(Canvas canvas){canvas.save();canvas.translate(10,10);drawScene(canvas);canvas.restore();}//相减private void drawDiff(Canvas canvas){canvas.save();canvas.translate(160, 10);canvas.clipRect(0, 0, 60, 60);canvas.clipRect(40, 40, 100, 100, Region.Op.DIFFERENCE);drawScene(canvas);canvas.restore();}//取代private void drawReplace(Canvas canvas){Path path = new Path();canvas.save();canvas.translate(10, 160);path.reset();canvas.clipPath(path); // makes the clip emptypath.addCircle(50, 50, 50, Path.Direction.CCW);canvas.clipPath(path, Region.Op.REPLACE);drawScene(canvas);canvas.restore();canvas.save();canvas.translate(10, 160);canvas.clipRect(0, 0, 60, 60);canvas.clipRect(40, 40, 100, 100, Region.Op.REPLACE);drawScene(canvas);canvas.restore();}//并集private void drawUnion(Canvas canvas){canvas.save();canvas.translate(160, 160);canvas.clipRect(0, 0, 60, 60);canvas.clipRect(40, 40, 100, 100, Region.Op.UNION);drawScene(canvas);canvas.restore();}//存异去同XORprivate void drawXor(Canvas canvas){canvas.save();canvas.translate(10, 310);canvas.clipRect(0, 0, 60, 60);canvas.clipRect(40, 40, 100, 100, Region.Op.XOR);drawScene(canvas);canvas.restore();}//Difference的相反运算,将后画的部分中去掉先前的部分private void drawReverse(Canvas canvas){canvas.save();canvas.translate(160, 310);canvas.clipRect(0, 0, 60, 60);canvas.clipRect(40, 40, 100, 100,Region.Op.REVERSE_DIFFERENCE);drawScene(canvas);canvas.restore();//canvas.save();//canvas.translate(160, 310);//canvas.clipRect(0, 0, 60, 60);//canvas.clipRect(40, 40, 100, 100,//Region.Op.INTERSECT);//drawScene(canvas);//canvas.restore();}//交集private void drawIntersect(Canvas canvas){canvas.save();canvas.translate(10, 460);canvas.clipRect(0, 0, 60, 60);canvas.clipRect(40, 40, 100, 100,Region.Op.INTERSECT);drawScene(canvas);canvas.restore();}}


效果如下:

 http://

源码下载:

http://pan.baidu.com/s/1hq5NfyW


假设:区域A,区域B
先裁剪A,再裁剪B(带参数) 

Path pAPath pBCanvas.clip(pA);Canvas.clip(pB, Region.Op...);/*Region.Op... 参数说明: Region.Op.DIFFERENCE         -- 得到的区域    ->在A中,与B不相同的部分 Region.Op.REVERSE_DIFFERENCE-- 得到的区域    ->在B中,与A不相同的部分 Region.Op.INTERSECT        -- 得到的区域    ->A与B相同的部分(交集)Region.Op.XOR       -- 得到的区域    ->不包含A与B相同的部分(全集减去交集) Region.Op.UNION        -- 得到的区域    ->A与B的所有部分(全集) Region.Op.REPLACE        -- 得到的区域    ->将A的区域用B替换*/ 

参考网页:http://blog.csdn.net/jason_wks/article/details/8199096

参考网页:http://blog.csdn.net/smilekai0908/article/details/7771261



0 0
原创粉丝点击