2013-10-13 6 views
2

Я пытаюсь сделать анимацию, которая идет как это:Android - обновление TranslateAnimation динамически размер макета

Контекст:

У меня есть два EditText «S Мне нужно, что, когда ты щелкните по одному, а другой выйдет из-за первого. Здесь у вас есть фотографии, чтобы получить изображение того, что я хочу. Application in standby Application after you click the first EditText

Чтобы сделать это, очевидно, мне нужно TranslateAnimation, чтобы переместить второй EditText из-за первого.

Мой подход:

Первое, что я мог бы считал в использование FrameLayout поставил EditText один над другим, а затем в случае onTouch из первой сделать TranslateAnimation на второй. Проблема в том, что если у меня есть высота FrameLayout в wrap_content, тогда анимация будет невидимой для пользователя. И если я меняю на время выполнения высоту FrameLayout я оставлю пустоту ниже первого EditText, как вы можете видеть на этой картинке:

enter image description here

Второе решение, которое я думал, добавьте AnimationListener к TranslateAnimation и в методе onAnimationStart изменить высоту FrameLayout. Но проблема в том, что высота FrameLayout изменяется слишком резко. Я хочу, чтобы анимация была гладкой.

Мой вопрос:

Как я могу получить плавную анимацию второго EditText из-за первого, меняя высоту FrameLayout как второй EditText движется вниз?

Спасибо!

Update:

Я изменил FrameLayout на RelativeLayout я искал, и нет никакой разницы в этом случае. Я попробовал масштабировать этот RelativeLayout, который содержит оба из EditText с AnimationScale, чтобы отображать анимацию плавно, но не работает. Вот мой код:

protected void expanse() { 
     Log.d("Accordion", "expandAccordion"); 
     //Translate the top of the second EditText to its bottom 
     TranslateAnimation translateSecond = new TranslateAnimation(second.getLeft(), second.getLeft(), 
       second.getTop(), second.getBottom()); 
     translateSecond.setDuration(1000); 
     //Scale the relative layout to show the both of them 
     ScaleAnimation scaleContainer = new ScaleAnimation(container.getLeft(), container.getLeft(), 
       container.getTop(), second.getBottom()); 
     scaleContainer.setDuration(1000); 
     //At the end of the scaling, change the height of the relative layout 
     scaleContainer.setAnimationListener(new AnimationListenerAdapter() { 

      @Override 
      public void onAnimationEnd(Animation animation) { 
       RelativeLayout.LayoutParams params = (LayoutParams) container.getLayoutParams(); 
       params.height = second.getBottom(); 
       container.setLayoutParams(params); 
       super.onAnimationEnd(animation); 
      } 

     }); 
     container.startAnimation(scaleContainer); 
     second.startAnimation(translateSecond); 
    } 

КСТАТИ Я могу гарантировать, что если я жёстко некоторую большую высоту, как 350dp, анимация отображается корректно.

UPDATE:

Я попытался перемещения обоих, второй EditText и расположение ниже. Это код. Кстати, по другим причинам я изменил ListView на заказ ViewPager, это ничего не меняет.

public class MainActivity extends FragmentActivity { 

    private EditText first; 
    private EditText second; 
    private HoboViewPager pager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     pager = (HoboViewPager) findViewById(R.id.pager); 
     pager.setPageTransformer(true, new RotationPageTransformer()); 
     pager.setAdapter(new SampleAdapter(this, getSupportFragmentManager())); 

     first = (EditText) findViewById(R.id.location_search_field); 
     second = (EditText) findViewById(R.id.term_search_field); 
     first.setOnTouchListener(new OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       expanseSecondField(); 
       return true; 
      } 
     }); 
    } 

    protected void expanseSecondField() { 
     TranslateAnimation translateSecondField = new TranslateAnimation(second.getLeft(), second.getLeft(), 
       second.getTop(), second.getBottom()); 
     translateSecondField.setFillAfter(true); 
     translateSecondField.setDuration(1000); 
        TranslateAnimation translateContainer = new TranslateAnimation(pager.getLeft(), pager.getLeft(), 
       pager.getTop(), pager.getTop() + second.getBottom()); 
     translateContainer.setFillAfter(true); 
     translateContainer.setDuration(1000); 
        pager.startAnimation(translateContainer); 
     second.startAnimation(translateSecondField); 
    } 
} 

Это не сработало, потому что TranslateAnimation контейнера выполняется немедленно. Результат тот же, что и при попытке изменить размер контейнера в конце анимации.

ответ

1

Как использовать 2-й вариант & попробовать выполнить две трансляционные анимации в тандеме: 1 на EditText, затем один на FrameLayout? Дайте им одинаковые точные дельта и продолжительность. Таким образом, FrameLayout будет плавно перемещаться вниз, а затем в конце анимации измените высоту FrameLayout.

Надеюсь, что это поможет :)

+0

Хороший способ подумать. Я дам ему попробовать, и если я буду работать, я приму свой ответ. Благодаря! – 4gus71n

+0

Я думаю, что это решение не работает, потому что когда я выполняю анимацию в «FrameLayout», представление становится недействительным, и я не вижу анимацию «EditText». Проверьте мое обновление. – 4gus71n

+0

вам нужно создать 2 отдельных экземпляра TranslateAnimation - вы это делаете? –

Смежные вопросы