gpt4 book ai didi

android - 将 mask 应用于单个叠加 View 而不 mask 整个 Activity

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:05:11 27 4
gpt4 key购买 nike

我有一个带有绿色背景的简单 Activity ,我正在尝试提供一个带有透明圆形区域的红色叠加层。这是我要实现的效果:

Expected Image

根据我在网上找到的代码,我看到的是这样的:

Result of code

似乎正在发生的事情是 PorterDuff 将自身应用于 Activity 中的所有 View ,而不是我明确告诉它的 View 。 Stack 上的许多帖子都是关于用另一个位图遮盖一个位图,我试图用编程创建的圆形来遮盖 View 的一部分。这是我尝试使用的代码:

public class ClippingTestActivity extends Activity {
private Paint mPaint;
ClippingView ddd;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.test);
View v = new View(this.getBaseContext());
v.setBackgroundColor(Color.GREEN);
this.addContentView(v, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT));

ClippingView r = new ClippingView(this.getBaseContext());
r.setBackgroundColor(Color.RED);
this.addContentView(r, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT));
}

}

public class ClippingView extends View {
Paint paint = new Paint();
Path path = new Path();
public ClippingView(Context context) {
super(context);
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw( canvas );

paint.setColor(Color.TRANSPARENT);
paint.setStyle(Style.FILL);

paint.setXfermode( new PorterDuffXfermode( Mode.CLEAR ) );
int cx = 200;
int cy = 200;
int radius = 50;
canvas.drawCircle( cx, cy, radius, paint );
}
}

布局xml文件是这样的

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.appspot.scruffapp"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_centerHorizontal="true"
android:background="#ff0000">
</RelativeLayout>

有谁知道这个效果是怎么实现的?

最佳答案

好的。在 friend 的帮助下,我弄明白了。结果我需要创建一个新的空 Canvas 并将它从一个函数传递到另一个函数并在稍后添加的新 View 上绘制 Canvas 。这是对我有用的代码:

Bitmap circle = DrawView.makeCircle(drawable);
Bitmap overlayBg = DrawView.makeOverlayBg(canvas.getWidth(),canvas.getHeight());

Bitmap finalImage = Bitmap.createBitmap(canvas.getWidth(),canvas.getHeight(), Bitmap.Config.ARGB_8888);

final android.graphics.Canvas tmpCanvas = new android.graphics.Canvas(finalImage);
tmpCanvas.drawBitmap(overlayBg, 0, 0, null);

final android.graphics.Paint paint = new android.graphics.Paint();
paint.setXfermode(new android.graphics.PorterDuffXfermode(Mode.DST_OUT));
tmpCanvas.drawBitmap(circle, cx - radius, cy - radius, paint);

canvas.drawBitmap(finalImage, 0, 0, null);

关于android - 将 mask 应用于单个叠加 View 而不 mask 整个 Activity ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13318255/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com