布局中的SurfaceView

所以我做了很多search,但似乎无法find为什么我的SurfaceView不会显示的确切原因。 以下是我在做什么的背景:

我有一个水平设置的线性布局。 它包含一个ImageView,然后是一个垂直线性布局,最后是另一个ImageView。 在垂直线性布局中,有三件事是必不可less的:顶部的另一个ImageView,一个扩展的SurfaceView(称为MagnetView)和一个ImageView。

这里是xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" > <!-- Left Magnetrak --> <ImageView android:layout_width="wrap_content" android:layout_height="fill_parent" android:src="@drawable/vectorparts_01" android:adjustViewBounds="true" /> <!-- Middle Linear Layout --> <LinearLayout android:layout_width="0dip" android:layout_height="fill_parent" android:orientation="vertical" android:layout_weight="1"> <!-- Top Bar with Lifes and Score counter --> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:adjustViewBounds="true"> <ImageView android:adjustViewBounds="true" android:layout_width="fill_parent" android:layout_height="wrap_content" android:src="@drawable/vectorparts_22"/> <!-- Score counter --> <TextView android:id="@+id/myImageViewText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_marginRight="10dp" android:layout_marginTop="5dp" android:gravity="center" android:text="000000000000" android:textColor="#000000" /> <!-- Life1 --> <ImageView android:id = "@+id/life1" android:adjustViewBounds="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/vectorparts_13" android:layout_alignParentLeft="true" android:layout_marginLeft="5dp" android:layout_marginTop="1dp" android:gravity="center" /> <!-- Life2 --> <ImageView android:id = "@+id/life2" android:adjustViewBounds="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/vectorparts_13" android:layout_toRightOf="@id/life1" android:layout_marginTop="1dp" android:layout_marginLeft="1dp" android:gravity="center" /> <!-- Life3 --> <ImageView android:id = "@+id/life3" android:adjustViewBounds="true" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/vectorparts_13" android:layout_toRightOf="@id/life2" android:layout_marginTop="1dp" android:layout_marginLeft="1dp" android:gravity="center" /> </RelativeLayout> <!-- SurfaceView --> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/middlesurface"> </LinearLayout> <!-- Bottom Bar --> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:adjustViewBounds="true"> <ImageView android:adjustViewBounds="true" android:layout_width="fill_parent" android:layout_height="wrap_content" android:src="@drawable/vectorparts_02"/> </RelativeLayout> </LinearLayout> <!-- Right Magnetrak --> <ImageView android:layout_width="wrap_content" android:layout_height="fill_parent" android:src="@drawable/vectorparts_01" android:adjustViewBounds="true" /> 

本质上,我希望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如何工作。 看来他们是我的视图层次结构的一部分,但是然后文档告诉我他们完全不同。

谢谢。

编辑04/17/2012

为了提供更多信息:我的xml UIdevise器在我的扩展SurfaceView类的中间显示了一个大框,名为MagnetView。 我用红色概述了它。 (Stackoverflow将不允许我张贴图像)

UI Designer视图( http://img.androidcookie.com/android/tumblr_m2mmqvBNwW1qcreoco1_500.jpg)http://img.androidcookie.com/android/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 } } 

Related of "布局中的SurfaceView"

我只是放下了变化。

  1. 用LinearLayoutreplacexml中的表面视图。

      <LinearLayout android:id="@+id/middleSurface" android:layout_width="wrap_content" android:layout_height="wrap_content" /> 
  2. 获取线性布局的实例

    LinearLayout surface =(LinearLayout)findViewById(R.id.surface);

  3. 将表面视图的实例添加到LinearLayout

    surface.addView(新的MagnetView(this));

在setContentView(R.layout.main)之后应该执行2,3个步骤;

我会在Eclipse UIdevise器中检查布局,看是否所有东西都放在你想要的位置。 表面视图只是关于布局的普通视图。

如果我没有错,我觉得你的查询的方式是:你想要在xml中提到的东西在表面视图顶部显示/呈现其他视图元素。

如果你想在表面视图顶部的视图,你需要扩展它(AFAIK没有其他的方式)。 然后,您需要重写onDraw()方法,以在曲面视图上显示所需的所有内容。 你还需要得到一个SurfaceHolder的对象来获取canvas。

这是一个很好的链接显示,将图像视图放在表面视图之上: http : //www.droidnova.com/playing-with-graphics-in-android-part-ii160.html

  1. 从xml中移除表面视图并放置一个线性布局来代替它,并将一个id与它关联。
  2. 获取一个linearlayout的实例。
  3. 在这种情况下,将子视图添加到线性布局

    addView()

这解决了这个问题。

你有没有设置SurfaceView的背景? 我发现如果你设置了SurfaceView的背景,它将不会显示你在辅助线程上绘制的内容。

你可以尝试这种方式,移动setContentView(R.layout.main); super.onCreate(savedInstanceState);

 super.onCreate(savedInstanceState); setContentView(R.layout.main); midSurf = new MagnetView(this); LinearLayout midLL = new LinearLayout(this); midLL.findViewById(R.id.middlesurface); midLL.addView(midSurf);