2

我有一个垂直方向的 LinearLayout(在 ScrollView 内),它包含动态创建的视图。这些视图中的每一个都包含一个 EditText。作为一个选项,我希望用户能够重新排序这些视图。

对于重新排序,我提供了一个向上和向下按钮。这很好用。动画很流畅,并给出了预期的输出。

设置:

动画只是一个视觉反馈:我没有重新排序视图。我只是在两个 EditText 之间切换数据。例如:

View1 ==== EditText1 ==== TextData1
View2 ==== EditText2 ==== TextData2

动画结束时:

View1 ==== EditText1 ==== TextData2
View2 ==== EditText2 ==== TextData1

问题:

我目前正在EditText.getText().toString()切换onAnimationEnd(Animation). 这一点都不顺利。我能做的最好的描述效果:flicker。切换值时会闪烁。

有没有办法避免这种情况?

翻译动画:

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);
4

1 回答 1

3

你的问题激起了我的好奇心,所以我设置了一个虚拟项目来测试你想要做什么,实际上我看到了一个闪烁。

我设法通过将以下代码放入我的 onAnimationEnd 方法来解决它:

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

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

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

在两个 EditTexts 中将动画设置为 null 似乎可以解决闪烁问题。

希望这可以帮助!

于 2013-10-03T08:45:13.163 回答