Przenieś obraz do innej pozycji w Animowany sposób w Androidzie
Mam kilka ImageView
s W RelativeLayout
. teraz, gdy użytkownik dotknie dowolnego obrazu ImageView, chcę, aby został przeniesiony do określonego miejsca z subtelną animacją.
Np; początkowo ustawiłem marginesy dla LayoutParams
skojarzonego z ImageView
jako layoutparams1.setMargins(90,70,0,0);
, a następnie dodałem je do układu.
A kiedy imageview zostanie uruchomiony, chciałbym, aby jego nowa lokalizacja była 200,200
, z animacją.
Zauważ, że mam zarówno RelativeLayout
jak i całe jego dziecko ImageView
s stworzony programowo.
I jestem nowy w rozwoju Androida, więc oczekiwana jest szczegółowa odpowiedź.
3 answers
TranslateAnimation animation = new TranslateAnimation(0, 50, 0, 100);
animation.setDuration(1000);
animation.setFillAfter(false);
animation.setAnimationListener(new MyAnimationListener());
imageView.startAnimation(animation);
Aktualizacja:
Problem w tym, że View
jest nadal w swojej starej pozycji. Więc musimy przenieść go po zakończeniu animacji. Aby wykryć, kiedy animacja jest skończona, musimy utworzyć własną animationListener
(wewnątrz naszej klasy 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) {
}
}
Więc onClickEvent
zostaną zwolnieni ponownie w nowym miejscu.
Animacja przesunie ją teraz jeszcze bardziej w dół, więc możesz zapisać x
i y
w zmiennej, aby w onAnimationEnd()
przenieść ją nie do poprawki miejsce.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-03 19:29:51
Jest również lepsze, że używać ObjectAnimator
. ten widok przesunięcia w nowej pozycji.
na przykład:
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;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-04 06:00:45
W poniższym kodzie dodaję widok obrazu w środku na układzie ramki dynamicznie. Po dodaniu zwiększam skalowanie i ustawiam Alfę, aby dać efekt powiększenia, a po pełnej animacji po prostu tłumaczę mój widok obrazu z jednej pozycji na drugą pozycję.
Dodaj widok obrazu na 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);
Dodaj animację w widoku obrazu
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();
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-18 06:43:57