【问题标题】:Pass data from main activity to SurfaceView thread using a seek bar使用搜索栏将数据从主要活动传递到 SurfaceView 线程
【发布时间】:2012-11-19 22:30:08
【问题描述】:

我有一个主 Activity 类,我还有一个 SurfaceView 类,它在我的主 Activity 开始时启动。

我在主要活动中有一个搜索栏。我想将搜索栏产生的任何数据发送到 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

 }


}

这是我的线程类:

    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);
    }
   }
  }
 }

}

【问题讨论】:

    标签: android multithreading surfaceview


    【解决方案1】:

    在您的 MainActivity 中声明一个静态变量,该变量将保存 seekbar 值,并在您的表面视图代码中借助处理程序调用该静态变量 例如

    MainClass.seekValue;
    

    【讨论】:

      【解决方案2】:

      在您的代码中,添加 Handler..

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

      以上代码中,使用Handler对象发送代码。

      【讨论】:

        猜你喜欢
        • 2017-08-25
        • 1970-01-01
        • 1970-01-01
        • 2017-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多