0

非常に単純なものであることはわかっていますが、問題はわかりません。

私はLinearLayoutを持っています:

LinearLayout menuSlide = (LinearLayout) findViewById(R.id.menuSlide);
menuSlide.startAnimation(new ExpandAnimation(menuSlide, 0, (int) (screenWidth*0.7), 20));

そして ExpandAnimation クラス:

public class ExpandAnimation extends Animation implements Animation.AnimationListener{

    private View view;
    private static int ANIMATION_DURATION;
    private static final String LOG_CAT = "ExpandAnimation";
    private int lastWidth;
    private int fromWidth;
    private int toWidth;
    private static int STEP_SIZE=30;

    public ExpandAnimation(View v,int fromWidth, int toWidth, int duration){
        Log.v(LOG_CAT, "Entramos en el constructor del ExpandAnimation");
        this.view = v;
        ANIMATION_DURATION = 1;
        this.fromWidth = fromWidth;
        this.toWidth = toWidth;

        setDuration(ANIMATION_DURATION);
        setRepeatCount(20);
        setFillAfter(false);
        setInterpolator(new AccelerateInterpolator());
        setAnimationListener(this);
        startNow();
    }

    @Override
    public void onAnimationEnd(Animation animation) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onAnimationRepeat(Animation animation) {
        // TODO Auto-generated method stub
        Log.v(LOG_CAT, "Entra en el onAnimationRepeat");
        LayoutParams lyp = view.getLayoutParams();
        lyp.width = lastWidth += toWidth/20;
        view.setLayoutParams(lyp);

        Log.v(LOG_CAT,"El objeto: " + view.getId() + " tiene ahora de ancho: " + view.getWidth());
    }

    @Override
    public void onAnimationStart(Animation animation) {
        // TODO Auto-generated method stub
        Log.v(LOG_CAT, "Entra en el onAnimationStart");
        LayoutParams lyp = view.getLayoutParams();
        lyp.width = 0;
        view.setLayoutParams(lyp);
        lastWidth=0;
    }

}

OK、プログラムは ExpandAnimation のコンストラクターに到達しますが、それ以外には何もありません。onAnimationStart は決して起動されません。

私は何を間違っていますか?

4

1 に答える 1

2

私はあなたのコードを実行しませんでしたが、

public ExpandAnimation(View v,int fromWidth, int toWidth, int duration){
        Log.v(LOG_CAT, "Entramos en el constructor del ExpandAnimation");
      1.  this.view = v;
      2.   ANIMATION_DURATION = 1;
      3. this.fromWidth = fromWidth;
      4.  this.toWidth = toWidth;

        setDuration(ANIMATION_DURATION);
        setRepeatCount(20);
        setFillAfter(false);
        setInterpolator(new AccelerateInterpolator());
        setAnimationListener(this);
        startNow();
    }

期間を変数値に設定していませんでした。ANIMATION_DURATION = duration;また、ANIMATION_DURATION が 1 ミリ秒であるようなことを行うこともできます。アニメーションが発生しても、500 などに変更してみてください 変化する

view = v;
ANIMATION_DURATION = duration;
fromWidth = this.fromWidth;
toWidth = this.toWidth;

編集:コードによるアニメーション化は困難です。より簡単な方法は XML ファイルを使用することです。最初に res フォルダーの下にフォルダー名 anim を作成し、次に scale.xml という名前の xml ファイルを作成し、次の手順を実行します...

<set xmlns:android="http://schemas.android.com/apk/res/android"
      android:interpolator="@android:anim/accelerate_interpolator">
   <scale
      android:fromXScale="1"
      android:toXScale="1"
      android:fromYScale="0.1"
      android:toYScale="1.0"
      android:duration="500"
      android:pivotX="50%"
      android:pivotY="50%"
      android:startOffset="100" />
</set> 

次に、アクティビティで単に呼び出します

Animation a = AnimationUtils.loadAnimation(this, R.anim.scale);
((LinearLayout) findViewById(R.id.yourlayoutID)).startAnimation(a);
于 2012-08-17T16:44:59.957 に答える