1

Android アニメーション クラスを調べましたが、探しているものが表示されているかどうかわかりません。LayerDrawable の単一レイヤーに変換アニメーション (X 座標の変更) を追加できるかどうか疑問に思っていましたか? TranslateAnimation クラスを見つけましたが、それは ImageView 全体でしか機能しないようで、LayerDrawable の 1 つのレイヤーをアニメーション化したいだけです。何かアドバイス?前もって感謝します。

4

3 に答える 3

3

要するに:ValueAnimatorを使用して、そのドローアブルの境界を調整できます

詳細: レイヤー リスト ドローアブルと内部アイテム ドローアブル ( ) があり、レイアウトに があり ( )、このレイヤード ドローアブルがプロパティに割り当てられid:innerRedていると仮定すると、 ValueAnimatorを使用して境界を調整できます。以下の例のように、そのドローアブルのButtonid:btnWithDrawableBgbackgroundx

pos_animator.xml

<?xml version="1.0" encoding="utf-8"?>
<animator xmlns:andoird="http://schemas.android.com/apk/res/android"
  andoird:repeatCount="infinite"
  andoird:repeatMode="reverse"
  andoird:valueFrom="-100"
  andoird:valueTo="100"
  andoird:valueType="intType"
/>

MyActivity.java

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // our button with the drawable background
    Button btnWithBg = (Button) findViewById(R.id.btnWithDrawableBg);
    // the layered drawable
    final LayerDrawable layerDrawable = (LayerDrawable) btnWithBg.getBackground();
    // internal layer (item) drawable with id:innerRed
    final GradientDrawable innerRedShape = (GradientDrawable)layerDrawable.findDrawableByLayerId(R.id.innerRed);
    // our animator based on the xml above
    ValueAnimator posAnim = (ValueAnimator) AnimatorInflater.loadAnimator(
            mainLayout.getContext(), R.animator.pos_animator);

    posAnim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator animation) {
            // get current offset value and adjust drawable bounds
            int value = (Integer)animation.getAnimatedValue();
            Rect bounds = innerRedShape.copyBounds();//see Note below
            // here only manipulating x value
            bounds.offset(value, 0);
            innerRedShape.setBounds(bounds);
        }
    });
    posAnim.setTarget(innerRedShape);
    posAnim.start();
}

注:このSO 投稿に基づいてcopyBounds()(だけでなく)必須ですgetBounds().offset()

于 2014-02-25T12:06:46.933 に答える
0

私は自分の答えを見つけました... LayerDrawable が構成されると、実際にはレイヤーを操作できないようです。応答がないことから、私の質問はおそらく間違ったことを尋ねていると考え、LayerDrawable を使用するように再設計しましたが、アニメーションを個々の drawable/imageView オブジェクトとして生成し、各アニメーションの直前と直後に破棄しています。次に、imageView で ObjectAnimator を使用して、目的の画像の変換を実現します。そのため、LayerDrawable の個々のレイヤーをアニメーション化したいと思っている人がこれを読んだ場合に備えて、Animator クラスを使用できるように再設計してみてください。

于 2013-02-26T15:52:09.677 に答える