长按时执行涟漪效果

5
我目前正在实现一个应用程序,其中有一个RecyclerView,其中包含几个自定义视图。用户可以从这些视图中的每一个打开一个上下文菜单(需要长按),但通常很难弄清楚,因为他们通常只会执行简单的点击,然后就认为没有更多的了。但是,如果我能给一些UI反馈,它可能会更清晰。想法是一个简单的涟漪动画,突出显示背景,并且不会在简单的单击时完成,而会在长时间单击操作时全部完成。
由于我已经卡在这里两天了,我进行了研究,实际上发现了一些SO问题,例如Cheok Yan Cheng的这个非常好写,他甚至发布了一个视频展示所需效果(我的问题基本上是完全相同的),但是没有好的答案,因为第一个答案说我们应该使用?attr/selectableItemBackground,但给出的效果与我想要的不同,我尝试了第二种方法,在onLongClick中启动动画,对于简单的点击它并没有什么作用。
编辑:
请注意,无法通过 ?attr/selectableItemBackground或创建涟漪xml文件并将其设置为背景来实现预期行为,因为这些将提供正常的onClick动画和不同的longClick动画。再次查看此视频以查看所需效果。

你想在RecyclerView项目上长按执行涟漪效果吗? - Ümañg ßürmån
@UmangBurman 没错,但你应该查看我提供的 Stack Overflow 问题以获取实际的动画,其中包含一个 YouTube 链接。 - tom gautot
@UmangBurman 我使用LinearLayout,但我可以立即更改为constraint。 - tom gautot
在我的项目中,如果您单击,则会产生涟漪效果,但如果您长时间点击,则不会产生涟漪效果,而是会动画化并保持涟漪颜色,然后当您释放时,它才会产生涟漪效果。这对您来说可以吗? - Ümañg ßürmån
@UmangBurman 不完全是,那实际上是 ?android:attr/selectableItemBackground 的基本行为,或者简单地创建一个ripple.xml文件并给它一个自定义颜色。 - tom gautot
显示剩余8条评论
3个回答

1

我会尽力帮助你翻译以下内容,与编程有关:

尝试按照以下步骤进行操作,这可能会有所帮助:

步骤1:

在drawable中创建ripple.xml:(适用于Android版本大于等于v21)

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?android:colorControlHighlight">
    <item android:id="@android:id/mask">
        <color android:color="@android:color/transparent" /> 
    </item>
</ripple>

在这行代码中,<color android:color="@android:color/transparent" /> 会使你的按钮透明。
步骤2:
在你的item.xml文件中,我使用了ConstraintLayout布局:
<Button
     android:id="@+id/btnItemClickOnRecyclerView"
     android:layout_width="0dp"
     android:layout_height="0dp"
     android:layout_centerInParent="true"
     android:layout_marginTop="16dp"
     android:background="@drawable/ripple"
     android:paddingBottom="4dp"
     android:text="@string/view_details"
     android:textColor="@color/White"
     android:textSize="14sp"
     android:textStyle="bold"
     app:layout_constraintEnd_toEndOf="parent"
     app:layout_constraintStart_toStartOf="parent"
     app:layout_constraintTop_toTopOf="parent"
     app:layout_constraintBottom_toBottomOf="parent" /> 

就是这样。

由于您的按钮将完全覆盖您的项目,并且它将悬停在其他视图的上方,因此它将起到像项目一样的作用。

要在按钮上实现长按监听器,请确保在holder中注册它,然后holder.button.setOnLongClick......

试试吧,如果有任何疑问,请评论。


好的,动画效果不是预期的。但这确实是一个非常好的技巧,在其他情况下可能会有用,所以非常感谢你教给我! - tom gautot

0
创建一个名为ripple.xml的xml文件,然后将其设置为视图的前景。它会像魔法一样工作!
<?xml version="1.0" encoding="utf-8"?>
<!-- An white rectangle ripple. -->
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:color="#3fce29"
    tools:targetApi="lollipop">
    <item
        android:id="@android:id/mask"
        android:gravity="center">
        <shape android:shape="rectangle">
            <solid android:color="#3fce29"/>
        </shape>
    </item>
</ripple>

前景吗?你确定吗?另外,这如何处理长按操作? - Alex.F
没有预期的行为:感觉就像 R.attr 中的 selectableItemBackground 属性。请检查我提出的问题中链接到一个视频,展示了所期望的效果。 - tom gautot
要获得与视频相同的涟漪效果,您需要使用来自Github的外部库android-ripple-background - Gourango Sutradhar

0

首先尝试制作涟漪效果的xml文件

ripple.xml

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:color="@color/light_gray"
tools:targetApi="lollipop">
<item android:id="@android:id/mask">
    <shape android:shape="rectangle">
        <solid android:color="@color/light_gray"/>
    </shape>
</item>
</ripple>

如果您的适配器声明了xml父布局,如LinearLayout或者使用RelativLayout,则可以设置背景如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/ripple"
>......

基本上和下面的答案差不多,所以:不,它没有给我期望的行为。请查看问题中链接中的视频,以查看所需的效果。 - tom gautot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接