【问题标题】:Play ripple animation without user interaction在没有用户交互的情况下播放波纹动画
【发布时间】:2016-12-24 02:18:05
【问题描述】:

我知道我可以将android:background="?android:attr/selectableItemBackground" 设置为任何视图,以从 Android Lollipop 中获得漂亮的涟漪效果。这对于用户触摸的视图非常有效。但是如果我想在没有用户交互的情况下播放波纹动画怎么办?

在我的应用程序中,我想通过在该视图上播放波纹动画来引起对视图的注意。我怎样才能做到这一点?我没有找到为波纹动画获取Animatior 对象的方法。那么如何在没有用户交互的情况下从代码中为视图设置波纹动画呢?

【问题讨论】:

标签: android android-animation


【解决方案1】:

很遗憾,没有可用的方法来播放波纹动画。但我可以想到两种可能的方法来实现这一点

#1 使用反射

public static void simulateButtonPress(final View view)
{
    Drawable drawable = view.getBackground();
    if( drawable instanceof RippleDrawable )
    {
        try
        {
            final RippleDrawable rd = ((RippleDrawable)drawable);
            final Method setRippleActive = rd.getClass().getDeclaredMethod("setRippleActive", boolean.class);
            setRippleActive.setAccessible(true);
            setRippleActive.invoke(rd, true);  //setRippleActive(true)

            //exit ripple effect after 250 milliseconds
            new Handler().postDelayed(new Runnable()
            {
                @Override
                public void run()
                {
                    try
                    {
                        setRippleActive.invoke(rd, false); //setRippleActive(false)
                    }
                    catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }
            }, 250);

        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

#2 通过模拟运动事件 ACTION_DOWN 和 ACTION_CANCEL

public static void simulateButtonPress(final View view)
{
    final long now = SystemClock.uptimeMillis();
    final MotionEvent pressEvent = MotionEvent.obtain(now, now, MotionEvent.ACTION_DOWN, view.getWidth()/2, view.getHeight()/2, 0);
    view.dispatchTouchEvent(pressEvent);

    new Handler().postDelayed(new Runnable()
    {
        @Override
        public void run()
        {
            final long now = SystemClock.uptimeMillis();
            final MotionEvent cancelEvent = MotionEvent.obtain(now, now, MotionEvent.ACTION_CANCEL, view.getWidth()/2, view.getHeight()/2, 0);
            view.dispatchTouchEvent(cancelEvent);
        }
    }, 250);
}

【讨论】:

  • 终于!第二种解决方案效果很好。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2021-10-08
  • 2014-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多