Android SurfaceView 为空

标签 android surfaceview

我正在尝试制作一款简单的 2D Android 游戏。在这个游戏中,我试图制作一些按钮来控制角色,而角色显示在 SurfaceView 中。目前,SurfaceView 仅呈现黑屏。

这是我的 MainActivity,它扩展了 Activity:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    GameView gm = (GameView)findViewById(R.id.snake_surface);
    setContentView(R.layout.activity_main);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.layout.main, menu);
    return true;
}

GameView 类,它扩展了 SurfaceView:

   private HeroSprite hero;
   public GameView(Context context, AttributeSet attributeSet) {

         super(context, attributeSet);

         gameLoopThread = new GameLoopThread(this);

         getHolder().addCallback(new SurfaceHolder.Callback() {

                public void surfaceDestroyed(SurfaceHolder holder) {
                       boolean retry = true;
                       gameLoopThread.setRunning(false);
                       while (retry) {
                              try {
                                    gameLoopThread.join();
                                    retry = false;
                              } catch (InterruptedException e) {}
                       }
                }

                public void surfaceCreated(SurfaceHolder holder) {
                       createSprites();
                       createHero();
                       gameLoopThread.setRunning(true);
                       gameLoopThread.start();
                }


                public void surfaceChanged(SurfaceHolder holder, int format,int width, int height) {
                }
         });
         bmpBlood = BitmapFactory.decodeResource(context.getResources(), R.drawable.blood1);
   }


      private void createHero(){
       hero=(createHeroSprite(R.drawable.aslan));

   }
      private HeroSprite createHeroSprite(int resouce) {
          Bitmap bmp = BitmapFactory.decodeResource(getResources(), resouce);
          return new HeroSprite(this, bmp);
    }
   private void createSprites() {
         sprites.add(createSprite(R.drawable.tavsan));
         sprites.add(createSprite(R.drawable.fare));
         sprites.add(createSprite(R.drawable.sansar));
         sprites.add(createSprite(R.drawable.tavsan));
         sprites.add(createSprite(R.drawable.fare));
         sprites.add(createSprite(R.drawable.sansar));
         sprites.add(createSprite(R.drawable.tavsan));
         sprites.add(createSprite(R.drawable.fare));
         sprites.add(createSprite(R.drawable.sansar));
         sprites.add(createSprite(R.drawable.tavsan));
         sprites.add(createSprite(R.drawable.tavsan));

   }

   private Sprite createSprite(int resouce) {
         Bitmap bmp = BitmapFactory.decodeResource(getResources(), resouce);
         return new Sprite(this, bmp);
   }

   @Override
   protected void onDraw(Canvas canvas) {
         canvas.drawColor(Color.GREEN);
         for (int i = temps.size() - 1; i >= 0; i--) {
                temps.get(i).onDraw(canvas);
         }
         for (Sprite sprite : sprites) {
                sprite.onDraw(canvas);
         }
         hero.onDraw(canvas);
   }

   @Override
   public boolean onTouchEvent(MotionEvent event) {
         if (System.currentTimeMillis() - lastClick > 300) {
                lastClick = System.currentTimeMillis();
                float x = event.getX();
                float y = event.getY();
                synchronized (getHolder()) {
                       for (int i = sprites.size() - 1; i >= 0; i--) {
                              Sprite sprite = sprites.get(i);
                              if ((sprite).isCollition(x, y)) {
                                    sprites.remove(sprite);
                                    temps.add(new TempSprite(temps, this, x, y, bmpBlood));
                                    break;
                              }
                       }
                }
         }
         return true;
   }

我的 GameLoopThread 类,它扩展了 Thread

static final long FPS = 10;
private GameView view;
private boolean running = false;

public GameLoopThread(GameView view) {
    this.view = view;
}

public void setRunning(boolean run) {
    running = run;
}

@Override
public void run() {
    long ticksPS = 1000 / FPS;
    long startTime;
    long sleepTime;
    while (running) {
        Canvas c = null;
        startTime = System.currentTimeMillis();
        try {
            c = view.getHolder().lockCanvas();
            synchronized (view.getHolder()) {
                view.onDraw(c);
            }
        } finally {
            if (c != null) {
                view.getHolder().unlockCanvasAndPost(c);
            }
        }
        sleepTime = ticksPS - (System.currentTimeMillis() - startTime);
        try {
            if (sleepTime > 0)
                sleep(sleepTime);
            else
                sleep(10);
        } catch (Exception e) {
        }
    }
}

这是我的布局:

<LinearLayout  
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="30dp"
        android:gravity="center"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/score"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical|center_horizontal"
            android:text="Score:"
            android:textSize="20dp" />

        <Button
            android:id="@+id/btnThread"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical|center_horizontal" />

        <TextView
            android:id="@+id/max"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical|center_horizontal"
            android:layout_marginLeft="100dp"
            android:text="Max:"
            android:textSize="20dp" />
    </LinearLayout>

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="0.3" >

            <SurfaceView
                android:id="@+id/snake_surface"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:layout_weight="0.3" />

        </FrameLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:weightSum="1" >

            <Button
                android:id="@+id/butUp"
                android:layout_width="100dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal|center"
                android:text="UP" />

            <RelativeLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >

                <Button
                    android:id="@+id/butLeft"
                    android:layout_width="100dp"
                    android:layout_height="wrap_content"
                    android:layout_alignParentLeft="true"
                    android:layout_alignParentTop="true"
                    android:text="LEFT" />

                <Button
                    android:id="@+id/butRight"
                    android:layout_width="100dp"
                    android:layout_height="wrap_content"
                    android:layout_alignParentRight="true"
                    android:layout_alignParentTop="true"
                    android:text="RIGHT" />
            </RelativeLayout>

            <Button
                android:id="@+id/butDown"
                android:layout_width="100dp"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal|center"
                android:text="DOWN" />
        </LinearLayout>

     </LinearLayout>

</LinearLayout>

最佳答案

您在布局中的 View 是 SurfaceView,而不是 GameView。你需要改变它:

        <your.package.name.GameView
            android:id="@+id/snake_surface"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="0.3" />

并将 your.package.name 替换为包含 GameView 的包的实际名称。

另外,GameView gm = ... 行需要在 setContentView 之后。

最后,别忘了调用 gm.invalidate()当您修改了将要绘制的项目时!

关于Android SurfaceView 为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13733760/

相关文章:

java - 参数中的 NdefRecord.createMime 错误

java - Java/Android 中的 Rss feed 布局

android - 如何在 SurfaceView 上显示相机预览?

Android SurfaceView 模拟器 OpenGL 错误

android - 从相机预览中获取触摸像素的颜色

android - Bitmap处理时如何避免 "out of memory exception"?

java - Android VpnService 转发数据包

android - iBeacon、AltBeacon、*Beacon : What interoperability is legal, 并允许在 iOS 和 Android 上使用?

android - 在 Android 后台使用相机

java - SurfaceView 作为背景