如何在活动之外获取屏幕指标?

时间:2011-12-26 04:47:15

标签: android

我有一个我在这里制作的通用池:

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吗?

4 个答案:

答案 0 :(得分:93)

尽管这里有一个公认的答案,但我还是张贴了另一个答案。对此的推理如下。传递上下文并不总是一个好主意,因为在某些情况下(例如应用程序库),上下文不应该从应用程序构建额外的和不必要的依赖项。代码很简单:

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

它为此方法的已知限制对开发人员不重要的情况提供了解决方案。根据Android文档:

  

getSystem()返回一个全局共享的Resources对象,该对象只提供对系统资源的访问(没有应用程序资源),并且没有为当前屏幕配置(不能使用维度单位,不会根据方向更改等) )。

无论如何,DisplayMetrics的所有字段都填入了有意义的信息。就我而言,我追求的是DPI。并且该方法为我提供了没有上下文的DPI。

答案 1 :(得分:37)

最简单的方法是将Context传递给FruitPool构造函数。然后,它可以通过调用Context.getWindowManager()来检索显示指标。 (如果要在构造函数外部运行该代码,请保存context.getApplicationContext(),以防它传递给Activity上下文。)

编辑:如果你采用这种方法并将Activity传递给FruitPool对象,并且FruitPool对象的生命周期可能超过活动的生命周期,那么你< em>不得保留对活动的引用。您应该保留对context.getApplicationContext()的引用。由于getWindowManager()仅为Activity定义,因此您可以使用此表达式获取WindowManager

(WindowManager) context.getSystemService(Context.WINDOW_SERVICE)

答案 2 :(得分:6)

以下是另一种获取为当前屏幕配置 的显示指标的方法。

ALTER TABLE

答案 3 :(得分:2)

这是我为了获得屏幕宽度而编写的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;
}