在没有用户交互的情况下播放波纹动画

Posted

技术标签:

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

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

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

【问题讨论】:

通过这个可能对你有帮助 可能重复***.com/a/26604471/5305430 【参考方案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);

【讨论】:

终于!第二种解决方案效果很好。谢谢!

以上是关于在没有用户交互的情况下播放波纹动画的主要内容,如果未能解决你的问题,请参考以下文章

在没有任何用户控制或交互的情况下在 iPhone 上播放全屏视频?

UIVIew 块动画后用户交互中断

有没有办法在没有用户交互的情况下发送短信?

如何在没有用户交互的情况下启动 Open Camera 应用程序来拍照?

如何在 React Native 中在没有用户交互的情况下收到通知时打开应用程序

可控动画