在图像视图上设置波纹效果

2022-09-02 02:54:20

获得以下图像视图:

<ImageView
    android:id="@+id/header"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:scaleType="centerCrop"
    app:layout_collapseMode="parallax" 
    android:clickable="true"
    android:focusable="true"
    android:background="?android:attr/selectableItemBackground"/>

如果我没有为图像视图设置位图,则波纹效果很好。但是一旦我设置了这样的位图,涟漪效应就消失了:

ImageView iv=((ImageView)rootView.findViewById(R.id.header));
iv.setImageBitmap(myBitmap);

这是我的涟漪.xml:

<ripple xmlns:android="http://schemas.android.com/apk/res/android" 
                  android:color="?android:colorControlHighlight">
    <item android:id="@android:id/mask">
        <shape android:shape="oval">
            <solid android:color="?android:colorAccent" />
        </shape>
    </item>
</ripple>

我猜位图隐藏了涟漪效应,我怎样才能让它可见?已尝试:

  1. 将 android:background 更改为 android:foreground,这不起作用。
  2. 在此之上配置另一个透明图像视图,但由于它是透明的波纹,因此未显示。

有什么想法吗?我也看到Lollipop Contacts也做了这个。


答案 1

我有一个图像库(用a和a构建)。该图像是使用毕加索设置的。为了向图像添加涟漪,我用 FrameLayout 包装了 ImageView。项目布局为:RecyclerViewGridLayoutManager

<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="120dp"
    android:foreground="@drawable/ripple"
    android:clickable="true"
    android:focusable="true"
    >
    <ImageView
        android:id="@+id/grid_item_imageView"
        android:layout_width="match_parent"
        android:layout_height="120dp"
        android:layout_gravity="center"
        android:scaleType="centerInside"
        />
</FrameLayout>

请注意 android:前景。它与 不同。我尝试过没有,它也可以工作,但它没有伤害。android:backgroundandroid:clickable="true"android:focusable="true"

然后将可绘制对象添加到 :ripple.xmlres/drawable

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape android:shape="rectangle">
            <solid android:color="#7FF5AC8E" />
        </shape>
    </item>
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@android:color/transparent" />
        </shape>
    </item>
</selector>

请注意,选择项目时,这会在图像顶部显示半透明颜色(适用于版本早于 Android 5.0 的设备)。如果您不想要它,可以将其删除。

然后将带有波纹的可绘制对象添加到:ripple.xmlres/drawable-v21

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="@color/coral">
</ripple>

您可以使用默认的涟漪效果而不是自定义 ,但是在图像的顶部很难看到它,因为它是灰色的:ripple.xml

android:foreground="?android:attr/selectableItemBackground"

答案 2

对于像我这样懒惰的人:

android:foreground="?android:attr/selectableItemBackground"

并根据您的风格自定义波纹颜色。

在值/样式中.xml

<style name="colorControlHighlight_blue">
   <item name="colorControlHighlight">@color/main_blue_alpha26</item>
</style>

然后,在 onCreateView() 中的通货膨胀之前的片段中:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
   getContext().getTheme().applyStyle(R.style.colorControlHighlight_blue, true); //blue ripple color
   View view = inflater.inflate(R.layout.my_fragment_layout, container, false);
   return view;
}

推荐