¿Cómo obtener métricas de pantalla fuera de una actividad?

Tengo una piscina genérica que estoy haciendo aquí:

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; } 

Estoy tratando de obtener las pantallas mostrar métricas como esta ..

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

El único problema es, es que no puedo resolver cómo hacer esto fuera de una actividad ..

¿Es esto posible? ¿O tendré que usar SharedPreference o algo así?

Lo más simple sería pasar un Contexto al constructor de FruitPool. A continuación, podría recuperar las métricas de visualización llamando Context.getWindowManager() . (Si desea ejecutar ese código fuera del constructor, guarde context.getApplicationContext() , en caso de que se haya pasado un contexto de actividad).

EDIT: si adopta este enfoque y está pasando una Activity al objeto FruitPool y la vida útil del objeto FruitPool puede exceder la duración de la actividad, no debe mantener una referencia a la actividad. Debe mantener una referencia a context.getApplicationContext() . Dado que getWindowManager() sólo se define para una Activity , puede utilizar esta expresión para obtener WindowManager :

 (WindowManager) context.getSystemService(Context.WINDOW_SERVICE) 

A pesar de que hay una respuesta aceptada aquí, estoy publicando otra respuesta. El razonamiento para esto es el siguiente. Pasar contextos no siempre es una buena idea imho, porque en algunos casos (como las bibliotecas aplicadas, por ejemplo) los contextos no deben crear dependencias adicionales e innecesarias desde una aplicación. El código es simple:

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

Proporciona una solución para casos en los que las limitaciones conocidas de este método no son importantes para un desarrollador. Según la documentación de Android:

getSystem() devuelve un objeto de recursos compartidos globales que proporciona acceso sólo a recursos del sistema (sin recursos de la aplicación) y no está configurado para la pantalla actual (no se pueden usar unidades de dimensión, no se modifica en función de la orientación, etc.).

De todos modos, todos los campos de DisplayMetrics se rellenan con información significativa. En mi caso, era DPI lo que yo buscaba. Y el método me proporciona DPI sin un contexto.

Esta es otra forma de obtener las métricas de visualización que están configuradas para la pantalla actual.

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

Esta es la api que he escrito para obtener el ancho de la pantalla, necesita un contexto para obtener el servicio del sistema de ventana. Del mismo modo puede obtener la altura.

 int getWindowWidth() { WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); Display display = wm.getDefaultDisplay(); Point size = new Point(); display.getSize(size); return size.x; } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.