2012-02-07 144 views
0

這裏是導致屏幕如何計算android屏幕?

Android Screen

什麼我做的是創造FastRenderView.java從表面上看,然後從我LoadingScreen.java創建的位圖張貼到它的圖片。當然,加載屏幕是將被使用的許多屏幕之一。

我的問題是,我沒有在加載屏幕中計算正確的屏幕大小。以下是您需要幫助我的文件。

換句話說,我從Android遊戲中獲得屏幕大小。這發送到加載屏幕,然後製作整個遊戲的位圖。該位圖是帶有紅色加載欄的黑色。然後,我將加載屏幕上的位圖發送到快速渲染視圖,並將其發佈到屏幕上。但是,位圖比屏幕尺寸小得多。我該如何解決?

FastRenderView.java

package framework.impl; 

import android.graphics.Canvas; 
import android.graphics.Rect; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import framework.Game; 

public class FastRenderView extends SurfaceView implements Runnable { 

    Game game; 
    Thread renderThread = null; 
    SurfaceHolder holder; 
    volatile boolean running = false; 

    public FastRenderView(AndroidGame game) { 
     super(game); 
     this.game = game; 
     this.holder = getHolder(); 
    } 

    @Override 
    public void run() { 
     Rect dstRect = new Rect(); 
     long startTime = System.nanoTime(); 
     while(running) { 
      if(!holder.getSurface().isValid()) { 
       continue; 
      } 

      float deltaTime = (System.nanoTime() - startTime)/1000000000.0f; 
      startTime = System.nanoTime(); 

      game.getScreen().update(deltaTime); 
      game.getScreen().present(deltaTime); 

      // Method 1 // 
      //this.game.getScreen().setCanvas(this.holder.lockCanvas()); 
      //this.holder.unlockCanvasAndPost(this.game.getScreen().getCurrentCanvas()); 

      // Method 2 // 
      Canvas canvas = this.holder.lockCanvas(); 
      canvas.drawARGB(255, 150, 150, 10); 
      canvas.drawBitmap(this.game.getScreen().getCurrentScreen(), 0, 0, null); 
      holder.unlockCanvasAndPost(canvas); 

      try { 
       Thread.sleep(100); 
      } catch(Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public void resume() { 
     running = true; 
     renderThread = new Thread(this); 
     renderThread.start(); 
    } 

    public void pause() { 
     running = false; 
     while(true) { 
      try { 
       renderThread.join(); 
       break; 
      } catch(Exception e) { 
       // retry 
      } 
     } 
    } 
} 

LoadingScreen.java

import android.graphics.Bitmap; 
import android.graphics.Bitmap.Config; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Rect; 
import framework.Game; 
import framework.Screen; 

public class LoadingScreen extends Screen { 

    private int loadingPercent; 
    Canvas currentCanvas; 
    Bitmap currentScreen; 
    Paint paint; 

    public LoadingScreen(Game game) { 
     super(game); 
     this.currentScreen = Bitmap.createBitmap(this.game.getFrameWidth(), this.game.getFrameHeight(), Config.RGB_565); 
     this.game.getFastRenderView().run(); 
    } 

    @Override 
    public void update(float deltaTime) { 
     this.loadingPercent = 0; 
     Assets assets = game.getAssetsClass(); 
     this.loadingPercent = 33; 
     assets.plane = assets.fetchImage("image.png"); 
     this.loadingPercent = 66; 
     assets.plane_full = assets.fetchImage("image2.png"); 
     this.loadingPercent = 99; 
     //this.game.setScreen(new MainMenuScreen(this.game)); 
    } 

    @Override 
    public void present(float deltaTime) { 
     Bitmap picture = Bitmap.createBitmap(this.game.getFrameWidth(), this.game.getFrameHeight(), Config.RGB_565); 
     Canvas canvas = new Canvas(picture); 
     paint = new Paint(); 
     paint.setColor(Color.RED); 
     Rect darkRed = new Rect(10, 10, 4 * this.loadingPercent, 40); 
     canvas.drawRect(darkRed, paint); 
     this.currentCanvas = canvas; 
     this.currentScreen = picture; 
    } 

    @Override 
    public Bitmap getCurrentScreen() { 
     return this.currentScreen; 
    } 

    @Override 
    public void setCanvas(Canvas canvas) { 
     this.currentCanvas = canvas; 
    } 

    @Override 
    public Canvas getCurrentCanvas() { 
     return this.currentCanvas; 
    } 

    @Override 
    public void pause() { 

    } 

    @Override 
    public void resume() { 

    } 

    @Override 
    public void dispose() { 

    } 
} 

AndroidGame.java

package framework.impl; 

import android.app.Activity; 
import android.content.Context; 
import android.content.res.Configuration; 
import android.os.Bundle; 
import android.os.PowerManager; 
import android.os.PowerManager.WakeLock; 
import android.util.Log; 
import android.view.Window; 
import android.view.WindowManager; 
import framework.Audio; 
import framework.Game; 
import framework.Input; 
import framework.Screen; 
import tiny.bomber.Assets; 

public abstract class AndroidGame extends Activity implements Game { 

    FastRenderView renderView; 
    int frameWidth; 
    int frameHeight; 
    Input input; 
    Audio audio; 
    Screen screen; 
    Assets assets; 
    WakeLock wakeLock; 

    @Override 
    public void onCreate(Bundle savedInstaneState) { 
     super.onCreate(savedInstaneState); 

     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     boolean isLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; 
     frameWidth = isLandscape ? 480 : 320; 
     frameHeight = isLandscape ? 320 : 480; 

     float scaleX = (float) frameWidth/getWindowManager().getDefaultDisplay().getWidth(); 
     float scaleY = (float) frameHeight/getWindowManager().getDefaultDisplay().getHeight(); 

     // Setup Globabl Variables // 
     renderView = new FastRenderView(this); 
     this.assets = new Assets(this.getAssets(), this.getResources()); 
     //input = new Input(); 
     //audio = new Audio(); 
     setContentView(renderView); 

     PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
     wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "TinyBmoberGame"); 

     this.screen = this.getStartScreen(); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     wakeLock.acquire(); 
     screen.resume(); 
     renderView.resume(); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     wakeLock.release(); 
     renderView.pause(); 
     screen.pause(); 
    } 

    @Override 
    public void setScreen(Screen screen) { 
     this.screen = screen; 
    } 

    @Override 
    public Input getInput() { 
     return this.input; 
    } 

    @Override 
    public Audio getAudio() { 
     return this.audio; 
    } 

    @Override 
    public Screen getScreen() { 
     return this.screen; 
    } 

    @Override 
    public Assets getAssetsClass() { 
     return this.assets; 
    } 

    @Override 
    public FastRenderView getFastRenderView() { 
     return this.renderView; 
    } 

    @Override 
    public int getFrameWidth() { 
     return this.frameWidth; 
    } 

    @Override 
    public int getFrameHeight() { 
     return this.frameHeight; 
    } 

    public WakeLock getWakeLock() { 
     return this.wakeLock; 
    } 
} 

回答

0

安德烈亞斯詳細的展望回答了這個問題的一部分,所以+1「真正的」全屏幕那。

我最終使用這種方法來加載屏幕來縮放圖像。

private Bitmap scaleImage(Bitmap picture) { 
     Matrix matrix = new Matrix(); 
     matrix.postScale(this.game.getScaleX(), this.game.getScaleY()); 
     Bitmap resizedPicture = Bitmap.createBitmap(picture, 0, 0, picture.getWidth(), picture.getHeight(), matrix, true); 
     return resizedPicture; 
    } 

我不得不將以下內容添加到AndroidGame以獲得ScaleX和ScaleY。

@Override 
public float getScaleX() { 
    return this.scaleX; 
} 

@Override 
public float getScaleY() { 
    return this.scaleY; 
} 

然後在Android遊戲中,我更改了以下內容,以便正確縮放。

boolean isLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE; 
     frameWidth = isLandscape ? 480 : 320; // Based on my standard 
     frameHeight = isLandscape ? 320 : 480; 

     scaleX = (float) frameWidth/getWindowManager().getDefaultDisplay().getWidth(); 
     scaleY = (float) frameHeight/getWindowManager().getDefaultDisplay().getHeight(); 
     if(scaleX < 1 || scaleY < 1) { 
      scaleX = (float) getWindowManager().getDefaultDisplay().getWidth()/frameWidth; 
      scaleY = (float) getWindowManager().getDefaultDisplay().getHeight()/frameHeight; 
     } 

最後在LoadingScreen中,我將當前的方法更改爲以下內容。

@Override 
    public void present(float deltaTime) { 
     Bitmap picture = Bitmap.createBitmap(this.game.getFrameWidth(), this.game.getFrameHeight(), Config.RGB_565); 
     Canvas canvas = new Canvas(picture); 
     Log.i("Canvas", "Canvas Size: " + canvas.getWidth() + ", " + canvas.getHeight()); 
     paint = new Paint(); 
     paint.setColor(Color.RED); 
     Rect darkRed = new Rect((int) (480 * 0.02), (320/2), (int) (((480 - (480 * 0.02))/100) * this.loadingPercent), 50); 
     canvas.drawRect(darkRed, paint); 
     this.currentCanvas = canvas; 
     picture = this.scaleImage(picture); 
     this.currentScreen = picture; 
    } 

現在一切工作正常!!! :)

1

您可以使用

// display width 
int width = getResources().getDisplayMetrics().widthPixels 

// display height 
int height = getResources().getDisplayMetrics().heightPixels 

或者你可以實例化一個對象DisplayMetrics:

DisplayMetrics dm = new DisplayMetrics(); 
int width = dm.widthPixels; 
int height = dm.heightPixels; 

BTW:在某些設備上你不能設置,因爲硬件限制

+0

如何檢測限制以及如何處理這些限制? – Zeveso 2012-02-07 22:12:12

+0

我認爲它不可能。這些函數返回開發人員只能用於顯示事物的屏幕大小。 – Andreas 2012-02-07 22:15:39