gpt4 book ai didi

android - 如何使android中 View 周围的区域变暗?

转载 作者:太空宇宙 更新时间:2023-11-03 13:14:53 25 4
gpt4 key购买 nike

我正在尝试进行一项需要将​​方形区域显示为重点的 Activity 。到目前为止,我已经这样做了。

enter image description here

现在我想要的是将正方形外的区域调暗。使用 framelayout 会使整个 View 变暗。我只想调暗广场外的区域。

最佳答案

您可以绘制一个黑色半透明矩形,然后使用 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));

绘制一个内部矩形

由于我对您的布局一无所知,我给出了一个包含 CustomOverlay 类的完整示例:

my_activity.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment" />

<mypackage.CustomOverlay
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerInParent="true" />

</RelativeLayout>

(我使用 map 作为基础 View 而不是相机)

CustomOverlay.java

public class CustomOverlay extends LinearLayout {
private Bitmap windowFrame;

public CustomOverlay(Context context) {
super(context);
}

public CustomOverlay(Context context, AttributeSet attrs) {
super(context, attrs);
}

public CustomOverlay(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public CustomOverlay(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}

@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);

if (windowFrame == null) {
createWindowFrame();
}
canvas.drawBitmap(windowFrame, 0, 0, null);
}

@Override
public boolean isEnabled() {
return false;
}

@Override
public boolean isClickable() {
return false;
}

protected void createWindowFrame() {
windowFrame = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
Canvas osCanvas = new Canvas(windowFrame);

RectF outerRectangle = new RectF(0, 0, getWidth(), getHeight());

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.argb(150, 0, 0, 0));
osCanvas.drawRect(outerRectangle, paint);

paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));
RectF innerRectangle = new RectF(100, 200, getWidth() - 100, getHeight() - 200);
osCanvas.drawRect(innerRectangle, paint);

paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStrokeWidth(5);
paint.setColor(Color.WHITE);
paint.setStyle(Paint.Style.STROKE);
osCanvas.drawRect(innerRectangle, paint);
}

@Override
public boolean isInEditMode() {
return true;
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
windowFrame = null;
}
}

结果是这样的:

enter image description here

关于android - 如何使android中 View 周围的区域变暗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37900423/

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