在Android中无需动画即可从上到下连续移动视图

时间:2014-09-30 08:14:58

标签: position android-animation collision-detection move thread-sleep

我想知道如何在没有动画的情况下从上到下连续移动视图。我问这个是因为我想在每一步获取视图的位置,以便我可以检查该视图与任何其他视图之间是否存在任何冲突。

使用动画,您可以将视图从一个位置移动(不是精确地移动)到另一个位置(Animator类),但是动画会向用户产生幻觉,它正在移动,但它的位置始终是固定的。所以这不能用动画来完成吗?

第二种方法是增加观点的位置。我在onCreate()中应用了此方法。如果我在没有Thread.sleep(50)的情况下使用它,则活动不会显示该视图,如果我将其应用于Thread.sleep(50),则活动不会在一段时间内启动。

2 个答案:

答案 0 :(得分:1)

属性动画(Animator类的子类)实际上会移动视图,因为它们会更新视图的实际属性。视图动画(动画类的子类)不会移动实际视图,而是移动到用户所在的位置。 来源:http://developer.android.com/guide/topics/graphics/prop-animation.html Quote:使用属性动画系统,这些约束被完全删除,并且您可以为任何对象(视图和非视图)的任何属性设置动画,并且实际修改了对象本身。

你也不应该开始在onCreate方法中移动东西,因为事情仍在初始化(推荐使用onwindowfocuschanged)。此外,如果你调用thread.sleep,你将睡眠主UI线程,因此冻结应用程序一段时间。

答案 1 :(得分:0)

使用ValueAnimator解决问题: -

CodeSnippet: -

va=ValueAnimator.ofFloat(0.0f,size.y);
va.setDuration(5000);
va.setRepeatCount(va.INFINITE);
va.setRepeatMode(va.REVERSE);
va.start();
va.addUpdateListener(new AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        // TODO Auto-generated method stub
                bullet[0].setTranslationY((Float) va.getAnimatedValue());           
                   Rect R11=new Rect(bullet[0].getLeft(),bullet[0].getTop()+(int)bullet[0].getTranslationY(),bullet[0].getRight(),bullet[0].getBottom()+(int)bullet[0].getTranslationY());
                      Rect R21=new Rect(ball.getLeft(), ball.getTop(), ball.getRight(), ball.getBottom());
                      if(R11.intersect(R21))
                        va.cancel();
    }
});