显示被另一个 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
我有一个 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