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;
	}

}

结果图:


Canvas和Path有关的方法总结

Canvas和Path有关的方法总结
  • Wshiduo
  • Wshiduo
  • 2017年01月07日 20:49
  • 974

Android中将方形图片截取成圆形的两种实现方式

以下两种方法均有不足,仅供参考第一种实现方式是通过设置画笔的渲染方式对图片进行处理:首先要了解几种渲染方式 1.BitmapShader(图像渲染)   BitmapShader的作用是使用一...
  • HelloMoney_
  • HelloMoney_
  • 2016年01月28日 23:01
  • 4420

如何求两个文件的交集、并集和差集?------sort和uniq闪亮登场

在日常开发中, 经常要对一些数据进行处理。 写个程序吧, 也可以实现, 但蛮麻烦的, 有些时候根本没有必要。 现在, a.txt和b.txt两个文件的数据都是逐行呈现的, 我们来说说如何求他们的交集、...
  • stpeace
  • stpeace
  • 2015年12月26日 13:35
  • 2644

两个集合List的交集

两个List的交集
  • yuxiangaaaaa
  • yuxiangaaaaa
  • 2016年10月25日 10:55
  • 1757

js取数组两个数组的交集|差集|并集|补集|去重

/** * each是一个集合迭代函数,它接受一个函数作为参数和一组可选的参数 * 这个迭代函数依次将集合的每一个元素和可选参数用函数进行计算,并将计算得的结果集返回 {%example ...
  • a597926661
  • a597926661
  • 2013年03月08日 13:02
  • 31611

最快速度求两个数组之交集算法与hash

该题目来自58同城的二面,用最快速度求两个数组之交集算法。 比如A={6,2,4,1},B={2,9,4,3},那么A&B={2,4}。 算法一:在大多数情况,也就是一般的情况下,大家都能想...
  • Richard_More
  • Richard_More
  • 2016年04月04日 21:22
  • 7045

pandas进行数据的交集与并集方式的数据合并

数据合并有多种方式,其中最常见的应该就是交集和并集的求取。之前通过分析总结过pandas数据merge功能默认的行为,其实默认下求取的就是两个数据的“交集”。 有如下数据定义: In [26]: ...
  • grey_csdn
  • grey_csdn
  • 2017年04月16日 11:01
  • 2844

求两个数组的交集和并集

晚上闲来无事,想起前两天查资料时候,看到别人一篇博客标题关于数组的交集和并集,晚上也随便写写,权当督促自己坚持经常练习练习写写小Demo。如下,先来一段求有序数组的交集的代码,代码如下:...
  • Johnnyz1234
  • Johnnyz1234
  • 2014年12月23日 19:08
  • 2427

STL算法-交集,并集,差集,对称差

学数学时我们知道人集合的概念,所谓集合就是符合某个条件的一堆元素.针对它们做的最多的操作就是求交集,并集,差集,对称差集.不过集合有个特性就是不能有重复的元素. 而STL中的算法中的交并集,所用到的容...
  • weiwenhp
  • weiwenhp
  • 2013年03月19日 14:43
  • 10647

Java中使用Set进行并集,差集,交集查找

利用Java中使用Set进行并集,差集,交集查找首先命名一个类名为DealSet存放查找并集,差集,交集的方法 DealSet.java package SetLearning;import ja...
  • zerolocust
  • zerolocust
  • 2015年05月23日 16:20
  • 3269
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:canvas绘制bitmap1--两个bitmap交集裁剪等效果
举报原因:
原因补充:

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