2011-08-05 6 views
0

私は簡単なアニメーションでアプリケーションを開発したいと思います。 http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/Arcs.htmlカスタムコンポーネント - キャンバスアニメーションを操作する、または他の何かを使用する

マイコード:私は、元のソースの多くを使用している私は私のxmlファイルにこのように私の見解を使用してい

public class Animation extends Activity { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);   
    setContentView(R.layout.main); 
} 

private static class AnimView extends View {   
    private Paint myPaint;  
    private Paint myFramePaint; 
    private RectF bigOval; 
    private float myStart; 
    private float mySweep;   
    private static final float SWEEP_INC = 1; 

    public AnimView(Context context) { 
     super(context);  
     init(); 
    } 

    public AnimView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    private void init() { 
     myPaint = new Paint(); 
     myPaint.setAntiAlias(true); 
     myPaint.setStyle(Paint.Style.FILL); 
     myPaint.setColor(Color.RED); 
     bigOval = new RectF(40, 10, 280, 250);     
     myFramePaint = new Paint(); 
     myFramePaint.setAntiAlias(true); 
     myFramePaint.setColor(Color.BLACK); 
    } 

    private void drawArcs(Canvas canvas, RectF oval, boolean useCenter, Paint paint) { 
     canvas.drawRect(oval, myFramePaint); 
     canvas.drawArc(oval, myStart, mySweep, useCenter, paint); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) {   
     drawArcs(canvas, bigOval, true, myPaint);   
     myStart = -90;   
     mySweep -= SWEEP_INC; 
     invalidate(); 
    }  
}} 

<view 
class="go.android.Animation$AnimView" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
/> 

は、それが正常に動作します。私はカスタムアニメーションではないことを知っています。しかし、このアニメーションの速度をmsまたは秒で設定することは可能ですか?または、このアニメーションを停止する(OnClickやOnTouch Listenerなど)、このアニメーションがいつ終了したかを知ることができますか?

私はまた、最初の完全な円を取得したい、アニメーションの最後に - 円の欠如。このアニメーションの方向を変更するだけです。これは可能ですか?

私はフレームごとのアニメーションを使いたくありません。私は連続アニメーションを取得したい。類似のアニメーションを得る可能性はありますか?(速度の設定など) 私はまた、色だけでなく円形の描画可能なものをアニメーション化したいと思います。

ありがとうございます。私の英語力は申し訳ありません。

答えて

0

アニメーションを制御する方法がこれよりも優れているかもしれませんが(OpenGLを使用して調べることもできます)、既存のコードを使用してアニメーションの速度と方向を比較的簡単に変更できます。

速度は、SWEEP_INCフィールド(これは推測するスウィープ・インクリメントの略)によって制御されます。 onDraw()メソッドが呼び出されるたびに、ウェッジのサイズが1度ずつ増加します。アニメーションを5倍速くしたい場合は、SWEEP_INCを1ではなく5に設定します。アニメーションを半分にするには、SWEEP_INCを0.5に設定します。

アニメーションが終了するたびにアニメーションを反転させるフラグを設定することもできます。 addToCircleブール値を使用して、最後に到達するたびにコードを変更するようにコードを修正しました。

public class Animation extends Activity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 

    private static class AnimView extends View {   
     private Paint myPaint;  
     private Paint myFramePaint; 
     private RectF bigOval; 
     private float myStart; 
     private float mySweep;   
     private float SWEEP_INC = 1; 
     //Use this flag to control the direction of the arc's movement 
     private boolean addToCircle = true; 

     public AnimView(Context context) { 
      super(context);  
      init(); 
     } 

     public AnimView(Context context, AttributeSet attrs) { 
      super(context, attrs); 
      init(); 
     } 

     private void init() { 
      myPaint = new Paint(); 
      myPaint.setAntiAlias(true); 
      myPaint.setStyle(Paint.Style.FILL); 
      myPaint.setColor(Color.RED); 
      bigOval = new RectF(40, 10, 280, 250);     
      myFramePaint = new Paint(); 
      myFramePaint.setAntiAlias(true); 
      myFramePaint.setColor(Color.BLACK); 
     } 

     private void drawArcs(Canvas canvas, RectF oval, boolean useCenter, Paint paint) { 
      canvas.drawRect(oval, myFramePaint); 
      canvas.drawArc(oval, myStart, mySweep, useCenter, paint); 
     } 

     public void setIncrement(float newIncrement) 
    { 
     SWEEP_INC = newIncrement; 
    } 

     @Override 
     protected void onDraw(Canvas canvas) { 
      drawArcs(canvas, bigOval, true, myPaint);   
      myStart = -90; 
      //If the arc is currently getting bigger, decrease the value of mySweep 
      if(addToCircle) 
      { 
       mySweep -= SWEEP_INC; 
      } 
      //If the arc is currently getting smaller, increase the value of mySweep 
      else 
      { 
       mySweep += SWEEP_INC; 
      } 
      //If the animation has reached the end, reverse it 
      if(mySweep%360 == 0) 
      { 
       addToCircle = !addToCircle; 
      } 
      invalidate(); 
     }  
    } 
} 

EDIT あなたはSWEEP_INCからfinalstatic修飾子を削除する場合は、私が追加したsetIncrement(float newIncrement)機能を使用して、実行時にアニメーションの速度を変更することができます。

アニメーションを停止するには、setIncrement(0)を呼び出します。

しかし、私はonDrawが呼び出される一定の割合はないと思います。だから私はこのアニメーションに秒単位の時間を割り当てる方法は知らない。そのためには、もっと洗練されたアニメーションの方法を調べることができます。

+0

カスタムAndroidレイアウトでOpenGLの要素を使用することは可能ですか?この質問の私の例と同様の方法で - いくつかのビューのように? – woyaru

+0

カスタム[GLSurfaceView](http://developer.android.com/reference/android/opengl/GLSurfaceView.html)を作成することができます。しかし、今私はそれについて考えて、それはおそらくそのような小さな規模で何かのために価値がないです。ただ1つの円弧についてはこれでうまくいくはずです。開発者は、あなたがリンクしたサンプルコードを書いたときに確信していました。 – theisenp

+0

はい、これは小規模です。しかし、私は単純なアニメーションだけでなく、それを停止する方法、時間を秒単位で変更したり、いくつかの描画可能なもので管理したりしたいだけです。私は修正している。 – woyaru

関連する問題