android canvas学习

来源:互联网 发布:高斯键盘 mac 驱动 编辑:程序博客网 时间:2024/05/21 10:10

今天研究了下Canvas.clipRect()方法。研究下了Op的值代码如下:

package com.popo.android.widgets;


import android.app.Activity;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.PorterDuff.Mode;
import android.graphics.Region.Op;
import android.view.View;


public class MyCanvasClipStardy extends View implements Runnable {
/* 声明Paint对象 */
private Paint paint = null;
//定义手机屏幕的高度
static int height = 0;
//手机屏幕的宽度
static int width = 0;

//旋转画布的角度
float rotate = 0f;

//多个ClipRect的混合关系
/**

* DIFFERENCE: 旧区域-(新区域与就去区域相交部分)
* INTERSECT: 新旧区域的相交部分
* REPLACE: 新区域部分
* REVERSE_DIFFERENCE:新区域-(新区域与就去区域相交部分)
* UNION:新区域+旧区域
* XOR:  新区域+旧区域-(新区域与就去区域相交部分)
*/
//混合类型
static Op op[] = new Op[]{Op.DIFFERENCE,Op.INTERSECT,Op.REPLACE,Op.REVERSE_DIFFERENCE,Op.UNION,Op.XOR};
static String[] opStr = new String[]{"DIFFERENCE","INTERSECT","REPLACE","REVERSE_DIFFERENCE","UNION","XOR"};
int o=0;

static Mode mode[] = new Mode[]{Mode.CLEAR,Mode.DARKEN,Mode.DST,Mode.DST_ATOP,Mode.DST_IN,Mode.DST_OUT,Mode.DST_OVER,Mode.LIGHTEN,Mode.MULTIPLY,Mode.SCREEN,Mode.SRC,Mode.SRC_ATOP,Mode.SRC_IN,Mode.SRC_OUT,Mode.SRC_OVER,Mode.XOR};
static String[] modestr= new String[]{"CLEAR","DARKEN","DST","DST_ATOP","DST_IN","DST_OUT","DST_OVER","LIGHTEN","MULTIPLY","SCREEN","SRC","SRC_ATOP","SRC_IN","SRC_OUT","SRC_OVER","XOR"};
int m=0;


//为了获得屏幕的宽度和告诉高度所以 这里使用 Activity
public MyCanvasClipStardy(Activity actvity) {
super(actvity);
//构建画笔对象
paint = new Paint();
//获取屏幕高度与宽度
height = actvity.getWindowManager().getDefaultDisplay().getHeight();
width = actvity.getWindowManager().getDefaultDisplay().getWidth();
//开启控制线程
new Thread(this).start();
}


public void onDraw(Canvas canvas) {
super.onDraw(canvas);


// 设置画布的颜色
canvas.drawColor(Color.BLACK);


//取消画笔锯齿
paint.setAntiAlias(true);


// 设置画笔颜色
paint.setColor(Color.WHITE);

//每隔10像素画一条横线
for (int i = 10; i < height; i += 10) {
if (i % 100 == 0) {
paint.setColor(Color.BLUE);
}else{
paint.setColor(Color.WHITE);
}
canvas.drawLine(0, i, width, i, paint);


}


// 每隔10像素画一条横线
paint.setColor(Color.YELLOW);
for (int i = 10; i < width; i += 10) {
if (i % 100 == 0) {
paint.setColor(Color.BLUE);
}else{
paint.setColor(Color.WHITE);
}
canvas.drawLine(i, 0, i, height, paint);
}
paint.setColor(Color.RED);

//设置画笔字体大小
paint.setTextSize(20f);

//绘制Op
canvas.drawText(opStr[o], 10, 240, paint);

//绘制mode

canvas.drawText(modestr[m], 10, 276, paint);


/* 设置裁剪区域 */
canvas.clipRect(10, 10, 200, 200);
canvas.drawColor(Color.BLUE,mode[m]);
/* 线锁定画布 */
canvas.save();
/* 旋转画布 */
canvas.rotate(rotate);


/* 设置颜色及绘制矩形 */
paint.setColor(Color.RED);
canvas.drawRect(new Rect(20, 20, 140, 70), paint);


/* 解除画布的锁定 */
canvas.restore();




/* 设置颜色及绘制另一个矩形 */
paint.setColor(Color.GREEN);
canvas.drawRect(new Rect(150, 80, 260, 120), paint);

canvas.clipRect(new RectF(180, 180, 280, 300) ,op[o] );
canvas.drawColor(Color.YELLOW);

canvas.clipRect(new RectF(205, 20, 235, 175) ,Op.REVERSE_DIFFERENCE );
canvas.drawColor(Color.BLUE,mode[m]);


}






public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}

//旋转红色矩形区
rotate += 15;
o++;
if(o>=op.length)
o=0;
m++;
if(m>=mode.length){
m=0;
}
//更新画布
postInvalidate();
}
}
}

运行效果图:


原创粉丝点击