【问题标题】:Showing part of the ImageView which is cover by another ImageView显示被另一个 ImageView 覆盖的部分 ImageView
【发布时间】:2017-11-13 08:24:11
【问题描述】:

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

【问题讨论】:

  • 只需更改渲染顺序。
  • 添加你到目前为止所做的代码。

标签: android transparent


【解决方案1】:

如果我正确理解您的问题,您基本上希望视图 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 但我也想展示B,A只能在C内部查看
    • 那么你应该保持A和C的高度和宽度相同
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      这会有所帮助。

      <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。

      【讨论】:

      • 但问题是视图高度和宽度为 100 dp。我想显示 B 和 A 应该在 C(View) 里面查看
      • 尝试为 ImageView 使用动态高度和宽度,它会像: ImageView imageView = view.findViewById(R.id.imageView); imageView.getLayoutParams().height = 1000; imageView.getLayoutParams().width = 100; imageView.requestLayout();
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多