Android TranslateАнимация анимация

У меня есть составной вид, смешанный с некоторыми кнопками, прикрепленными в правом верхнем углу экрана с помощью RelativeLayout. Я хочу, чтобы это представление анимировалось вправо, когда я нажимаю кнопку «открыть-закрыть» на нем и остается там до тех пор, пока пользователь не выберет/не нажмет одну из его кнопок или снова не нажмет кнопку «открыть-закрыть», а затем он должен анимироваться вправо и стать невидимым. Проблема в том, что он анимируется влево, а затем возвращается на исходное место! Что мне делать, чтобы решить эту проблему?

Код:

public class AlarmCommandComponent extends LinearLayout {

    ImageButton carOffButton;
    ImageButton carOnButton;
    ImageButton armButton;
    ImageButton disArmButton;
    ImageButton openCloseButton;
    LayoutAnimationController controller;
    Animation animation;

    public AlarmCommandComponent(Context context, AttributeSet attrs) {
        super(context, attrs);
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        inflater.inflate(R.layout.car_alarm_view, this);

        openCloseButton = (ImageButton) findViewById(R.id.alarmOpenCloseButton);

        AnimationSet set = new AnimationSet(true);
        animation = new TranslateAnimation(
                Animation.RELATIVE_TO_SELF, //fromXType 
                0.0f,                       //fromXValue
                Animation.RELATIVE_TO_SELF, //toXType
                -1.0f,                      //toXValue
                Animation.RELATIVE_TO_SELF, //fromYType
                0.0f,                       //fromYValue
                Animation.RELATIVE_TO_SELF, //toYType
                0.0f);                      //toYValue
        animation.setDuration(500);
        set.addAnimation(animation);
        LayoutAnimationController controller = new LayoutAnimationController(set, 0.25f);
        this.setLayoutAnimation(controller);
        this.setPadding(0, 7, 7, 10);
        this.setBackgroundColor(Color.BLACK);

        openCloseButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                openCloseButton_onClick(v);
            }
        });
    }

    public void openCloseButton_onClick(View v) {
        this.startAnimation(animation);
    }

}

Есть идеи?


person Ali Behzadian Nejad    schedule 23.01.2012    source источник


Ответы (2)


По умолчанию анимация сбрасывает объект в исходное состояние. Вам нужно указать от fillAfter до true:

animation.setFillAfter(true);
person aromero    schedule 23.01.2012
comment
Спасибо! Это работает, но кажется, что моя кнопка открытия-закрытия не реагирует на нажатия в этой ситуации? Я прав? - person Ali Behzadian Nejad; 24.01.2012
comment
Каркас анимации до Honeycomb перемещает только визуальную часть макета. Физическое местоположение остается прежним, и вы должны переместить его самостоятельно. Honeycomb представил класс Animator, а точнее PropertyAnimator, который будет анимировать и физически перемещать объекты. - person DeeV; 24.01.2012
comment
Я работаю над Android 2.1, так что мне делать, чтобы перемещать реальные объекты с анимацией, а не просто их снимок? - person Ali Behzadian Nejad; 24.01.2012
comment
Либо испортите поля View, либо добавьте AnimationListener, который физически перемещает объект внутри макета в конце анимации (т.е. не используйте setFillAfter). - person Jens; 24.01.2012
comment
Дорогой Йенс, мне нужно использовать setFillAfter(true) (прочитайте вопросы и ответы еще раз), так что теперь это единственный способ установить новые поля для макета? - person Ali Behzadian Nejad; 24.01.2012

Для того, чтобы кнопка после перевода заработала, ее нужно еще и физически переместить в новое положение. Вы можете сделать это, изменив положение макета программно.

Установите прослушиватель анимации и внутри onAnimationEnd сделайте это -

  @Override
  public void onAnimationEnd(Animation animation) {

yourLayout.layout(newLeft, newTop, newRight, newBottom);

  }

Чтобы узнать больше об ограничениях анимации, которые существовали до сотового API, прочитайте это - http://android-developers.blogspot.in/2011/02/animation-in-honeycomb.html

person alchemist    schedule 05.07.2012
comment
Я сделал работу с выдвижным ящиком и исчезновением и исчезновением! Я думаю, что работа с макетами в программе не является хорошей практикой в ​​приложениях среднего и крупного масштаба. - person Ali Behzadian Nejad; 05.07.2012
comment
Но выдвижной ящик имеет ограничение, заключающееся в том, что его можно переключать снизу вверх и справа налево. это не сработает, если вам нужно, чтобы ящик открывался слева направо ИЛИ сверху вниз. В любом случае, удачи! - person alchemist; 06.07.2012