2016-08-17 45 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); 
}