SurfaceView в макете

Итак, я провел много поисков, но до сих пор не могу найти точную причину, по которой мой SurfaceView не отображается. Вот небольшая предыстория относительно что я делаю:

У меня есть линейный макет, который установлен горизонтально. Он содержит ImageView, затем вертикальный Linear Layout и, наконец, еще один ImageView. В вертикальной линейной компоновке есть три важные вещи :еще один ImageView вверху, расширенный SurfaceView (под названием MagnetView )и ImageView под ним.

Вот xml:



 

 

        


    
    

    

    
    

    
     

     
     

     
     

    

    
    

    

        
     

    


    





   

По сути, я хочу, чтобы MagnetView отображался (или проделывал дыру )там, где я поместил его в макете. Но не отображает. Фактически, мой SurfaceView отображается только тогда, когда я явно устанавливаю setContentView ()активности в SurfaceView, отменяя все остальное.

Вот собственно действие:

public class Magnetraks extends Activity {

MagnetView midSurf;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    midSurf = new MagnetView(this);
    LinearLayout midLL = new LinearLayout(this);

    midLL.findViewById(R.id.middlesurface);
    midLL.addView(midSurf);

    setContentView(R.layout.main);

    //Debugging purposes: run to see if middleSurface view is showing up when on its own.
    //setContentView(midSurf);


}

@Override
protected void onResume() {
 // TODO Auto-generated method stub
 super.onResume();
 midSurf.resume();
}

@Override
protected void onPause() {
 // TODO Auto-generated method stub
 super.onPause();
 midSurf.pause();
}

Должен ли я размещать SurfaceView вверху XML-файла моего макета?Есть ли дополнительные атрибуты, которые я должен установить? Могу ли я просто наложить SurfaceView на все остальное, сделать его полупрозрачным и рисовать то, что мне нужно? Любая помощь будет принята с благодарностью, так как я не могу понять, как работают SurfaceViews. Кажется, что они являются частью моей иерархии представлений, но документация говорит мне, что они совершенно разные.

Спасибо.

РЕДАКТИРОВАТЬ 17.04.2012

Немного дополнительной информации :Мой xml UI Designer показывает большое поле посередине для моего расширенного класса SurfaceView, называемого MagnetView. Я обвел его красным. (Stackoverflow пока не позволяет мне публиковать изображения)

Представление конструктора пользовательского интерфейса(http://24.media.tumblr.com/tumblr_m2mmqvBNwW1qcreoco1_500.jpg) http://24.media.tumblr.com/tumblr_m2mmqvBNwW1qcreoco1_500.jpg

Вот класс MagnetView (SurfaceView ):

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MagnetView extends SurfaceView implements Runnable, SurfaceHolder.Callback{
Thread mThread;
SurfaceHolder mSurfaceHolder;
volatile boolean running = false;

//Creates new surface view as well as a new surfaceholder, which allows access to the surface
public MagnetView (Context context){
    super(context);

    mSurfaceHolder = getHolder();
            mSurfaceHolder.addCallback(this);
    //this.setZOrderOnTop(true);
    //getHolder().setFormat(PixelFormat.TRANSLUCENT);


}

public void resume(){
    running = true;
    mThread = new Thread(this);
    mThread.start();
}

public void pause(){
       boolean retry = true;
       running = false;
       while(retry){
        try {
         mThread.join();
         retry = false;
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
       }
}

@Override
public void run() {
  // TODO Auto-generated method stub
    while(running){
        if(mSurfaceHolder.getSurface().isValid()){
            Canvas canvas = mSurfaceHolder.lockCanvas();
            //... actual drawing on canvas

            canvas.drawARGB(100, 255, 255, 80);

            mSurfaceHolder.unlockCanvasAndPost(canvas);
        }
    }
}


@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
    // TODO Auto-generated method stub

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    // TODO Auto-generated method stub
    this.resume();

}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    // TODO Auto-generated method stub

}

}

9
задан akappel 18 April 2012 в 17:22
поделиться