RippleDrawable - 以编程方式显示波纹效果

Posted

技术标签:

【中文标题】RippleDrawable - 以编程方式显示波纹效果【英文标题】:RippleDrawable - Show Ripple Effect programmatically 【发布时间】:2015-05-17 10:40:03 【问题描述】:

我有这样的看法

<Button
    android:layout_
    android:layout_
    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】:

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) 每次都必须调用以保持其不变。它以某种方式重置。 这么糟糕的解决方案。 (为什么?)动态+可运行+观察者不是很好的刷新%cpu(RecycleView) 太棒了!!绝妙的答案!!正是我想要的!太感谢了!!!! (y)

以上是关于RippleDrawable - 以编程方式显示波纹效果的主要内容,如果未能解决你的问题,请参考以下文章

如何在带有 Android 5.0 Lollipop 的代码(不是 xml)中以编程方式使用 RippleDrawable?

android.graphics.drawable.RippleDrawable 错误

资料转发分享基于8086 8253定时计数器方波发生器仿真基于8086 1602动态显示仿真设计基于8086步进电机转动控制设计

资料转发分享基于8086 8253定时计数器方波发生器仿真基于8086 1602动态显示仿真设计基于8086步进电机转动控制设计

RippleDrawable 遮罩颜色,它是干啥用的?

如何在android中为首选项添加涟漪效果?