私は現在、ある場所から別の場所に移動するためにアニメーション化したいDrawableリソースを持つカスタムビューを持っています。私はPropertyAnimation
を実装する2つの方法があることを知っています、あなたはまたはObjectAnimation
を使ってそれを行うことができます。しかし両方とも私はGoogleのドキュメントで、Viewの代わりにDrawableでそれらを使用する方法についての情報は見つかりませんでした。 Thisが、私はそれが私の問題に似ていた、と私は私のコードでそれを実装するためにしようと試みてきた唯一の例である:Drawableをカスタムビューでアニメーション化する方法は?
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();
}
}
しかし効果はありません。 newPos
の値が正しく変更され(ログでチェックされています)、画面が更新されます(面更新でチェックされます)が、ドロアブルは移動しません。私は間違って何をしていますか?助けを求めて
「newPos」が0とは異なる値に変更されていることを確認しましたか?いくつかのログやブレークポイントを追加し、それ以外の場合はもう一度やり直してください。 – Eselfar