1

メインアクティビティクラスがあります。メインアクティビティの開始時に開始するSurfaceViewクラスもあります。

メインアクティビティにシークバーがあります。シークバーが生成するデータをSurfaceViewに送信して、変更するたびに表示したいと思います。

どうやってやるの?

ありがとう。

これが私のSurfaceViewクラスです。

public class SurfaceViewGauge extends SurfaceView implements SurfaceHolder.Callback{


 private MySurfaceThread thread;
 private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

 public SurfaceViewGauge(Context context) {
  super(context);
  // TODO Auto-generated constructor stub
  init();
 }

 public SurfaceViewGauge(Context context, AttributeSet attrs) {
  super(context, attrs);
  // TODO Auto-generated constructor stub
  init();
 }

 public SurfaceViewGauge(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  // TODO Auto-generated constructor stub
  init();
 }

  private void init(){
    getHolder().addCallback(this);
    thread = new MySurfaceThread(getHolder(), this);

    setFocusable(true); // make sure we get key events

    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(3);
    paint.setColor(Color.WHITE);

   }

 public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
  // TODO Auto-generated method stub

 }

 public void surfaceCreated(SurfaceHolder holder) {
  // TODO Auto-generated method stub
  thread.setRunning(true);
  thread.start();

 }

 public void surfaceDestroyed(SurfaceHolder holder) {
  // TODO Auto-generated method stub
  boolean retry = true;
  thread.setRunning(false);
  while (retry) {
   try {
    thread.join();
    retry = false;
   }
   catch (InterruptedException e) {
   }
  }
 }

 @Override
 protected void onDraw(Canvas canvas) {
  // TODO Auto-generated method stub

 }


}

そして、これが私のThreadクラスです。

    public class MySurfaceThread extends Thread {
 private SurfaceHolder myThreadSurfaceHolder;
 private SurfaceViewGauge myThreadSurfaceView;
 private boolean myThreadRun = false;

 public MySurfaceThread(SurfaceHolder surfaceHolder, SurfaceViewGauge surfaceView) {
  myThreadSurfaceHolder = surfaceHolder;
  myThreadSurfaceView = surfaceView;
 }

 public void setRunning(boolean b) {
  myThreadRun = b;
 }

 @Override
 public void run() {
  // TODO Auto-generated method stub
  while(myThreadRun){
   Canvas c = null;

   try{
    c = myThreadSurfaceHolder.lockCanvas(null);
    synchronized (myThreadSurfaceHolder){
     myThreadSurfaceView.onDraw(c);
    }
    sleep(0);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   finally{
    // do this in a finally so that if an exception is thrown
    // during the above, we don't leave the Surface in an
    // inconsistent state
    if (c != null) {
     myThreadSurfaceHolder.unlockCanvasAndPost(c);
    }
   }
  }
 }

}

4

2 に答える 2

1

コードに Handler.. を追加します。

public Handler mhandler;

public SurfaceViewGauge(Context context, Handler mhandler) 
{
super(context);
this.mhandler = mhandler;
// TODO Auto-generated constructor stub
init();
}

上記のコードでは、Handler オブジェクトを使用してコードを送信します。

于 2013-04-10T14:52:46.117 に答える
1

MainActivity で、シークバー値を保持する静的変数を宣言し、Surfaceview コードでハンドラーを使用してその静的変数を呼び出すだけです。

MainClass.seekValue;
于 2013-04-20T20:58:14.963 に答える