2011-12-26 3 views
16

私は私がここで作っていますという一般的なプールがあります。アクティビティの外でスクリーンメトリックを取得する方法は?

public class FruitPool extends GenericPool<Sprite> { 
// =========================================================== 
// Constants   
// =========================================================== 

// ===========================================================   
// Fields   
// =========================================================== 
private final TextureRegion mTextureRegion; 
private Scene mScene; 
// ===========================================================   
// Constructors   
// =========================================================== 
public FruitPool(final TextureRegion pFruitTextureRegion, Scene mScene2) { 
    this.mTextureRegion = pFruitTextureRegion; 
    this.mScene = mScene2; 
} 
// ===========================================================   
// Getter & Setter   
// =========================================================== 

// ===========================================================   
// Methods for/from SuperClass/Interfaces   
// =========================================================== 
@Override 
protected Sprite onAllocatePoolItem() { 
    Random rand = new Random(); 

     //I want to get the Screens Display metrics here... 
    Sprite fruit = new Sprite(0, 0, this.mTextureRegion); 

    mScene.attachChild(fruit); 

    return fruit; 

} 

私はこのような画面表示メトリックを取得しようとしています。..

final Display display = getWindowManager().getDefaultDisplay(); 
    CAMERA_WIDTH = display.getWidth(); 
    CAMERA_HEIGHT = display.getHeight(); 

唯一の問題はあるが、私は姿を傾けることですアクティビティの外でこれを行う方法を教えてください。

これも可能ですか?またはSharedPreferenceなどを使用する必要がありますか?

答えて

29

最も単純なことは、コンテキストをFruitPoolコンストラクタに渡すことです。その後、Context.getWindowManager()を呼び出して、表示メトリックを取得できます。 (あなたは、コンストラクタの外にそのコードを実行したい場合は、context.getApplicationContext()を保存し、それはActivityコンテキストを渡された場合。)

EDIT:あなたは、このアプローチを採用してFruitPoolオブジェクトへActivityを渡している場合は、との寿命FruitPoolオブジェクトがアクティビティの有効期間を超えている可能性があります。は、アクティビティへの参照を保持しないでください。代わりにcontext.getApplicationContext()への参照を保持する必要があります。 getWindowManager()のみActivityのために定義されているので、あなたが代わりにWindowManagerを得るために、この式を使用することができます。

(WindowManager) context.getSystemService(Context.WINDOW_SERVICE) 
+0

私はそれについては決して考えなかった! –

+3

私はこれを試してみましたが、 "メソッドgetWindowManager()はコンテキストタイプのために定義されていません" –

+1

コンテキストの代わりにActicityオブジェクト(this)を渡します。コンテキストは基本的にアクティビティのスーパークラスであり、おそらくAtivityクラス –

83

事実にもかかわらず、ここで受け入れられた答えはそこにある、私は別の答えを投稿しています。その理由は次のとおりです。コンテキストの受け渡しは、アプリケーションから追加の不要な依存関係を作成してはならない場合がある(たとえば、適用されたライブラリなど)場合があるため、必ずしも良い考えではありません。コードは単純です:

DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics(); 

この方法の既知の制限が開発者にとって重要でない場合の解決方法を提供します。 Androidのドキュメントによれば:

getSystem()は、システム・リソース(NOアプリケーションリソース)へのアクセスを提供するグローバル共有リソースオブジェクトを返し、現在の画面用に設定されていない(寸法単位を使用することができない、ベースを変更しませんオンオリエンテーションなど)。

とにかく、DisplayMetricsのすべてのフィールドは、意味のある情報で埋められています。私の場合、私が後にしたのはDPIでした。そしてこの方法は文脈なしに私にDPIを提供します。

+3

私はこの答えが良いと思います。ありがとう、私のために働いた。 –

+0

それは私のために働いた。 –

+2

私は、この回答が問題の方法をよりよく収めることに同意します。 Thanks @ Stan – Etienne

2

ここは、現在の画面用に設定で表示メトリックを取得するための別の方法です。ここで

final DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();

1

私は画面の幅を取得するために書かれているAPIである、あなたは、ウィンドウシステム・サービスを取得するためにコンテキストを必要としています。 同様に身長を知ることができます。

int getWindowWidth() { 
    WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
    Display display = wm.getDefaultDisplay(); 
    Point size = new Point(); 
    display.getSize(size); 
    return size.x; 
} 
関連する問題