Непрерывно перемещайте вид сверху вниз без анимации в Android

Я хочу знать, как непрерывно перемещать вид сверху вниз без анимации. Я спрашиваю об этом, потому что хочу получать положение представления на каждом этапе, чтобы я мог проверить, есть ли какое-либо столкновение между этим представлением и любым другим представлением.

С анимацией вы можете перемещать (не совсем перемещать) представление из одной позиции в другую позицию (класс Animator), но анимация создает у пользователя иллюзию того, что она движется, но ее позиция все время фиксируется. Так это нельзя сделать с помощью анимации?

Второй подход заключается в увеличении позиции просмотра. Я применил этот метод в onCreate(). Если я использовал его без Thread.sleep(50), то активность не показывает представление, если я применил его с Thread.sleep(50), то активность не запускается в течение некоторого периода.


person Ajay    schedule 30.09.2014    source источник


Ответы (2)


Анимация свойств (подклассы класса Animator) фактически перемещают представление, поскольку они обновляют фактическое свойство представления. Это анимации просмотра (подклассы класса Animation), которые не перемещают фактический вид, а перемещают его только туда, где он отображается пользователю. Источник: http://developer.android.com/guide/topics/graphics/prop-animation.html Цитата: С помощью системы анимации свойств эти ограничения полностью снимаются, и вы можете анимировать любое свойство любого объекта (представления и не-представления), а сам объект фактически изменяется.

Вы также не должны начинать перемещать элементы в методе onCreate, так как они все еще инициализируются (рекомендуется метод onwindowfocuschanged). Кроме того, если вы вызываете thread.sleep, вы переходите в спящий режим основного потока пользовательского интерфейса, следовательно, приложение на время замораживается.

person Whitney    schedule 01.10.2014

Решил проблему с помощью ValueAnimator: -

Фрагмент кода: -

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();
    }
});
person Ajay    schedule 10.10.2014