2015-09-10 2 views
0

Я создал простое приложение, просто хочу, когда я нажимаю кнопку, изображение будет перемещаться в другую позицию.Почему местоположение представления всегда сбрасывается после использования ObjectAnimator в View.TRANSLATION_X?

Ниже приведен код, но кажется, что при нажатии кнопки изображение всегда начинается с исходной позиции, а не с реальной позиции. Есть ли проблемы с моим кодом?

public class MainActivity extends Activity{ 

private ImageView iv; 
private Button bt; 
private AnimatorSet mAniSet; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.ddd); 
    iv = (ImageView) this.findViewById(R.id.imageView1); 
    bt = (Button) this.findViewById(R.id.button1); 
    mAniSet = new AnimatorSet(); 

    bt.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      int pointOnScreen[] = new int[2]; 
      iv.getLocationOnScreen(pointOnScreen); 

      ObjectAnimator AniTranslationX = ObjectAnimator.ofFloat(iv, View.TRANSLATION_X, pointOnScreen[0]+100); 
      mAniSet.playTogether(AniTranslationX); 
      mAniSet.setTarget(iv); 
      mAniSet.setDuration(200).start(); 
     }   
    }); 
} 

}

+0

Я пробовал ваш код (под ICS, JB и kitkat), и каждый раз, когда я нажимаю кнопку, представление будет переводить в правильной форме в предыдущее положение. Какой телефон или эмулятор вы используете? – xiaomi

+0

просто используйте 'ofFloat (iv, View.TRANSLATION_X, iv.getTranslationX() + 100)' – pskink

+0

@pskink, я просто попробую ваш код снова, кажется, не работает, спасибо все равно – user2159851

ответ

0

Если вы создаете ObjectAnimator.ofFloat (Object, свойства, значения), и есть только одно значение, поэтому начало анимации будет 0f.

Вы можете найти источник в класс android.animation.KeyFrameSet и следующий метод:

public static KeyframeSet ofFloat(float... values) { 
     boolean badValue = false; 
     int numKeyframes = values.length; 
     FloatKeyframe keyframes[] = new FloatKeyframe[Math.max(numKeyframes,2)]; 
     if (numKeyframes == 1) { 
      keyframes[0] = (FloatKeyframe) Keyframe.ofFloat(0f); 
      keyframes[1] = (FloatKeyframe) Keyframe.ofFloat(1f, values[0]); 
      if (Float.isNaN(values[0])) { 
       badValue = true; 
      } 
     } else { 
      keyframes[0] = (FloatKeyframe) Keyframe.ofFloat(0f, values[0]); 
      for (int i = 1; i < numKeyframes; ++i) { 
       keyframes[i] = 
         (FloatKeyframe) Keyframe.ofFloat((float) i/(numKeyframes - 1), values[i]); 
       if (Float.isNaN(values[i])) { 
        badValue = true; 
       } 
      } 
     } 
     if (badValue) { 
      Log.w("Animator", "Bad value (NaN) in float animator"); 
     } 
     return new FloatKeyframeSet(keyframes); 
    } 

Вы можете увидеть, только с одним значением, начало анимации 0f (ключевые кадры [0]).

Если поставить 2 значения, ваша анимация будет начинаться с первого значения и остановится на втором:

ObjectAnimator AniTranslationX = ObjectAnimator.ofFloat(iv, View.TRANSLATION_X, pointOnScreen[0], pointOnScreen[0] + 100); 

С 3 или более значений, анимация достигнет все эти значения в течение времени анимации ,

+0

Наконец, я использую два параметра, один из которых для начала размещения и один для остановки позиции, большое спасибо. – user2159851

+0

Теперь вы знаете, что ваш код не был глючит, но получил ожидаемое поведение;) – xiaomi

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