Android Api Demos登顶之路(九十四)Graphics-->Xfermodes
2015-10-11 11:35
411 查看
/* * 这个demon演示了图像的整合模式 */ public class MainActivity extends Activity { private Bitmap makeDest(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; } private Bitmap makeSrc(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(0xff66aaff); c.drawRect(w / 3, h / 3, w * 19 / 20, h * 19 / 20, p); return bm; } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(new SampleView(this)); } private class SampleView extends View { private static final int W = 64; private static final int H = 64; private static final int ROW_MAX = 4; private Bitmap mSrcB; private Bitmap mDstB; private Shader mBG; private 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 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 = makeDest(W, H); // 创建一个位图图案,用于作为背景,宽和高为2个像素第1个颜色值表示第一行第一个像素点,第二个颜色值表示第一行第二个像素点 // 第三个颜色值表示第二行第一个像素点,第四个颜色值表示第二行第二个像素点 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(); // 将图案放大6倍 m.setScale(6, 6); mBG.setLocalMatrix(m); } @Override protected void onDraw(Canvas canvas) { canvas.drawColor(Color.WHITE); Paint paint = new Paint(); // 关闭图像过滤,如果打开会使背景变得模糊,因为我们需要得到清晰、边缘分明的背景,所以不需要滤波 paint.setFilterBitmap(false); // paint.setAntiAlias(true); canvas.translate(15, 35); Paint labelP=new Paint(Paint.ANTI_ALIAS_FLAG); labelP.setTextAlign(Paint.Align.CENTER); int x = 0; int y = 0; //canvas.drawBitmap(mSrcB, 0, 0, paint); 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); 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; if((i%ROW_MAX)==ROW_MAX-1){ x=0; y+=H+30; } } } } }
相关文章推荐
- Android 5.0动画(一)
- android--(BroadcastReceiver)
- Android中NavigationDrawer的分析
- Android Fragment的生命周期和返回栈(转)
- Android ViewPager多页面滑动切换以及动画效果
- Android应用程序注册广播接收器(registerReceiver)的过程分析
- Android Tab切换表格头
- Android 各类功能效果源代码集合
- 启动avd manager的时候,提示“系统找不到指定文件”的一种解决办法
- Android listview与adapter用法
- android 如何点击通知栏中的前台服务,返回当前正在进行的活动
- Android lint具 常见问题检查
- Android 双击返回键退出功能的实现
- android从网上下载图片
- android获取当前日期及具体值
- android数据库 批量 事务 操作
- Android中shape的使用
- Android 通过solid来定义不同边框的颜色,可以只定义一个边框的颜色
- android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事项
- Android Api Demos登顶之路(九十三)Graphics-->Vertices