0

私は現在、ある場所から別の場所に移動するためにアニメーション化したい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の値が正しく変更され(ログでチェックされています)、画面が更新されます(面更新でチェックされます)が、ドロアブルは移動しません。私は間違って何をしていますか?助けを求めて

+0

「newPos」が0とは異なる値に変更されていることを確認しましたか?いくつかのログやブレークポイントを追加し、それ以外の場合はもう一度やり直してください。 – Eselfar

答えて

0

周恩旭が最終的に解決に至りました。

mView = new CustomView(MainActivity.this); 

、そのオブジェクト参照を使用してアニメーション化しようとしている:私はCustomViewへの新しい参照を作成していたので、私はMainActivityで愚かな誤りをしていました。これを置き換えることで解決しました:

2

CustomViewというコードを実行しようとすると、効率的です。アニメーションがあります。

startAnimationメソッドを実行してもよろしいですか?

NoteCustomViewstartAnimation()を追加すると、UIの読み込みが完了したらアニメーションが表示されます。

以下のコードでは、私はdrawableとしてic_launcherを使用しています。そして、NoteCustomViewをアクティビティのレイアウトxmlに追加します。

public class NoteCustomView extends View { 

    private Drawable drawable; 
    private Rect drawableRect; 
    private int newPos; 

    public NoteCustomView(Context context) { 
     this(context, null); 

    } 

    public NoteCustomView(final Context context, @Nullable final AttributeSet attrs) { 
     super(context, attrs); 
     drawable = ContextCompat.getDrawable(context, R.mipmap.ic_launcher_round); 
     drawableRect= new Rect(); 
     newPos = 0; 
     startAnimation(); 
    } 

    @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(); 
       NoteCustomView.this.invalidate(); 
      } 
     }); 

     animator.start(); 
     invalidate(); 

    } 

} 
+0

これで、このようにアニメーションは機能しますが、アクティビティから 'startAnimation()'を呼び出すと動きません。私の更新されたコードを見てください。 –

+0

私のやり方では、xmlを使用しています。効率的です。アクティビティの 'onCreate()'に 'addView(mView)'を追加しなかったのでしょうか? –

+0

onCreate()に 'addView(mView)'を追加するのはなぜですか?ビューはすでに 'setContentView()'メソッドで描画されています。私は、アクティビティからアニメーションを開始したいので、カスタムビューへの参照だけが必要ですが、これはうまくいかないようです。 –

関連する問題