涟漪可绘制 - 以编程方式显示涟

我有这样的观点

<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" />

和涟漪.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

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);
    }
};

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

如果需要,您可以使用或API 22 +和传递视图相对坐标来控制纹波位置。Drawable.setHotspot(float, float)View.dispatchDrawableHotspotChanged(float, float)(x, y)


答案 2

推荐