RippleDrawable - 以编程方式显示Ripple效果

Jav*_*tor 8 java android android-animation rippledrawable android-5.0-lollipop

我有这样的观点

<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" />
Run Code Online (Sandbox Code Playgroud)

和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>
Run Code Online (Sandbox Code Playgroud)

一切都很好.当我触摸视图时,它给了我涟漪效果.我正在寻找的是重复从代码开始视图上的波纹动画.将其显示为不确定的进展.波浪一直在荡漾.

就像是

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

        handler.postDelayed(runnable, 500);
    }
};
Run Code Online (Sandbox Code Playgroud)

这该怎么做?

ala*_*anv 10

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);
    }
};
Run Code Online (Sandbox Code Playgroud)

请记住,用户触摸Button也会切换按下的状态,因此您可能希望删除或重新发布您的可运行文件OnTouchListener.

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

  • 如此糟糕的解决方案。(为什么?)动态地+可运行+观察者不是很好的刷新%cpu(RecycleView) (2认同)