PorterDuff.Mode简介

1.下面的Xfermode子类可以改变这种行为:

AvoidXfermode  指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。

PixelXorXfermode  当覆盖已有的颜色时,应用一个简单的像素XOR操作。

PorterDuffXfermode  这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互。

要应用转换模式,可以使用setXferMode方法,如下所示:

AvoidXfermode avoid = new AvoidXfermode(Color.BLUE, 10, AvoidXfermode.Mode. AVOID);    borderPen.setXfermode(avoid);


2.Porter-Duff 效果图:



3.16条Porter-Duff规则

1.PorterDuff.Mode.CLEAR

   所绘制不会提交到画布上。
2.PorterDuff.Mode.SRC

   显示上层绘制图片
3.PorterDuff.Mode.DST

  显示下层绘制图片
4.PorterDuff.Mode.SRC_OVER

  正常绘制显示,上下层绘制叠盖。
5.PorterDuff.Mode.DST_OVER

  上下层都显示。下层居上显示。
6.PorterDuff.Mode.SRC_IN

   取两层绘制交集。显示上层。
7.PorterDuff.Mode.DST_IN

  取两层绘制交集。显示下层。
8.PorterDuff.Mode.SRC_OUT

 取上层绘制非交集部分。
9.PorterDuff.Mode.DST_OUT

 取下层绘制非交集部分。
10.PorterDuff.Mode.SRC_ATOP

 取下层非交集部分与上层交集部分
11.PorterDuff.Mode.DST_ATOP

  取上层非交集部分与下层交集部分
12.PorterDuff.Mode.XOR

  
13.PorterDuff.Mode.DARKEN


14.PorterDuff.Mode.LIGHTEN


15.PorterDuff.Mode.MULTIPLY


16.PorterDuff.Mode.SCREEN


在 Android 中,`PorterDuff.Mode` 是一个枚举类,它定义了两个图形重叠时的混合模式。在 Snackbar 颜色设置中,可以利用 `PorterDuff.Mode` 来控制颜色的混合效果,从而实现不同的视觉表现。 在之前关于 Snackbar 颜色设置的回答中,有使用 `PorterDuff.Mode` 的示例代码: ```java import android.graphics.Color; import android.graphics.PorterDuff; import android.os.Bundle; import android.view.View; import androidx.appcompat.app.AppCompatActivity; import com.google.android.material.snackbar.Snackbar; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); View rootView = findViewById(android.R.id.content); Snackbar snackbar = Snackbar.make(rootView, "这是一个 Snackbar", Snackbar.LENGTH_LONG); // 设置背景为透明 snackbar.getView().setBackgroundColor(Color.TRANSPARENT); // 设置 tintColor 为红色 snackbar.getView().getBackground().setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN); snackbar.show(); } } ``` 在上述代码中,`PorterDuff.Mode.SRC_IN` 是一种混合模式,它表示只显示源图像(这里是红色)与目标图像(Snackbar 的背景)重叠的部分。也就是说,只有当 Snackbar 背景有内容的地方才会显示红色,其他地方保持透明。 不同的 `PorterDuff.Mode` 会产生不同的混合效果,以下是一些常见的 `PorterDuff.Mode` 及其在 Snackbar 颜色设置中的可能应用: - **PorterDuff.Mode.SRC_OVER**:源图像覆盖在目标图像之上,这是默认的模式。如果要让设置的颜色完全覆盖 Snackbar 的背景,可以使用这种模式。 ```java snackbar.getView().getBackground().setColorFilter(Color.RED, PorterDuff.Mode.SRC_OVER); ``` - **PorterDuff.Mode.DST_IN**:只显示目标图像与源图像重叠的部分,并且保留目标图像的透明度。如果想根据 Snackbar 背景的形状来显示颜色,可以使用这种模式。 ```java snackbar.getView().getBackground().setColorFilter(Color.RED, PorterDuff.Mode.DST_IN); ``` - **PorterDuff.Mode.XOR**:源图像和目标图像重叠的部分不显示,其他部分正常显示。可以用于创建一些特殊的视觉效果。 ```java snackbar.getView().getBackground().setColorFilter(Color.RED, PorterDuff.Mode.XOR); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值