2016-08-17 30 views
3

我知道我可以设置android:background="?android:attr/selectableItemBackground"任何视图得到很好的连锁反应在Android Lollipop.This非常适用于由用户触摸的意见。但是如果我想在没有用户交互的情况下播放涟漪动画呢?播放纹波动画,而无需用户交互

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

+0

经过这可能是它可以帮助你可能dublicate的http://stackoverflow.com/a/26604471/5305430 – sushildlh

回答

2

不幸的是没有可用的方法可用于播放涟漪动画。但我能想到的两种可能的方式来实现这一

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