Ответ 1
Если вы обрабатываете анимацию на API более низкого уровня (ниже HoneyComb), ваша анимация фактически не перемещает кнопку, а только ее изображения. Его щелчок будет в том же месте, где вы разместили его в своем макете.
Я выполнял анимацию перевода на кнопке, все работает как я исключен, но только проблема заключается в том, что после анимации кнопка не отвечает на событие клика, пожалуйста, исправьте меня.
Button b=(Button)findViewById(R.id.button1);
TranslateAnimation slide=new TranslateAnimation(0, 30, 0,-40);
slide.setDuration(500);
slide.setZAdjustment(TranslateAnimation.ZORDER_TOP);
slide.setFillAfter(true);
b.startAnimation(slide);
Если вы обрабатываете анимацию на API более низкого уровня (ниже HoneyComb), ваша анимация фактически не перемещает кнопку, а только ее изображения. Его щелчок будет в том же месте, где вы разместили его в своем макете.
Это переведет объект в направлении y:
ObjectAnimator mover = ObjectAnimator.ofFloat(v, "translationY", 0, 400);
mover.start();
Я мог бы достичь того, чего вы хотели, но вы будете управлять координатами вручную. Посмотрите, работает ли это для вас.
public class AnimationTestActivity extends Activity {
private Button mButton;
private LinearLayout.LayoutParams params;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mButton = (Button) findViewById(R.id.button);
mButton.setOnClickListener(mClickListener);
params = (LayoutParams) mButton.getLayoutParams();
}
private android.view.View.OnClickListener mClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 400);
animation.setDuration(2000);
animation.setAnimationListener(mAnimationListener);
v.startAnimation(animation);
}
};
private AnimationListener mAnimationListener = new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
params.topMargin = params.topMargin + 400;
mButton.setLayoutParams(params);
}
};
}
Я столкнулся с этой проблемой, и я исправил ее всего лишь секунду назад. Итак, я думаю, что я должен поделиться своим решением с вами, ребята.
В анимационном xml файле я удалил android:fillAfter="true"
, если сохранить android:fillEnabled="true"
.
Зарегистрируйте прослушиватель анимации, затем в методе onAnimationEnd()
я вызываю View#Layout()
, чтобы изменить положение представления.
int newLeft = (int) (layoutContent.getLeft() + layoutContent.getWidth() * 0.8);
layoutContent.layout(newLeft,
layoutContent.getTop(),
newLeft + layoutContent.getMeasuredWidth(),
layoutContent.getTop() + layoutContent.getMeasuredHeight());
В моем случае, что делает анимация, это то, что слайды layoutContent влево 80% от ширины.
Он отлично работает. Надеюсь, это поможет.
@Update: Сегодня вы можете использовать ObjectAnimator
на Android 3.0+. Если вы разрабатываете для android под 3.0, вы можете найти его в библиотеке поддержки v.4. ObjectAnimator
- это bester для анимации.
@Обновление # 2: вы можете использовать ViewPropertyAnimator в версии для Android версии более ранней версии. Он обеспечивает лучшую производительность и устраняет проблему с событиями кликов. Пример:
mButton.animate()
.setDuration(TIME)
.translationY(VALUE)
.start();
Анимация не меняет вид на самом деле. даже если вы установили fillAfter (true), позиция, в которой он может принять событие клика, является исходной позицией.
Попробуйте использовать это:
b.layout(0, -40, b.getWidth(), b.getHeight());
Я нашел простое решение, определяющее конечную позицию кнопки в макете и запуск анимации с некоторой позиции, то есть укажите fromX или fromY вместо того, чтобы ставить нуль