Xfermode基本使用
来源:互联网 发布:2017网络效应判断题 编辑:程序博客网 时间:2024/06/05 18:16
通过使用Xfermode完成对图片的剪切。
在使用Xfermode时,需要使用到Canvas和Paint类,其中通过使用Paint设置Xfermode的具体模式:
支持的模式如下:
在使用Xfermode时,目前已知是通过重写View或其子类,在onDraw()方法里重新画图,到达图片剪切的目的。
代码如下:
自定义的CustomView.java
package com.example.zhuyuqiang.xfermodedemo;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.util.AttributeSet;
import android.view.View;
/**
* Created by zhuyuqiang on 2016/7/30.
*/
public class CustomView extends View {
private Bitmap bitmap;
private Paint mPaint;
public CustomView(Context context,Bitmap bitmap) {
super(context);
this.bitmap = bitmap;
mPaint = new Paint();
}
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(bitmap.getWidth(),bitmap.getHeight());
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Bitmap bitmapSrc = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),bitmap.getConfig());
Canvas canvasSrc = new Canvas(bitmapSrc);
canvasSrc.drawCircle(70,50,50,mPaint);
int tag = canvas.saveLayer(0,0,bitmap.getWidth(),bitmap.getHeight(),null,Canvas.ALL_SAVE_FLAG);//保存当前画布
canvas.drawBitmap(bitmap,0,0,mPaint);//绘制图画
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
canvas.drawBitmap(bitmapSrc,0,0,mPaint);//绘制遮挡层
mPaint.setXfermode(null);
canvas.restoreToCount(tag);//恢复画布
}
}
MainActivity.java
package com.example.zhuyuqiang.xfermodedemo;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.RelativeLayout;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout views = (RelativeLayout) findViewById(R.id.contentView);
CustomView view = new CustomView(MainActivity.this, BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
views.addView(view);
}
}
其中个人对代码的分析:
Bitmap bitmapSrc = Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),bitmap.getConfig());
Canvas canvasSrc = new Canvas(bitmapSrc);
canvasSrc.drawCircle(70,50,50,mPaint);
这三行代码同于创建一个bitmap,刚开始时,bitmap里没有数据,通过根据bitmap生成一个Canvas,并在Canvas中draw,相当于给bitmap里写入数据。
int tag = canvas.saveLayer(0,0,bitmap.getWidth(),bitmap.getHeight(),null,Canvas.ALL_SAVE_FLAG);//保存当前画布
canvas.drawBitmap(bitmap,0,0,mPaint);//绘制图画
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
canvas.drawBitmap(bitmapSrc,0,0,mPaint);//绘制遮挡层
mPaint.setXfermode(null);
canvas.restoreToCount(tag);//恢复画布
第一行代码用于保存指定的画布,并设定保存画布的大小。
使用Xfermode时,需要两个图层,首先draw的bitmap是src图层,然后通过设置Paint的Xfermode模式,再接着draw第二图层,然后恢复保存的图层。
在恢复图层之前需要取消之前设置的Xfermode模式,否则对图片的设置不生效。
0 0
- Xfermode基本使用
- Paint:xfermode的使用
- Xfermode
- Xfermode
- Xfermode
- xFermode的原理及使用
- 使用Xfermode修改图片显示样式
- android 画图之setXfermode、Xfermode使用
- Paint的Xfermode的使用和经验总结
- 自定义View—使用Xfermode实现圆角图片
- 使用Xfermode绘制一个颜色渐变的圆形进度条
- 使用Xfermode实现图片各种形状的抠图
- graphic Xfermode
- Xfermode入门
- Xfermode 介绍
- android Xfermode
- android xfermode
- Android Xfermode
- web开发中遇到的导致网页开头空白
- UVA11136 Hoax or what STL 或者 HEAP
- 强势回归!poj 1950
- win10系统登陆提示“你的设备处于脱机状态..“解决方案
- 退役
- Xfermode基本使用
- QLibrary 动态加载外部库文件
- java身份证识别
- Android基础类之BaseAdapter
- android 出现 cannot resolve symbol r
- swift实现微信通讯录列表TableView的创建
- HDU 3530 Subsequence
- Qt 跨UI线程的数据交换和信号-槽调用实现方案汇总
- 【iOS-报错】:“App Transport Security has blocked a cleartext HTTP”