74 lines
2.0 KiB
Java
74 lines
2.0 KiB
Java
package com.mango.moshen.treasurefairy;
|
|
|
|
import android.graphics.Canvas;
|
|
import android.graphics.ColorFilter;
|
|
import android.graphics.Paint;
|
|
import android.graphics.Path;
|
|
import android.graphics.PorterDuff;
|
|
import android.graphics.PorterDuffXfermode;
|
|
import android.graphics.drawable.Drawable;
|
|
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
|
|
class CustomDrawable extends Drawable {
|
|
private final Paint srcPaint;
|
|
private final Drawable innerDrawable;
|
|
/**
|
|
* 使用时需要自定义path
|
|
*/
|
|
private Path srcPath = new Path();
|
|
private final PorterDuffXfermode xFermode =new PorterDuffXfermode(PorterDuff.Mode.CLEAR);
|
|
|
|
public CustomDrawable(Drawable innerDrawable) {
|
|
this.innerDrawable = innerDrawable;
|
|
// path默认实现
|
|
srcPath.addRect(100, 100, 200, 200, Path.Direction.CW);
|
|
srcPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
|
srcPaint.setColor(0xffffffff);
|
|
}
|
|
|
|
/**
|
|
* 设置内部透明的部分
|
|
*/
|
|
public void setSrcPath(Path srcPath) {
|
|
this.srcPath = srcPath;
|
|
}
|
|
|
|
@Override
|
|
public void draw(@NonNull Canvas canvas) {
|
|
innerDrawable.setBounds(getBounds());
|
|
if (srcPath == null || srcPath.isEmpty()) {
|
|
innerDrawable.draw(canvas);
|
|
} else {
|
|
// 将绘制操作保存到新的图层
|
|
int saveCount = canvas.saveLayer(0, 0, getBounds().width(), getBounds().height(), srcPaint,
|
|
Canvas.ALL_SAVE_FLAG);
|
|
// 绘制目标图
|
|
innerDrawable.draw(canvas);
|
|
// 设置混合模式
|
|
srcPaint.setXfermode(xFermode);
|
|
// src 绘制源图
|
|
canvas.drawPath(srcPath, srcPaint);
|
|
// 清除混合模式
|
|
srcPaint.setXfermode(null);
|
|
// 还原画布
|
|
canvas.restoreToCount(saveCount);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void setAlpha(int alpha) {
|
|
innerDrawable.setAlpha(alpha);
|
|
}
|
|
|
|
@Override
|
|
public void setColorFilter(@Nullable ColorFilter colorFilter) {
|
|
innerDrawable.setColorFilter(colorFilter);
|
|
}
|
|
|
|
@Override
|
|
public int getOpacity() {
|
|
return innerDrawable.getOpacity();
|
|
}
|
|
} |