2011-02-06 18 views
0

私はかなり新しい開発者で、ライブ壁紙アプリを作ろうとしています。多くのアニメーションの中で、私の最初の目標は実際にはブラックホールである回転ビットマップを表示することです。ライブ壁紙Androidのアニメーション?

public class Painting extends Thread { 

    /** Reference to the View and the context */ 
    private SurfaceHolder surfaceHolder; 
    private Context context; 

    /** State */ 
    private boolean wait; 
    private boolean run; 

    /** Dimensions */ 
    private int width; 
    private int height; 

    /** Time tracking */ 
    private long previousTime; 

    boolean first = true; 

    Bitmap hole; 

    int degree; 
    public Painting(Context con , SurfaceHolder surf) 
    { 
      context = con; 
      surfaceHolder = surf; 
      this.wait = true; 
      Log.i("Live Test","UnInitialized"); 
      Drawable d = (con.getResources().getDrawable(R.drawable.vlack)); 
      hole = ((BitmapDrawable)d).getBitmap(); 
      hole.prepareToDraw(); 
      if(hole != null) 
      Log.i("Live Test","Initialized"); 
      run = true;wait = false; 
      degree = 0; 

    } 

    @Override 
    public void run() 
    { 
      while (run) { 
        this.run = true; 
        Canvas c = null; 


        Log.i("Live Test","Draw Color"); 
        while (run) { 
          try { 
            c = this.surfaceHolder.lockCanvas(); 
            synchronized (this.surfaceHolder) { 
              doDraw(c); 
            } 
          } finally { 
            if (c != null) { 
              this.surfaceHolder.unlockCanvasAndPost(c); 
              Log.i("Live Test","Unlocked And Posted"); 
            } 
          } 
          // pause if no need to animate 
          synchronized (this) { 
            if (wait) { 
              try { 
                wait(); 
              } catch (Exception e) { 
                Log.i("Live Test","Error wait"); 
              } 
            } 
          } 
        } 
      } 

    } 

    public void setSurfaceSize(int width, int height) { 
      this.width = width; 
      this.height = height; 
      synchronized(this) { 
        this.notify(); 
      } 
    } 


    /** 
* Pauses the livewallpaper animation 
*/ 
public void pausePainting() { 
    this.wait = true; 
    synchronized(this) { 
     this.notify(); 
    } 
} 

/** 
* Resume the livewallpaper animation 
*/ 
public void resumePainting() { 
    this.wait = false; 
    synchronized(this) { 
     this.notify(); 
    } 
} 

/** 
* Stop the livewallpaper animation 
*/ 
public void stopPainting() { 
    this.run = false; 
    synchronized(this) { 
     this.notify(); 
    } 
} 


    private void doDraw(Canvas canvas) { 
      if(first) 
      { 
        canvas.save(); 
        canvas.drawColor(0x60444444); 
        canvas.drawBitmap(hole, 80,80,null); 
        canvas.restore(); 
        first = false; 
      } 
      else 
      { 
      long currentTime = System.currentTimeMillis(); 
      long elapsed = currentTime - previousTime; 
      if (elapsed > 20) { 

      canvas.save(); 
      degree+= 5; 
      if(degree>359)degree = degree -358; 
      canvas.rotate((float) degree); 
      canvas.restore(); 
      Log.i("Live Test","rotated"); 
      } 
      previousTime = currentTime; 
    } 
    } 
} 

ビットマップを回転させて再度表示するようにしていますので、吸うように見えます。 また、基本的なonPause onResume関数を削除して、コードを簡単に理解できるようにしました。私は欠けている何か基本的なものがあることを知っているが、何?

+0

スレッドコードは、主な問題がここにあるように見えるため、投稿しました。 – JehandadK

答えて

0

Hmmm。これは今私がこれを困惑させるよりも時間がかかりますが、私は1つの提案があります。簡単なアプローチで壁紙をコーディングしてください。スレッドをスクラップし、キューブの例の行に沿って何かを実行します。つまり、postDelayedを使用して呼び出しをスケジュールする実行可能ファイルを作成します。お役に立てれば。ジョージ

+0

Georgeさんありがとうございます。私はこのことを解決しました。私は本当にあなたの時間を感謝します。 – JehandadK

関連する問題