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

cod*_*e22 19 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;

}
Run Code Online (Sandbox Code Playgroud)

我试图让屏幕显示像这样的指标..

    final Display display = getWindowManager().getDefaultDisplay();
    CAMERA_WIDTH = display.getWidth();
    CAMERA_HEIGHT = display.getHeight();
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,我无法弄清楚如何在Activity之外做这个.

这甚至可能吗?或者我必须使用SharedPreference或其他什么?

Sta*_*tan 98

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

DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
Run Code Online (Sandbox Code Playgroud)

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

getSystem() 返回一个全局共享的Resources对象,该对象仅提供对系统资源的访问权限(无应用程序资源),并且未针对当前屏幕进行配置(不能使用维度单位,不会根据方向更改等).

无论如何,所有领域DisplayMetrics都充满了有意义的信息.就我而言,我追求的是DPI.并且该方法为我提供了没有上下文的DPI.

  • 我认为这个答案更好.谢谢,为我工作. (3认同)
  • 我同意这个答案可以更好地解决问题.谢谢@Stan (2认同)
  • 这并不总是有效,特别是在支持窗口化和动态缩放显示的设备上。从[Resources.getSystem()的文档]](https://developer.android.com/reference/android/content/res/Resources.html#getSystem&amp;28%29)(添加了重点):“返回全局共享仅提供对系统资源(无应用程序资源)访问权限的资源对象,并且**未为当前屏幕配置(无法使用尺寸单位,不会根据方向发生变化,等等)**。” (2认同)

Ted*_*opp 39

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

编辑:如果您采用此方法并传递ActivityFruitPool对象,并且对象的生命周期FruitPool可能超过活动的生命周期,那么您不能保留对活动的引用.你应该保留一个参考context.getApplicationContext().由于getWindowManager()仅为a定义Activity,因此您可以使用此表达式来获取WindowManager:

(WindowManager) context.getSystemService(Context.WINDOW_SERVICE)
Run Code Online (Sandbox Code Playgroud)

  • 我试过这个,它说"方法getWindowManager()未定义类型Context" (4认同)
  • @ coder_For_Life22 D'哦.对于那个很抱歉.尝试`(WindowManager)context.getSystemService(Context.WINDOW_SERVICE)`. (4认同)

Tho*_*iot 5

这里的另一种方式来获得,显示指标配置为当前屏幕.

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