显示被另一个 ImageView 覆盖的 ImageView 的一部分

Showing part of the ImageView which is cover by another ImageView

我有一个 Framelayout,其中第一个元素是一个 ImageView,其高度和宽度与父级匹配,id 为 A。第二个元素也是一个 ImageView,其高度和宽度也与父级匹配,id 为 B .第三个元素是一个View,高和宽都是100dp,可以移动到整个屏幕,id是C。我在背景C中使用透明色,所以在C里面我们应该看到B,因为B在A上面. 但是我想在 C 里面显示 A ,我该怎么做呢?

如果您不想显示 B,您可以将 B 的可见性设置为不可见或消失。或者您可以将 A 替换为 B。由于框架布局像堆栈一样工作,所以您首先放置的东西会放在底部。所以你输入这种格式 B->A->->C

使用相对布局来包装您的框架布局,然后您可以使用上面的布局,然后使用视图的可见性

这会有所帮助。

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

<ImageView
    android:id="@+id/a"
    android:src="@drawable/ic_networking"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<ImageView
    android:id="@+id/b"
    android:visibility="gone"
    android:src="@drawable/dailymetricsin"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<View
    android:background="#90606060"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

您可以根据 A(或)B 中应显示哪个 ImageView 来隐藏和显示 ImageView。

如果我对你的问题的理解正确,你基本上是想让视图 C 和视图 B 的交叉点透明,以便看到它们后面的视图 A。

在这种情况下,获得视图 C:

的可见矩形可能就足够了
Rect rect = new Rect();
viewC.getGlobalVisibleRect(rect);

然后你可以在视图B上绘制这个矩形作为透明蒙版,这样你就可以看到视图B后面的视图A。你可以通过重写视图B的onDraw方法来实现。

Paint paint = new Paint();
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas)
    canvas.drawRect(rect, paint);
}

这将实现类似的效果:

您也不要忘记为正在绘制的视图(在本例中为视图 B)禁用硬件加速,并告诉视图您将手动绘制到它:

setWillNotDraw(false);
setLayerType(LAYER_TYPE_HARDWARE, null)

可在此处找到更多说明和示例: Android canvas: draw transparent circle on image