在Android中,无法在Surface Holder中获取屏幕宽度和高度?

3

我是Android新手,需要获取屏幕尺寸,以下是我的代码:

package com.piyush.droidz;

import android.app.Activity;
import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import com.piyush.droidz.model.boy;

public class MainGamePanel extends SurfaceView implements SurfaceHolder.Callback {

private static final String TAG = MainGamePanel.class.getSimpleName();

private GameThread td;
private boy b1;
private int s_width;
private int s_height;

public MainGamePanel(Context context) {
    super(context);
    getHolder().addCallback(this);
    Log.d(TAG, "Screen width=" + s_width);
    b1 = new boy(BitmapFactory.decodeResource(getResources(), R.drawable.boy), 50, 50);
    td = new GameThread(getHolder(), this);
    setFocusable(true);
}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    s_width = getHolder().getSurfaceFrame().width();
    Log.d(TAG, "Present Screen width=" + s_width);
}

@Override
public void surfaceCreated(SurfaceHolder holder) {
    td.setRunning(true);
    td.start();
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    boolean retry = true;
    td.setRunning(false);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_DOWN) {
        b1.handleActionDown((int)event.getX(), (int)event.getY());

        if (event.getY()>getHeight()-50) {
            td.setRunning(false);
            ((Activity) getContext()).finish();
        }
        else {
            Log.d(TAG, "Coordinates: X="+event.getX()+", Y="+event.getY());
        }
    }

    if (event.getAction()==MotionEvent.ACTION_MOVE) {
        if (b1.isTouched()) {
            b1.setX((int)event.getX());
            b1.setY((int)event.getY());
        }
    }

    if (event.getAction()==MotionEvent.ACTION_UP) {
        b1.setTouched(false);
    }
    return true;
}

@Override
protected void onDraw(Canvas canvas) {
    canvas.drawColor(Color.parseColor("#ff0000"));
    b1.draw(canvas);
}

在第一个日志标签中,它显示0,而在第二个日志标签中,它显示模拟器的准确宽度。我已经尝试在构造函数之前使用getHolder().getSurfaceFrame().width() 初始化 "s_width",但仍然是 0。还尝试过使用WindowManagergetwindowManager(),但 IDE 在此类中无法识别它们。以下是我的活动类:

package com.piyush.droidz;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;

public class DroidzActivity extends Activity {

MainGamePanel mgp;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mgp = new MainGamePanel(this);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(mgp);
}

}

please help!

1个回答

3

你试过吗?

DisplayMetrics metrics = new DisplayMetrics();
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
windowManager.getDefaultDisplay().getMetrics(metrics);

您需要使用上下文来获取WindowManager。请参阅文档http://developer.android.com/reference/android/view/WindowManager.html

最好在构造函数内完成上述操作。

public MainGamePanel(Context context) {}

希望能对您有所帮助。 :)

1
非常感谢,伙计,它对我有用,我刚从度量中获取了widthPixels。最后再帮我一个忙,只是为了信息,它会在API 13及以上版本上工作吗?好吧,在我的模拟器上,它已经在API 17上运行了。 - piyxxx12

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接