上代码:
package com.exmp.test;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Typeface;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
public class CanvasActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RelativeLayout rl=new RelativeLayout(this);
RelativeLayout.LayoutParams clp=new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
MainView mainView = new MainView(this);
mainView.setLayoutParams(clp);
rl.addView(mainView);
rl.setBackgroundColor(Color.GREEN);
setContentView(rl);
}
class MainView extends View {
public MainView(Context context) {
super(context);
}
Paint paint=new Paint();
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//设置背景色
canvas.drawColor(Color.GRAY);
//红色的方形
paint.setColor(Color.RED);
canvas. drawRect(0, 0, 500,500, paint);
//绿色的圆
paint.setColor(Color.GREEN);
canvas.drawCircle(150, 150, 100, paint);
//蓝色的方形
paint.setColor(Color.BLUE);
canvas.drawRect(150, 150, 300, 300, paint);
//文字描述
paint.setColor(Color.WHITE);
paint.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));
canvas.drawText("设置 PorterDuff.Mode.CLEAR 之前", 0, 500+paint.getTextSize(), paint);
//PorterDuff.Mode.CLEAR 效果----------start-------------------
//红色的方形
paint.setColor(Color.RED);
canvas. drawRect(0, 700, 500,1200, paint);
//这里开始保存渲染层,从 canvas.saveLayer()方法 到 canvas.restoreToCount()方法结束,期间不会影响其他绘制
int layerId = canvas.saveLayer(0, 0, getWidth(), getHeight(), null, Canvas.ALL_SAVE_FLAG);
//绿色的圆
paint.setColor(Color.GREEN);
canvas.drawCircle(150, 850, 100, paint);
//PorterDuff.Mode.CLEAR 清除 蓝色的方形 所覆盖的面积
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
//蓝色的方形
paint.setColor(Color.BLUE);
canvas.drawRect(150, 850, 300, 1000, paint);
//移除 Xfermode
paint.setXfermode(null);
//恢复画布状态
canvas.restoreToCount(layerId);
//PorterDuff.Mode.CLEAR 效果----------end-------------------
//文字描述
paint.setColor(Color.WHITE);
paint.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 16, getResources().getDisplayMetrics()));
canvas.drawText("设置 PorterDuff.Mode.CLEAR 之后", 0, 1200+paint.getTextSize(), paint);
}
}
}