Как получить показатели экрана за пределами действия?
У меня есть общий пул, который я делаю здесь:
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 или что-то еще?
Ответы
Ответ 1
Простейшим было бы передать Контекст конструктору FruitPool. Затем он может получить показатели отображения, вызвав Context.getWindowManager()
. (Если вы хотите запустить этот код вне конструктора, сохраните context.getApplicationContext()
, если ему был передан контекст Activity.)
EDIT: если вы примете этот подход и передаете Activity
объекту FruitPool
, а время жизни объекта FruitPool
может превышать время жизни активности, то вы не должны хранить ссылку на Мероприятия. Вместо этого вы должны сохранить ссылку на context.getApplicationContext()
. Поскольку getWindowManager()
определяется только для Activity
, вы можете вместо этого использовать это выражение для получения WindowManager
:
(WindowManager) context.getSystemService(Context.WINDOW_SERVICE)
Ответ 2
Несмотря на то, что здесь есть приемлемый ответ, я отправляю еще один ответ. Причиной этого является следующее. Передача контекстов не всегда является хорошей идеей imho, потому что в некоторых случаях (например, в прикладных библиотеках, например) контексты не должны создавать дополнительные и ненужные зависимости из приложения. Код прост:
DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
Он обеспечивает решение для случаев, когда известные ограничения этого метода не важны для разработчика. Согласно документации Android:
getSystem()
возвращает глобальный общий ресурс ресурсов, который обеспечивает доступ только к системным ресурсам (без ресурсов приложения) и не настроен для текущего экрана (не может использовать единицы измерения, не изменяется в зависимости от ориентации и т.д.).
В любом случае все поля DisplayMetrics
заполняются содержательной информацией. В моем случае это был DPI, которым я был. И метод предоставляет мне DPI без контекста.
Ответ 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;
}