如何获得屏幕尺寸?

时间:2015-06-03 00:20:15

标签: android android-canvas screen-size

我正在尝试将精灵图像设置为背景 并且我没有成功将图像大小设置为屏幕尺寸。

我正在尝试这个:

public class Game extends SurfaceView implements Runnable {
    private SurfaceHolder holder;
    private boolean isRunning = false;
    private Thread gameThread;
    private Sprite s;
    private int screenWidth;
    private int screenHeight;
    Canvas canvas;
    //  private Sprite[] sprites;

    private final static int MAX_FPS = 40; //desired fps
    private final static int FRAME_PERIOD = 1000 / MAX_FPS; // the frame period

    public Game(Context context) {
        super(context);

        holder = getHolder();
        holder.addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder holder) {
            }

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

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
            }
        });

        //====== not working
        //  Display display = ((Activity)context).getWindowManager().getDefaultDisplay();
        //   int sWidth = display.getWidth();
        // int sHeight = display.getHeight();

        //====== not working
        //   DisplayMetrics dm = new DisplayMetrics();
        //  ((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(dm);
        // int sWidth = dm.widthPixels;
        // int sHeight = dm.heightPixels;

        //====== not working
        // screenHeight=canvas.getHeight();
        // screenWidth=canvas.getWidth();

        s=new Sprite(0, 0, BitmapFactory.decodeResource(this.getResources(), R.mipmap.back));
    }

    /**
     * Start or resume the game.
     */
    public void resume() {
        isRunning = true;
        gameThread = new Thread(this);
        gameThread.start();
    }

    /**
     * Pause the game loop
     */
    public void pause() {
        isRunning = false;
        boolean retry = true;
        while (retry) {
            try {
                gameThread.join();
                retry = false;
            } catch (InterruptedException e) {
                // try again shutting down the thread
            }
        }
    }

    class Sprite {
        int x;
        int y;
        int directionX = 1;
        int directionY = 1;
        int speed = 10;
        int color = 0;
        Bitmap image;

        public Sprite(int x, int y) {
            this.x = x;
            this.y = y;
        }

        public Sprite(int x, int y, Bitmap image) {
            this(x, y);
            this.image = image;
        }

        public Sprite(int x, int y, Bitmap image, int color) {
            this(x, y, image);
            this.color = color;
        }
    }

    protected void step()
    {
        //blablabla
    }

    protected void render(Canvas canvas) {
        canvas.drawColor(Color.BLACK);
        Paint p = new Paint();

        canvas.drawBitmap(s.image,s.x,s.y,p);

    }

    @Override
    public void run() {
        while(isRunning) {
            // We need to make sure that the surface is ready
            if (! holder.getSurface().isValid()) {
                continue;
            }
            long started = System.currentTimeMillis();

            // update
            step();
            // draw
            canvas = holder.lockCanvas();

            if (canvas != null) {
                render(canvas);
                holder.unlockCanvasAndPost(canvas);
            }

            float deltaTime = (System.currentTimeMillis() - started);
            int sleepTime = (int) (FRAME_PERIOD - deltaTime);
            if (sleepTime > 0) {
                try {
                    gameThread.sleep(sleepTime);
                }
                catch (InterruptedException e) {
                }
            }
            while (sleepTime < 0) {
                step();
                sleepTime += FRAME_PERIOD;
            }
        }
    }
}

这个选项不起作用:

//====== not working
//  Display display = ((Activity)context).getWindowManager().getDefaultDisplay();
//   int sWidth = display.getWidth();
// int sHeight = display.getHeight();

//====== not working
//   DisplayMetrics dm = new DisplayMetrics();
//  ((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(dm);
// int sWidth = dm.widthPixels;
// int sHeight = dm.heightPixels;

//====== not working
// screenHeight=canvas.getHeight();
// screenWidth=canvas.getWidth();

那么我如何获得画布或当前屏幕尺寸? 并将Sprite.image设置为全屏?

2 个答案:

答案 0 :(得分:0)

尝试以像素为单位的尺寸

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;

答案 1 :(得分:0)

解码位图时尝试此操作。

    final int width = context.getResources().getDisplayMetrics().widthPixels;
    final int height = context.getResources().getDisplayMetrics().heightPixels;

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.outHeight = height;
    options.outWidth = width;

    Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher, options)