我有一个带有KenBurnsView和一个ImageView的布局(只是一个切换按钮)。当我单击按钮时,会生成一个纹波,但它会在KenBurnsView下方绘制。

以前,当我有一个Image视图替换KenBurnsView时,波纹在顶部ImageView上方绘制。

这是我的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/background"
    android:clickable="true"
    android:orientation="vertical">


    <RelativeLayout
        android:id="@+id/header"
        android:layout_width="match_parent"
        android:layout_height="@dimen/nav_drawer_header_height">

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <com.flaviofaria.kenburnsview.KenBurnsView
                android:id="@+id/header_cover"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:src="@drawable/cover_1" />

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent">

                <ImageView
                    android:id="@+id/header_toggle"
                    android:layout_width="50dp"
                    android:layout_height="30dp"
                    android:layout_alignParentBottom="true"
                    android:layout_alignParentRight="true"
                    android:layout_marginBottom="10dp"
                    android:layout_marginRight="10dp"
                    android:padding="10dp"
                    android:src="@drawable/toggle_down" />

            </RelativeLayout>

        </FrameLayout>

    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/nav_toggle_container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"></RelativeLayout>

</LinearLayout>


这是我的涟漪可绘制XML:

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@android:color/white"
    android:drawSelectorOnTop="true"> <!-- ripple color -->

</ripple>


这就是我添加涟漪的方式:

toggle.setBackground(getResources().getDrawable(R.drawable.ripple));


这是什么问题造成的,原因是哪个波纹在KenBurnsView下方引起了波动?当用ImageView代替KenBurnsView时,它曾经可以完美地工作?

最佳答案

从您自己的代码('setBackground')中可以看到,您正在将涟漪设置为Background,这就是为什么在背景上绘制涟漪的原因。

android API 21上的ImageView为波纹android:drawSelectorOnTop="true"添加了此“ hack”。但是您使用的库没有添加相同的hack。

您的代码本身没有错。但是,Android团队无法保证第三方库的这种行为。

您可以在此处根据清洁度,工作量和性能来选择一些选项:


检查ImageView源代码,克隆该库,并添加与imageview相同的hack,以解决问题。工作正常后,请确保将请求拉回到库中。
用FrameLayout包裹KenBurnsView并在FrameLayout上使用setForeground设置波纹。
克隆库,向可绘制的前景添加选项(类似于此How to set foreground attribute to other non FrameLayout view)。还要确保将请求此有价值的代码拉回到库中。

07-27 15:45