RippleDrawable - 编程展示涟漪效果

14

我的视图如下所示

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="New Button"
    android:id="@+id/button"
    android:background="@drawable/ripple"
    android:layout_centerVertical="true"
    android:layout_alignParentStart="true" />

而ripple.xml则是

<?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"
        android:drawable="@android:color/white" />

</ripple>

一切都很顺利。当我触摸视图时,它会产生涟漪效果。 我想要的是从代码中重复启动视图上的涟漪动画,以将其显示为不确定进度。使波纹持续不断地扩散。

类似于:

 Runnable runnable = new Runnable() {
    @Override
    public void run() {
        RippleDrawable drawable = (RippleDrawable) button.getBackground();
        drawable.showRipples(true, true); // <-- This is needed

        handler.postDelayed(runnable, 500);
    }
};

如何做到这一点?

1个回答

22

RippleDrawable 响应按下和获取焦点状态,前者提供您所寻找的涟漪动画。您可以使用 View.setPressed(boolean) 在主机视图上切换按下状态。

Runnable pressRunnable = new Runnable() {
    @Override
    public void run() {
        button.setPressed(true);
        button.postOnAnimationDelayed(unpressRunnable, 250);
    }
};

Runnable unpressRunnable = new Runnable() {
    @Override
    public void run() {
        button.setPressed(false);
        button.postOnAnimationDelayed(pressRunnable, 250);
    }
};

请记住,用户触摸 Button 也会切换按下状态,因此您可能需要在 OnTouchListener 中删除或重新发布您的可运行项。

如果需要,您可以使用 Drawable.setHotspot(float, float) 或在 API 22+ 上使用 View.dispatchDrawableHotspotChanged(float, float) 控制涟漪位置,并传递相对于视图的 (x, y) 坐标。


需要每次调用Drawable.setHotspot(float, float)来保持其恒定,因为它会在某种情况下被重置。 - Rohit Sharma
2
很糟糕的解决方案。(为什么?)动态+可运行类+观察者不能很好地刷新% CPU(RecycleView)。 - user3402040
1
太棒了!!太棒的答案!!正是我在寻找的!!非常感谢!!!(y) - Sjd

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