gpt4 book ai didi

android - 布局中的 SurfaceView

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:56:31 25 4
gpt4 key购买 nike

所以我进行了大量搜索,但似乎仍然无法找到我的 SurfaceView 无法显示的确切原因。这是我正在做的事情的一些背景知识:

我有一个水平设置的线性布局。它包含一个 ImageView,然后是一个垂直的线性布局,最后是另一个 ImageView。在垂直线性布局中,有三个基本要素:顶部的另一个 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 唯一一次显示是在我将 Activity 的 setContentView() 显式设置为 SurfaceView 时,取消了所有其他内容。

这是实际的 Activity :

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 的工作原理。看起来它们是我的 View 层次结构的一部分,但文档告诉我它们完全不同。

谢谢。

编辑 2012 年 4 月 17 日

提供更多信息:我的 xml UI Designer 在中间显示了一个大方框,用于我的扩展 SurfaceView 类,称为 MagnetView。我已经用红色勾勒出来了。 (Stackoverflow 还不允许我发布图片)

UI 设计器 View (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

}

}

最佳答案

我只是记下更改。

  1. 用 LinearLayout 替换 xml 中的表面 View 。

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

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

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

    surface.addView(new MagnetView(this));

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

关于android - 布局中的 SurfaceView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10185624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com