canvas绘制bitmap1--两个bitmap交集裁剪等效果

转载 2015年11月18日 17:47:31


package com.example.xfermodesdemo;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.Xfermode;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;

public class MainActivity extends ActionBarActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(new SampleView(this));
	}

	private static class SampleView extends View {
		private static final int W = 64;// 宽64
		private static final int H = 64;// 高64
		private static final int ROW_MAX = 4;// 每行4个

		private Bitmap mSrcB;
		private Bitmap mDstB;
		private Shader mBG; // 背景 是跳棋盘 样式 checker-board pattern

		private static final Xfermode[] sModes = {
				new PorterDuffXfermode(PorterDuff.Mode.CLEAR),
				new PorterDuffXfermode(PorterDuff.Mode.SRC),
				new PorterDuffXfermode(PorterDuff.Mode.DST),
				new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER),
				new PorterDuffXfermode(PorterDuff.Mode.DST_OVER),
				new PorterDuffXfermode(PorterDuff.Mode.SRC_IN),
				new PorterDuffXfermode(PorterDuff.Mode.DST_IN),
				new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT),
				new PorterDuffXfermode(PorterDuff.Mode.DST_OUT),
				new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP),
				new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP),
				new PorterDuffXfermode(PorterDuff.Mode.XOR),
				new PorterDuffXfermode(PorterDuff.Mode.DARKEN),
				new PorterDuffXfermode(PorterDuff.Mode.LIGHTEN),
				new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY),
				new PorterDuffXfermode(PorterDuff.Mode.SCREEN) };
		private static final String[] sLabels = { "Clear", "Src", "Dst",
				"SrcOver", "DstOver", "SrcIn", "DstIn", "SrcOut", "DstOut",
				"SrcATop", "DstATop", "Xor", "Darken", "Lighten", "Multiply",
				"Screen" };

		public SampleView(Context context) {
			super(context);

			mSrcB = makeSrc(W, H);
			mDstB = makeDst(W, H);

			// 棋盘样式背景
			Bitmap bm = Bitmap.createBitmap(new int[] { 0xFFFFFFFF, 0xFFCCCCCC,
					0xFFCCCCCC, 0xFFFFFFFF }, 2, 2, Bitmap.Config.RGB_565);

			mBG = new BitmapShader(bm, Shader.TileMode.REPEAT,
					Shader.TileMode.REPEAT);

			Matrix m = new Matrix();
			m.setScale(6, 6);// 缩放
			mBG.setLocalMatrix(m);

		}

		@SuppressLint("DrawAllocation")
		@Override
		protected void onDraw(Canvas canvas) {
			canvas.drawColor(Color.WHITE);

			Paint labelP = new Paint(Paint.ANTI_ALIAS_FLAG);
			labelP.setTextAlign(Paint.Align.CENTER);

			Paint paint = new Paint();
			paint.setFilterBitmap(false);

			canvas.translate(15, 35);
			int x = 0;
			int y = 0;
			for (int i = 0; i < sModes.length; i++) {
				// 绘制边界
				paint.setStyle(Paint.Style.STROKE);// 仅描边
				paint.setShader(null);
				canvas.drawRect(x - 0.5f, y - 0.5f, x + W + 0.5f, y + H + 0.5f,
						paint);

				// 绘制棋盘样式
				paint.setStyle(Paint.Style.FILL);// 完全填充
				paint.setShader(mBG);
				canvas.drawRect(x, y, x + W, y + H, paint);

				// 绘制src/des 到屏幕中
				int sc = canvas.saveLayer(x, y, x + W, y + H, null,
						Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG
								| Canvas.HAS_ALPHA_LAYER_SAVE_FLAG
								| Canvas.FULL_COLOR_LAYER_SAVE_FLAG
								| Canvas.CLIP_TO_LAYER_SAVE_FLAG);
				canvas.translate(x, y);
				canvas.drawBitmap(mDstB, 0, 0, paint);
				paint.setXfermode(sModes[i]);
				canvas.drawBitmap(mSrcB, 0, 0, paint);
				paint.setXfermode(null);
				canvas.restoreToCount(sc);

				// 绘制文字
				canvas.drawText(sLabels[i], x + W / 2, y - labelP.getTextSize()
						/ 2, labelP);

				x += W + 10;

				// wrap around when we've drawn enough for one row
				if ((i % ROW_MAX) == ROW_MAX - 1) {
					x = 0;
					y += H + 30;
				}
			}
		}
	}

	/** 创建一个bitmap */
	static Bitmap makeDst(int w, int h) {
		Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
		Canvas c = new Canvas(bm);
		Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);// 抗锯齿
		p.setColor(0xFFFFCC44);
		c.drawOval(new RectF(0, 0, w * 3 / 4, h * 3 / 4), p);// 绘制椭圆
		return bm;
	}

	/** 创建一个矩形的bitmap */
	static Bitmap makeSrc(int w, int h) {
		Bitmap bm = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
		Canvas c = new Canvas(bm);// bitmap中的画布
		Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);

		p.setColor(0xFF66AAFF);
		c.drawRect(w / 3, h / 3, w * 19 / 20, h * 19 / 20, p);// 画矩形
		return bm;
	}

}

结果图:


相关文章推荐

Android Canvas 画各种图形和Bitmap详解

From:http://www.2cto.com/kf/201607/531105.html Android中,如果我们想绘制复杂的自定义View或游戏,我们就需要熟悉绘图API。A...

android 画图之setXfermode 处理两图相交叉的情况

转自: http://trylovecatch.iteye.com/blog/1189452 setXfermode 设置两张图片相交时的模式 我们知道 在正常的情况下,在已有的图像上绘...

Bitmap File path 转换 保存

public void saveBitmapFile(Bitmap bitmap){ File file=new File(ContactService.getImageURI...

自定义View之绘图篇(六):Canvas那些你应该知道的变换

来我的怀里 或者 让我住进你的心里 一仓央嘉措 一、什么是Canvas?什么是Canvas?官方文档是这么...

Android Canvas 画各种图形和Bitmap详解

Android中,如果我们想绘制复杂的自定义View或游戏,我们就需要熟悉绘图API。Android通过Canvas类暴露了很多drawXXX方法,我们可以通过这些方法绘制各种各样的图形。Canvas...

android两图相交

两图相交指的是两张图重叠在一起取交集还是并集……案例 : 把图片设置成圆形头像(可以先看看下面的图) public static Bitmap circleBitmap(Bitmap source)...

android获取电池电量(无延迟)

传统的注册BroadcatsReceiver监听Battery_changed有个缺陷,就是只有等到初始化和电量改变时,才能够收到通知,一下方法可以快速获得电量,直接拷贝的。 之前写过一个桌面电池...

Android实时获取电量

转载自:http://blog.csdn.net/chrp99/article/details/9137349 public class MainActivity extends Activit...

Android 用Canvas画textview、bitmap、矩形(裁剪)、椭圆、线、点、弧

初始化对象private Paint mPaint;//画笔 private int count;//点击次数 private Rect rect;//矩形 public CounstomVie...

C#Bitmap裁剪图片后显示在pictureBox内,形成图片移动效果

用户界面大作业,选择时区时将地图上该时区显示在图片中间。 就是这样,地图是720*180的,含有两个世界地图,足够剪裁出时区在中间的360*180图,所以pictureBox是360*180...
  • MOLLMY
  • MOLLMY
  • 2015年01月06日 12:38
  • 1960
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:canvas绘制bitmap1--两个bitmap交集裁剪等效果
举报原因:
原因补充:

(最多只允许输入30个字)