在没有用户交互的情况下播放波纹动画
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 上播放全屏视频?
如何在没有用户交互的情况下启动 Open Camera 应用程序来拍照?