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