Android PorterDuff.Mode.CLEAR 效果 简单实现

上代码:

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);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值