【问题标题】:How to get Screen metrics outside an Activity?如何在活动之外获取屏幕指标?
【发布时间】:2012-01-27 19:29:15
【问题描述】:

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

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();

唯一的问题是,我无法弄清楚如何在 Activity 之外执行此操作..

这甚至可能吗?还是我必须使用 SharedPreference 之类的?

【问题讨论】:

    标签: android


    【解决方案1】:

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

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

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

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

    不管怎样,DisplayMetrics 的所有字段都填写了有意义的信息。就我而言,我追求的是 DPI。该方法为我提供了没有上下文的 DPI。

    【讨论】:

    • 我同意这个答案更适合这个问题。谢谢@Stan
    • 这也适用于我在 Layout.onMeasure() 中需要屏幕宽度的地方,这意味着 Android Studio 预览版继续工作。
    • 这并不总是有效,尤其是在支持窗口和动态缩放显示的设备上。来自the docs for Resources.getSystem()(强调添加):“返回一个全局共享资源对象,该对象仅提供对系统资源(无应用程序资源)的访问,并且没有为当前屏幕配置(不能使用维度单位,不改变基于方向等)。”
    • @TedHopp 您的评论只是重复了我在答案中已经提到的内容。
    • 是的,确实如此。评论的重点是强调。您的答案有免责声明“对于这种方法的已知限制不重要的情况”。然而,文档特别指出不能使用尺寸单位,并且 OP 特别想要尺寸单位。那么什么时候限制不重要呢?
    【解决方案2】:

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

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

    (WindowManager) context.getSystemService(Context.WINDOW_SERVICE)
    

    【讨论】:

    • 很好的答案!我从来没想过!
    • 我试过了,它说“方法 getWindowManager() 未定义类型 Context”
    • 传递 Acticity 对象 (this) 而不是 context 。 context 基本上是活动的超类,可能是在 Ativity 类中定义的 getWindowManager()
    • @coder_For_Life22 哦。对于那个很抱歉。试试(WindowManager) context.getSystemService(Context.WINDOW_SERVICE)
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      这是我写的获取屏幕宽度的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;
      }
      

      【讨论】:

        猜你喜欢
        • 2022-06-20
        • 2019-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多