在实现runnable时获取surfaceview的高度和宽度

时间:2017-08-29 05:05:42

标签: android surfaceview runnable

我在这里阅读了许多线程,讨论如何在运行时获取视图大小,但没有一个解决方案对我有用。

GameScreen.java

public class GameScreen extends AppCompatActivity{

// Declare an instance of SnakeView
GameView snakeView;

SurfaceHolder surface;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_game_screen);

    snakeView = (GameView) findViewById(R.id.GameView);
    surface = snakeView.getHolder();

    snakeView = new GameView(this, surface);

}

其中GameView是一个扩展surfaceview的视图类。以下是我的代码的简化版本,详细说明了该问题。我省略了run()方法和许多其他方法以避免混淆。

GameView.java

public class GameView extends SurfaceView implements Runnable {

public GameView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
}

public GameView(Context context,  AttributeSet attrs) {
    super(context, attrs);
    init();
}


public GameView(Context context, SurfaceHolder surfaceholder) {

    super(context);
    init();

    m_context = context;

    // Initialize the drawing objects
    m_Holder = surfaceholder;
    m_Paint = new Paint();
}

private void init(){
    surfaceHolder = getHolder();
    surfaceHolder.addCallback(new SurfaceHolder.Callback() {

        @Override
        public void surfaceCreated(SurfaceHolder holder) {

        }


        @Override
        public void surfaceChanged(SurfaceHolder holder,
                                   int format, int width, int height) {
         m_Screenheight = height;
         m_Screenwidth = width;
        }

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

但是,调用getWidth()getHeight()会导致应用崩溃。

我知道你必须等待视图布局,但我已经尝试了所有的建议,但我已经尝试了其他线程的所有建议都无济于事。

我主要缺乏理解来自于我在自定义类中使用实现Runnable的事实,所以我不确定在哪里可以使用getWidth或类似的方法。我是一般的Android新手,所以请在解决方案中明确。

编辑:

我应该提一下,我使用宽度和高度来形成一个网格,以在surfaceview中绘制。

编辑2:

参见修订后的代码。

1 个答案:

答案 0 :(得分:0)

如果您的表面是全屏,则可以获得屏幕尺寸。

public GameView(Context context, SurfaceHolder surfaceholder) {

    super(context);
    init();

    m_context = context;

    // Initialize the drawing objects
    m_Holder = surfaceholder;
    m_Paint = new Paint();
    DisplayMetrics displayMetrics = new DisplayMetrics();
    ((Activity)context).getWindowManager()
            .getDefaultDisplay()
            .getMetrics(displayMetrics);
    int height = displayMetrics.heightPixels;
    int width = displayMetrics.widthPixels;
    m_ScreenHeight= height;
    m_ScreenWidth= width;
}