J'ai actuellement une vue personnalisée avec une ressource Drawable que je veux animer en la déplaçant d'une position à une autre. Je sais qu'il existe deux façons de mettre en œuvre PropertyAnimation
, vous pouvez le faire en utilisant ValueAnimation
ou ObjectAnimation
. Mais avec les deux, je n'ai trouvé aucune information sur Google Docs sur la façon de les utiliser avec un Drawable au lieu d'une vue. This est le seul exemple que je trouve qui est semblable à mon problème, et j'ai tryed à mettre en œuvre dans mon code:Comment animer un Drawable dans une vue personnalisée?
MainActivity
public class MainActivity extends AppCompatActivity {
private Button animate;
private CustomView mView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mView = new CustomView(MainActivity.this);
animate = (Button) findViewById(R.id.animate);
animate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mView.startAnimation();
}
});
}
}
CustomView
public class CustomView extends View {
private Drawable drawable;
private Rect drawableRect;
private int newPos;
public CustomView(Context context) {
super(context);
drawable = ContextCompat.getDrawable(context, R.drawable.my_drawable);
drawableRect= new Rect();
newPos = 0;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
...
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawableRect.left = 0;
drawableRect.top = newPos;
drawableRect.right = drawable.getIntrinsicWidth();
drawableRect.bottom = newPos + drawable.getIntrinsicHeight();
drawable.setBounds(drawableRect);
drawable.draw(canvas);
}
public void startAnimation() {
ValueAnimator animator = ValueAnimator.ofFloat(0, 200);
animator.setDuration(1500);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
newPos = ((Float) valueAnimator.getAnimatedValue()).intValue();
CustomView.this.invalidate();
}
});
animator.start();
invalidate();
}
}
Mais sans effet. La valeur de newPos
change correctement (cochée avec Logs) et l'écran est mis à jour (vérifié avec la mise à jour de surface) mais le Drawable ne bouge pas. Qu'est-ce que je fais mal? Espérant n'importe quelle aide.
Avez-vous vérifié que 'newPos' change pour quelque chose de différent de 0? Ajoutez des journaux ou des points de rupture et réessayez si vous ne l'avez pas fait. – Eselfar