У меня есть вертикально ориентированный LinearLayout (внутри ScrollView), который содержит динамически созданные представления. Каждый из этих представлений содержит EditText. В качестве опции я хотел бы, чтобы пользователь мог изменить порядок этих представлений.Переключить текст между EditTexts во время TranslateAnimation
Для переупорядочения я предоставляю кнопку UP и DOWN. Это отлично работает. Анимация плавная и дает ожидаемый результат.
Установка:
Анимация просто визуальная обратная связь: Я НЕ переупорядочивая просмотров. Я только переключаю данные между двумя EditTexts. Например:
View1 ==== EditText1 ==== TextData1
View2 ==== EditText2 ==== TextData2
Когда анимация заканчивается:
View1 ==== EditText1 ==== TextData2
View2 ==== EditText2 ==== TextData1
Проблема:
Я в настоящее время переключения на EditText.getText().toString()
значения в onAnimationEnd(Animation)
. Это не совсем гладко. Лучшее, что я могу сделать, чтобы описать эффект: flicker
. Когда значения переключаются, появляется мерцание.
Есть ли способ избежать этого?
TranslateAnimation:
static TranslateAnimation translate(float fromX, float toX, float fromY,
float toY, int ms) {
TranslateAnimation transAnim = new TranslateAnimation(fromX, toX, fromY, toY);
transAnim.setDuration(ms);
return transAnim;
}
Как анимация применяется:
// Animate viewToMove to move to viewToReplace's position
TranslateAnimation ta = Utils.translate(0, 0, 0, -viewToReplace.getHeight(), 2000);
// Animate viewToReplace to move to viewToMove's position
TranslateAnimation ta2 = Utils.translate(0, 0, 0, viewToMove.getHeight(), 2000);
// AnimationListener
ta.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) { }
@Override
public void onAnimationRepeat(Animation animation) { }
@Override
public void onAnimationEnd(Animation animation) {
// Grab the text that is held by viewToMove's EditText
String temp = ((EditText)
(viewToMove.findViewById(R.id.etListItemText))).getText().
toString();
// Set viewToMove's EditText to show contents of viewToReplace's EditText
((EditText) (viewToMove.findViewById(R.id.etListItemText))).
setText(((EditText) (viewToReplace.
findViewById(R.id.etListItemText))).
getText().toString());
// Set viewToReplace's EditText contents
((EditText) (viewToReplace.findViewById(R.id.etListItemText))).
setText(temp);
}
});
// Start animations
viewToMove.startAnimation(ta);
viewToReplace.startAnimation(ta2);
Спасибо, человек отлично работает с небольшим изменением: я назвал 'view.setAnimation (null)' _before_ настройкой текста. Вызвав его, все еще вызывал мерцание. Я был бы признателен, если бы вы могли немного объяснить, почему это работает? – Vikram
Хотя я не совсем уверен, я бы сказал, что среда выполнения Android очищает и возвращает матрицу вида вскоре после вызова onAnimationEnd, поэтому текст будет меняться, и через некоторое время представление вернется назад. Установка анимации на нуль заставила матрицу вернуться на место. –
Кроме того, странно, что порядок кода здесь не сработал для вас ... он работал для меня просто отлично. Странный. –