2013-10-03 5 views
1

У меня есть вертикально ориентированный 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); 

ответ

3

Ваш вопрос шипами мое любопытство совсем немного, так что настройки I фиктивный проект, чтобы проверить, что вы пытаясь сделать, и действительно, я увидел мерцание.

мне удалось решить, поставив следующий код в моем методе onAnimationEnd:

String text1 = tb1.getText().toString(); 
String text2 = tb2.getText().toString(); 

tb1.setText(text2); 
tb2.setText(text1);  

tb1.setAnimation(null); 
tb2.setAnimation(null); 

Настройка анимации нуль в обоих EditTexts кажется решить мигания.

Надеюсь, это поможет!

+0

Спасибо, человек отлично работает с небольшим изменением: я назвал 'view.setAnimation (null)' _before_ настройкой текста. Вызвав его, все еще вызывал мерцание. Я был бы признателен, если бы вы могли немного объяснить, почему это работает? – Vikram

+0

Хотя я не совсем уверен, я бы сказал, что среда выполнения Android очищает и возвращает матрицу вида вскоре после вызова onAnimationEnd, поэтому текст будет меняться, и через некоторое время представление вернется назад. Установка анимации на нуль заставила матрицу вернуться на место. –

+0

Кроме того, странно, что порядок кода здесь не сработал для вас ... он работал для меня просто отлично. Странный. –

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