我知道我可以将
android:background =“?android:attr / selectableItemBackground”设置为任何View以获得
Android Lollipop的漂亮连锁效果.这适用于用户触摸的视图.但是如果我想在没有用户交互的情况下播放波纹动画呢?
在我的应用程序中,我想通过在此视图上播放波纹动画来引起对视图的注意.我怎样才能做到这一点?我没有找到一种方法来获取涟漪动画的Animatior对象.那么如何在没有用户交互的情况下从代码中为视图设置波纹动画呢?
最佳答案 遗憾的是,没有可用的方法来播放波纹动画.但我可以想到两种可能的方法来实现这一目标
#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);
}