2010-12-30 8 views
11

まずは私の目標を説明しましょう。私はArcShapeのプロパティを変更するAnimationを作成しようとしています。 ArcShape'sコンストラクタは、startAnglesweepAngleの2つのフィールドをとります。 sweepAngleをアニメーション化して、画面上に連続的に縮小して表示されるようにします。AndroidカスタムArcShapeのアニメーション

あなたはPacManを想像してこのアニメーションを描くことができます。彼の口が閉じられたと想像してください。このアニメーションは、PacManがなくなるまで彼の上顎をもっと開くようなものです。

今、私はこれを実装する際にいくつか問題があります。まず、ArcShapeが作成されたら、それを変更する組み込みの方法はありませんsweepAngle。これは私の最初の質問に私をもたらします:ArcShapeをオーバーライドして、いくつかsetSweepAngleメソッドを実装する方法はありますか?または、私はそれぞれsweepAngleのためにnew ArcShapeを作成しなければなりませんか?

今度は第2号へ...第1号の解決策を見つけたとすれば、どうすればこのようにできますかAnimation?私はあなたがDrawableのを拡張したほうが良いと各呼び出しの掃引角度を変更し、対応する弧を描くようにドロー()関数をオーバーライドするかもしれないと思う

public class OpenPacman extends Animation { 
    public OpenPacman(float startAngle, float sweepAngle) { 
    mStartAngle = startAngle; 
    mSweepAngle = sweepAngle; 
    } 

    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 
    /* This represents the current sweepAngle */ 
    float currAngle = mStartAngle + ((mSweepAngle - mStartAngle) * interpolatedTime); 

    //Now I need to update the ArcShape's sweepAngle to currAngle. But HOW? 
    } 
} 

答えて

16

解決策が見つかりました。私はクラスを持っていますView私はこれをPacmanと呼ぶでしょうPacmanクラス内に私のカスタムAnimationをネストしました。これにより、私はPacmanクラスのmember variablesにアクセスできました。

public class Pacman extends View { 
    float mSweepAngle; 
    ... 
    //include constructors 
    //override onMeasure 
    ... 

    /* Here we override onDraw */ 
    @Override 
    protected void onDraw(final Canvas canvas) { 
    Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); 
    RectF oval = new RectF(canvas.getClipBounds()); 
    canvas.drawArc(oval, 0, mCurrAngle, true, p); 
    } 

    /* Here we define our nested custom animation */ 
    public class OpenPacman extends Animation { 
    float mStartAngle; 
    float mSweepAngle; 

    public OpenPacman (int startAngle, int sweepAngle, long duration) { 
     mStartAngle = startAngle; 
     mSweepAngle = sweepAngle; 
     setDuration(duration); 
     setInterpolator(new LinearInterpolator()); 
    } 

    @Override 
    protected void applyTransformation(float interpolatedTime, Transformation t) { 
     float currAngle = mStartAngle + ((mSweepAngle - mStartAngle) * interpolatedTime); 
     Pacman.this.mCurrAngle = -currAngle; //negative for counterclockwise animation. 
    } 
    } 
} 

今のカスタムアニメーションがコンテナクラスmCurrAngleを更新したときに、onDrawは、自動的に適切なArcShapeを描く、と呼ばれています。

+4

"invalidate();"を追加する必要がありました。 applyTransformationメソッドに渡すと、ビューは新しい角度で再描画されます。 – marmor

+0

指示に従っていますが、私のカスタムビューはUIに表示されません。完全なコードを投稿できますか? –

+2

私は知っている、永遠に古い投稿....しかし、私はどのようにこれが円弧をアニメーション表示されません。現在の角度を更新するだけで、それを再描画できますが、アニメーション化されません。だから...どうしてこれを正確にアニメーション化しましたか? –

1

:これは私が今持っているものの要旨です。描画は、通常、オブジェクトが更新されるたびに呼び出されます。描画するたびに新しいArcShapeを作成する必要があります。 アニメーションは、ビューやその他のUIコンポーネントで変換を行うためのものです。

ような何か:これは正しい軌道に乗ってあなたを取得

public class OpenPacman 
{ 

public OpenPacman(float startAngle, float sweepAngle) { 
    this.mStartAngle = startAngle; 
    this.mSweepAngle = sweepAngle; 
    this.wakaWaka = new ArcShape(this.startAngle, this.mSweepAngle); 
} 

public void draw(Canvas c){ 
    //Do drawing stuff here with the canvas 
} 

//Your other functions for calculating angle, etc and making the ArcShape changes 
//Can call these from inside draw function so that when the view that contains your 
//object calls draw, it updates correctly. 

public float mStartAngle; 
public float msweepAngle; 
private ArcShape wakaWaka; 
} 

希望。

関連する問題