2011-08-17 24 views
4

私は画面に触れる場所に円を描画する簡単なAndroidアプリケーションを作成したいと思います。これはView(ゆっくりと)で動作しますが、SurfaceViewでは動作しません。結果は変です - クリックすると、画像全体が動いています。別のスレッドから描画関数を呼び出そうとしましたが、結果は同じです。また、この奇妙な動作の別の例が見つかりました: http://android-er.blogspot.com/2010/05/android-surfaceview.html 私はAndroid 2.3.3、APIレベル10で動作します。AndroidのSurfaceViewが点滅

package com.samsung.sketchbook; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class SketchBook extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     BookView bookView = new BookView(this); 
     setContentView(bookView); 
    } 

    class BookView extends SurfaceView implements SurfaceHolder.Callback { 

     private SurfaceHolder holder; 
     private Paint paint = new Paint(); 
     private float x, y; 

     public BookView(Context context) { 
      super(context); 
      holder = getHolder(); 
      holder.addCallback(this); 
      paint.setColor(Color.WHITE); 
     } 

     public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 

     } 

     public void surfaceCreated(SurfaceHolder holder) { 
      Log.d("BookView", "surfaceCreated!"); 
     } 

     @Override 
     public void surfaceDestroyed(SurfaceHolder holder) { 

     } 

     @Override 
     public boolean onTouchEvent(MotionEvent motionEvent) { 
      x = motionEvent.getX(); 
      y = motionEvent.getY(); 
      Canvas canvas = holder.lockCanvas(null); 
      canvas.drawCircle(x, y, 3, paint); 
      holder.unlockCanvasAndPost(canvas); 
      return true; 
     } 

    } 

} 
+0

あなたは問題を解決しましたか? – MeLight

答えて

-1

SurfaceViewを使用しないことをお勧めします。

私の経験によれば、それはViewより良い解決策ではないと言われています。はい、Viewに拡張された実装クラスは、invalidate()を効果的に使用する方法がわからない場合に限り、ゆっくりとですが、です。

invalidate()(すべてのキャンバスを描画します)、invalidate(dirtyRect)(再描画したい矩形を定義します。キャンバスの残りの部分は以前と同じです)は非常に高速です。

関連する問題