Я пытаюсь сделать анимацию, которая идет как это:Android - обновление TranslateAnimation динамически размер макета
Контекст:
У меня есть два EditText
«S Мне нужно, что, когда ты щелкните по одному, а другой выйдет из-за первого. Здесь у вас есть фотографии, чтобы получить изображение того, что я хочу.
Чтобы сделать это, очевидно, мне нужно TranslateAnimation
, чтобы переместить второй EditText
из-за первого.
Мой подход:
Первое, что я мог бы считал в использование FrameLayout
поставил EditText
один над другим, а затем в случае onTouch из первой сделать TranslateAnimation
на второй. Проблема в том, что если у меня есть высота FrameLayout
в wrap_content
, тогда анимация будет невидимой для пользователя. И если я меняю на время выполнения высоту FrameLayout
я оставлю пустоту ниже первого EditText
, как вы можете видеть на этой картинке:
Второе решение, которое я думал, добавьте 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 контейнера выполняется немедленно. Результат тот же, что и при попытке изменить размер контейнера в конце анимации.
Хороший способ подумать. Я дам ему попробовать, и если я буду работать, я приму свой ответ. Благодаря! – 4gus71n
Я думаю, что это решение не работает, потому что когда я выполняю анимацию в «FrameLayout», представление становится недействительным, и я не вижу анимацию «EditText». Проверьте мое обновление. – 4gus71n
вам нужно создать 2 отдельных экземпляра TranslateAnimation - вы это делаете? –