2017-01-06 4 views
0

Я создаю половину круга изображение двигающегося анимацию с указанным кодом radius.My работает fine.But он двигается в это исходное положение после того, как анимация end.My кода ниже:Избегайте перемещения в исходное положение после анимации

Внутри активность:

image = (ImageView) findViewById(R.id.image); 
    image.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Animation anim = new MyAnimation(image, 150); // radius = 150 
      anim.setDuration(3000); 
      anim.setFillEnabled(true); 
      anim.setFillAfter(true); 
      image.startAnimation(anim); 
     } 
    }); 

Анимация Класс:

public class MyAnimation extends Animation { 

private View view; 
private float cx, cy;   // center x,y position of circular path 
private float prevX, prevY;  // previous x,y position of image during animation 
private float r;    // radius of circle 
private float prevDx, prevDy; 


/** 
* @param view - View that will be animated 
* @param r - radius of circular path 
*/ 
public MyAnimation(View view, float r){ 
    this.view = view; 
    this.r = r; 
} 

@Override 
public boolean willChangeBounds() { 
    return true; 
} 

@Override 
public void initialize(int width, int height, int parentWidth, int parentHeight) { 
    // calculate position of image center 
    int cxImage = width/2; 
    int cyImage = height/2; 
    cx = view.getLeft() + cxImage; 
    cy = view.getTop() + cyImage; 

    // set previous position to center 
    prevX = cx+r; 
    prevY = cy; 
} 

@Override 
protected void applyTransformation(float interpolatedTime, Transformation t) { 
    if(interpolatedTime == 0){ 
     t.getMatrix().setTranslate(prevDx, prevDy); 
     return; 
    } 

    float angleDeg = (interpolatedTime * 180f) % 180; 
    float angleRad = (float) Math.toRadians(angleDeg); 

    // r = radius, cx and cy = center point, a = angle (radians) 
    float x = (float) (cx + r * Math.cos(angleRad)); 
    float y = (float) (cy + r * Math.sin(angleRad)); 

    float dx = prevX - x; 
    float dy = prevY - y; 

    prevX = x; 
    prevY = y; 

    prevDx = dx; 
    prevDy = dy; 

    t.getMatrix().setTranslate(dx, dy); 

} 
} 

Пожалуйста, наставит меня для выполнения этой задачи.

ответ

0

E nd анимационного прослушивателя image.setX(image.getX()+2*radius). Это изменит положение изображения.

0

Начало анимации, как этот

image.startAnimation(fadeInAnimation); 

и добавить слушателя для просмотра, и onAnimationEnd изменить положение зрения

fadeInAnimation.setAnimationListener(new Animation.AnimationListener() { 
    @Override 
    public void onAnimationStart(Animation animation) { 

    } 

    @Override 
    public void onAnimationEnd(Animation animation) { 

    } 

    @Override 
    public void onAnimationRepeat(Animation animation) { 

    } 
}); 
+0

как назвать конечное положение зрения от myAnimator? –

-1

@Rathi J

Не знаю Excat Answer..But я пытаюсь.

Я думаю, вы должны заменить:

anim.setFillAfter(true); 

с этим:

anim.setFillAfter(false); 

Надеется, что это помогает .. (:.

+0

anim.setFillAfter (true); используется для фиксации положения в анимации масштаба. но его не укусывает пользовательская анимация. anim.setFillAfter (false) также не работает :( –

+0

ooooppppssss :( –

0

вы можете установить слушатель, чтобы решить эту проблему

anim.setAnimationListener(new AnimationListener() { 
    @Override 
    public void onAnimationEnd(Animation arg0) { 
     image.setVisibility(View.GONE); 

    } 
}); 
image.startAnimation(mAnimation); 
+0

Как вызвать конечную позицию просмотра из моего идентификатора? –

+0

вы можете установить видимость изображения, если он дойдет до конца. –

+0

Значение журнала, работающее в конце анимации. image.setVisibility (View.GONE); не работает. –

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