Переместите ImageView в другую позицию в анимированном виде на Android
У меня есть несколько ImageView
в RelativeLayout
. теперь, когда пользователь удаляет любой из ImageView, я хочу, чтобы он был перемещен в указанное место с тонкой анимацией.
Например; Я первоначально задал поля для LayoutParams
, связанные с ImageView
как layoutparams1.setMargins(90,70,0,0);
, а затем добавил его в макет.
и при обращении к изображению я хотел бы, чтобы его новое местоположение было 200,200
, с анимацией.
Итак, возможно ли это? если да, то как?
Обратите внимание, что у меня есть как RelativeLayout
, так и все его дочерние ImageView
, созданные программно.
И я новичок в разработке Android, поэтому ожидается отчётливый ответ.
Ответы
Ответ 1
TranslateAnimation animation = new TranslateAnimation(0, 50, 0, 100);
animation.setDuration(1000);
animation.setFillAfter(false);
animation.setAnimationListener(new MyAnimationListener());
imageView.startAnimation(animation);
ОБНОВЛЕНИЕ:
Проблема в том, что View
на самом деле все еще находится в старой позиции. Поэтому мы должны переместить его, когда анимация закончена. Чтобы определить, когда анимация закончена, мы должны создать собственный animationListener
(внутри нашего класса activity
):
private class MyAnimationListener implements AnimationListener{
@Override
public void onAnimationEnd(Animation animation) {
imageView.clearAnimation();
LayoutParams lp = new LayoutParams(imageView.getWidth(), imageView.getHeight());
lp.setMargins(50, 100, 0, 0);
imageView.setLayoutParams(lp);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationStart(Animation animation) {
}
}
Итак, onClickEvent
снова будет запущен на новом месте.
Теперь анимация будет перемещаться еще ниже, поэтому вы можете сохранить x
и y
в переменной, так что в onAnimationEnd()
вы переместите ее не в место исправления.
Ответ 2
также лучше использовать ObjectAnimator
. это представление движения в новом положении.
например:
ImageView splash ;
@Override
public boolean onTouchEvent(MotionEvent event) {
float tx = event.getX();
float ty = event.getY();
int action = event.getAction();
switch(action) {
case MotionEvent.ACTION_DOWN:
tx = event.getX();
ty = event.getY();
// findViewById(R.id.character).setX(tx-45);
// findViewById(R.id.character).setY(ty-134);
ObjectAnimator animX = ObjectAnimator.ofFloat(splash, "x", tx-45);
ObjectAnimator animY = ObjectAnimator.ofFloat(splash, "y", ty-134);
AnimatorSet animSetXY = new AnimatorSet();
animSetXY.playTogether(animX, animY);
animSetXY.start();
break;
default:
}
return true;
}
Ответ 3
В нижеприведенном коде я добавляю изображение в центре на фреймовую схему динамически. После добавления я увеличиваю масштабирование и задаю альфу, чтобы получить эффект масштабирования, и после полной анимации я просто переведу свое изображение на одну позицию в другую позицию.
Добавить представление изображения на framelayout
imgHeart = new ImageView(getBaseContext());
imgHeart.setId(R.id.heartImage);
imgHeart.setImageResource(R.drawable.material_heart_fill_icon);
imgHeart.setLayoutParams(new FrameLayout.LayoutParams(50, 50, Gravity.CENTER));
mainFrameLaout.addView(imgHeart);
Добавить анимацию в виде изображения
imgHeart.animate()
.scaleXBy(6)
.scaleYBy(6)
.setDuration(700)
.alpha(2)
.setListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
imgHeart.animate()
.scaleXBy(-6f).scaleYBy(-6f)
.alpha(.1f)
.translationX((heigthAndWidth[0] / 2) - minusWidth)
.translationY(-((heigthAndWidth[1] / 2) - minusHeight))
.setDuration(1000)
.setListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
// remove image view from framlayout
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
}).start();
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
}).start();