我想使用java从xml布局更改为surfaceview

时间:2012-07-22 22:44:44

标签: android xml eclipse surfaceview

好的,所以我使用xml来设置以下java代码支持的菜单

package starting.rt;

import java.util.List;
import java.util.Random;

import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class Menu extends Activity implements OnClickListener{

    View.OnTouchListener gestureListener;

    TextView display;
    Button begin;
    Button random;
    Button game;

    TextView counter;

    Button next;
    Button previous;
    Button moreapps;
    Button rate;

    Random myRandom;




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        setContentView(starting.rt.R.layout.menu);

        begin = (Button) findViewById(starting.rt.R.id.Begin);
        random = (Button) findViewById(starting.rt.R.id.Random);
        display = (TextView) findViewById(starting.rt.R.id.tvResults);
        counter = (TextView) findViewById(starting.rt.R.id.tvCounter);
        next = (Button) findViewById(starting.rt.R.id.Next);
        previous = (Button) findViewById(starting.rt.R.id.Previous);
        moreapps = (Button)findViewById(R.id.More);
        rate = (Button) findViewById(R.id.rate);
        game = (Button) findViewById(R.id.game);

//       display.setOnTouchListener(this.gestureListener);



begin.setOnClickListener(new View.OnClickListener() {

    public void onClick(View v) {

        Intent openStartingPoint = new Intent("starting.rt.RelationshipTipsActivity");
        startActivity(openStartingPoint);

    }});

moreapps.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {


    Intent goToMarket; 
    goToMarket = new Intent(Intent.ACTION_VIEW, Uri.parse("market://search?q=pub:\"Wompa\"")); 
    startActivity(goToMarket); 
    }});

game.setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {


    Intent openStartingPoint = new Intent("starting.rt.GameView");
    startActivity(openStartingPoint);
    }});


    rate.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            Intent i = new Intent(Intent.ACTION_VIEW);
            i.setData(Uri.parse("market://details?id=" + getPackageName()));
            startActivity(i);
        }});}

    public void onClick(View v) {
        // TODO Auto-generated method stub

    }

}

现在应该发生的事情就是当他们点击游戏时会启动一个名为GameView的新java类,它会在点击时崩溃。每个其他按钮都有效。

这是来自GameView的代码

package starting.rt;
import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class GameView extends SurfaceView {
       private GameLoopThread gameLoopThread;
       private List<Sprite> sprites = new ArrayList<Sprite>();
       private List<TempSprite> temps = new ArrayList<TempSprite>();
       private long lastClick;
       private Bitmap bmpBlood;




       public GameView(Context context) {
             super(context);
             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();
                           gameLoopThread.setRunning(true);
                           gameLoopThread.start();
                    }


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

       private void createSprites() {
             sprites.add(createSprite(R.drawable.bad1));
//             sprites.add(createSprite(R.drawable.bad2));
//             sprites.add(createSprite(R.drawable.bad3));
//             sprites.add(createSprite(R.drawable.bad4));
//             sprites.add(createSprite(R.drawable.bad5));
//             sprites.add(createSprite(R.drawable.bad6));
//             sprites.add(createSprite(R.drawable.good1));
//             sprites.add(createSprite(R.drawable.good2));
//             sprites.add(createSprite(R.drawable.good3));
//             sprites.add(createSprite(R.drawable.good4));
//             sprites.add(createSprite(R.drawable.good5));
//             sprites.add(createSprite(R.drawable.good6));
       }

       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.BLACK);
             for (int i = temps.size() - 1; i >= 0; i--) {
                    temps.get(i).onDraw(canvas);
             }
             for (Sprite sprite : sprites) {
                    sprite.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;
       }
}

GameView为游戏的某些部分调用了一些其他的类,但它在崩溃之前就崩溃了。我认为它正在崩溃,因为它正在从xml布局切换到java surfaceview。帮助将不胜感激:)谢谢!

1 个答案:

答案 0 :(得分:0)

首先,如果您的应用崩溃,您应该始终在问题中发布堆栈跟踪,Logcat除外。

您无法直接启动SurfaceView,而您的自定义SurfaceView必须像安卓系统中的任何其他视图一样嵌入Activity。例如:

public class GameViewActivity extends Activity {

     @Override
     public void onCreate(Bundle savedInstance) {
          super.onCreate(savedInstance);
          setContentView(new GameView(this));
     }   

}