您的位置:首页 > 移动开发 > Android开发

android 切割画布(clipRect)详解

2013-05-22 10:49 369 查看
初次接触到android的clip有以下两点疑问:

1. Clip(剪切)的时机

2. Clip中的Op的参数的意思。

通常咱们理解的clip(剪切),是对已经存在的图形进行clip的。但是,在android上是对canvas(画布)上进行clip的,要在画图之前对canvas进行clip,如果画图之后再对canvas进行clip不会影响到已经画好的图形。一定要记住clip是针对canvas而非图形。

接下来通过android自带的APIdemo Clipping例子详细讲述Clip中的Op的参数的意思。Android提供clipRect、clipPath和clipRegion剪切区域的API。

Op一共有 DIFFERENCE,INTERSECT,UNION,XOR, REVERSE_DIFFERENCE, REPLACE六种选择。

例子:

1. 在canvas上剪切从(0,0)到(60,60)的方块。下图蓝色区域加紫色区域。

2. 在canvas上剪切从(40,40)到(100,100)的方块。下图橄榄色区域加紫色区域。

3. 在canvas上剪切从(0,0)到(100,100)的方块。



先在第二方块上加上Op参数例如:canvas.clipRect(40, 40, 100, 100, Region.Op. DIFFERENCE);

首先,需要搞清楚Op参数针对的对象。接着了解其含义。

Op参数针对的对象是之前剪切的区域以及当前要剪切的区域。

在本例中涉及到区域是从(0,0)到(60,60)的方块和从(40,40)到(100,100)的方块。

那有哪些含义呢?就是表示当前要剪切的区域与之前剪切过的之间的关系。

DIFFERENCE:之前剪切过除去当前要剪切的区域(蓝色区域)。

INTERSECT:当前要剪切的区域在之前剪切过内部的部分(紫色区域)。

UNION:当前要剪切的区域加上之前剪切过内部的部分(蓝色区域+紫色区域+橄榄色区域)。

XOR:异或,当前要剪切的区域与之前剪切过的进行异或。(蓝色区域+橄榄色区域)。

REVERSE_DIFFERENCE:与DIFFERENCE相反,以当前要剪切的区域为参照物,当前要剪切的区域除去之前剪切过的区域(橄榄色区域);

REPLACE:用当前要剪切的区域代替之前剪切过的区域。(橄榄色区域+紫色区域);

没带Op参数效果与INTERSECT的效果一样,两个区域的交集。

下面给个例子

canvas.clipRect(30, 30, 70, 70, Region.Op.XOR);最后一个参数有多个选择分别是://DIFFERENCE是第一次不同于第二次的部分显示出来

//REPLACE是显示第二次的

//REVERSE_DIFFERENCE 是第二次不同于第一次的部分显示

//INTERSECT交集显示

//UNION全部显示

//XOR补集 就是全集的减去交集生育部分显示



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 sBook extends View{

Context mContext;

Paint mPaint;

Path mPath;

public sBook(Context context) {

super(context);

init();

}

public sBook(Context context, AttributeSet attrs) {

super(context, attrs);

init();

}

public sBook(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

init();

}

private void init(){

mPaint = new Paint();

mPaint.setAntiAlias(true);

mPaint.setStrokeWidth(6);

mPaint.setTextSize(16);

mPaint.setTextAlign(Paint.Align.RIGHT);

mPath = new Path();

}

protected void onDraw(Canvas canvas){

canvas.drawColor(Color.GRAY);

canvas.save();

canvas.translate(10, 10);

drawScene(canvas);

canvas.restore();

canvas.save();

canvas.translate(160, 10);

canvas.clipRect(10, 10, 90, 90);

canvas.clipRect(30, 30, 70, 70, Region.Op.XOR);

drawScene(canvas);

canvas.restore();

canvas.save();

canvas.translate(10, 160);

mPath.reset();

// canvas.clipPath(mPath); // makes the clip empty

// mPath.addCircle(50, 50, 50, Path.Direction.CCW);

mPath.cubicTo(0, 0, 100, 0, 100, 100);

mPath.cubicTo(100, 100, 0, 100, 0, 0);

canvas.clipPath(mPath, Region.Op.REPLACE);

drawScene(canvas);

canvas.restore();

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();

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();

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();

}

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", 100, 30, mPaint);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: