2012-03-03 13 views
3

私はビュー上に線をアニメーション化したいと思っていました。例:(0,120)から始まり、最大100,120まで進行するプログレッシブライン。私はすでにplain canvas.drawLine()でこれを試しましたが、線を描いている間にアニメーションを適用できませんでした。 私が見たいのは、ビューに描画された一連の直線(長さの異なる)がビューにロードされた後です。私は静的な線としてそれらを望んでいません。私はキャンバスに描かれているときにこれらの線を見たいと思っていました。Androidで描画線をアニメ化する

シェイプドロアブルを使用し、anim/xmlsからアニメーションを適用するなど、いくつかのオプションを試しました。彼らのほとんどは私の問題を解決しませんでした。大規模なグーグルでは、ビューに直接適用されるアニメーションが表示されます。ここでは、私はビューに6行を持つことになり、私は別の色を持つ行のそれぞれをアニメーションする必要があるので、複数の画像ビューを作成したいと思います。

将来、私は行を上下に移動して色を変え、行のそれぞれに他の種類のアニメーションを行うことができます。

上記の制約を覚えておけば、同じようなカスタム実装を書く方法を教えてください。

答えて

0

よくcanvas.drawline(...)、またはcanvas.drawlines(...)を使用しているだけではなく、あなたのビューには線を表す変数があります。多分Pointなどのarraylistです。私は現在、私が作っているゲームで値を動かして線を描こうとしています。私は単にdrawline関数に入れた値を変更するだけで、値が変わると私の行はアニメーション化されます。しかし、ラインの傾斜が1に近づくとループが遅くなり、他のアニメーションも遅くなります。線をアニメートするときも同様の問題がありますか?またはあなたはそれらを引き出すことができないのですか?

+0

私のアニメーションが遅くなっていたのは、アニメーションの速度が遅い理由です.setMaskFilter – tantonj

+0

変数をポイントにしておくことは、キャビナスに描かれた線を保持することをお勧めします。私の主な問題は、線の描画中にアニメーションを行うことができないことです。先ほど言いましたように、キャンバスに描かれている線のアニメーションを見たいと思っていました。私はonDraw()メソッドでinvalidate()を呼び出すことによって現在アニメーションを達成しています。しかし、この解決策は非常に悪くて不調なようです。だから、私は現在、線を描き、ポイントが変数に格納されているのでラインを保持できる状態になっています。しかし、私は簡単な方法でライン上でいくつかのアニメーションを行うことができません.Invalidate()doesn '正しいと思われる –

0

あなたの問題はあなたのゲームループであるように、それは私が無効()事の作業を取得することができたことがないように私は、私の引き分けとupdateメソッドをループに糸を使用して...聞こえる...

その下に、それはあなたの更新を呼び出し、onTouchだけでオーバーライドするために、approprietly方法を描画します。このスレッドを使用して...

import android.graphics.Canvas; 
import android.view.SurfaceHolder; 

public class MainThread extends Thread { 


// desired fps 
private final static int MAX_FPS = 75; 
// maximum number of frames to be skipped 
private final static int MAX_FRAME_SKIPS = 0;  
// the frame period 
private final static int FRAME_PERIOD = 1000/MAX_FPS; 

// Surface holder that can access the physical surface 
private SurfaceHolder surfaceHolder; 
// The actual view that handles inputs 
// and draws to the surface 
private DrawView gamePanel; 

// flag to hold game state 
public boolean running; 
public void setRunning(boolean running) { 
    this.running = running; 
} 

public MainThread(SurfaceHolder surfaceHolder, DrawView gamePanel) { 
    super(); 
    this.surfaceHolder = surfaceHolder; 
    this.gamePanel = gamePanel; 
} 

@Override 
public void run() { 
    Canvas canvas; 

    long beginTime;  // the time when the cycle begun 
    long timeDiff;  // the time it took for the cycle to execute 
    int sleepTime;  // ms to sleep (<0 if we're behind) 
    int framesSkipped; // number of frames being skipped 

    sleepTime = 0; 

    while (running) { 
     canvas = null; 
     // try locking the canvas for exclusive pixel editing 
     // in the surface 
     try { 
      canvas = this.surfaceHolder.lockCanvas(); 
      synchronized (surfaceHolder) { 
       beginTime = System.currentTimeMillis(); 
       framesSkipped = 0; // resetting the frames skipped 
       // update game state 
       this.gamePanel.doUpdate(); 
       // render state to the screen 
       // draws the canvas on the panel 
       this.gamePanel.doDraw(canvas);    
       // calculate how long did the cycle take 
       timeDiff = System.currentTimeMillis() - beginTime; 
       // calculate sleep time 
       sleepTime = (int)(FRAME_PERIOD - timeDiff); 

       if (sleepTime > 0) { 
        // if sleepTime > 0 we're OK 
        try { 
         // send the thread to sleep for a short period 
         // very useful for battery saving 
         Thread.sleep(sleepTime);  
        } catch (InterruptedException e) {} 
       } 

       while (sleepTime < 0 && framesSkipped < MAX_FRAME_SKIPS) { 
        // we need to catch up 
        this.gamePanel.doUpdate(); // update without rendering 
        sleepTime += FRAME_PERIOD; // add frame period to check if in next frame 
        framesSkipped++; 
       } 
      } 
     } catch(ClassCastException cce) { 

     }finally { 
      // in case of an exception the surface is not left in 
      // an inconsistent state 
      if (canvas != null) { 
       surfaceHolder.unlockCanvasAndPost(canvas); 
      } 
     } // end finally 
    } 
} 

} 

surfaceviewがDrawViewと呼ばれ、この場合、あなたのsurfaceviewにクラスと呼ばmainthread作成されていますSurfaceview(DrawView)のonTouchメソッドを使用して、通常の方法でそれにアクセスします。これまでの理由で実行をfalseに設定したスレッドを停止するためです。

関連する問題