Подтвердить что ты не робот

Как получить показатели экрана за пределами действия?

У меня есть общий пул, который я делаю здесь:

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 или что-то еще?

4b9b3361

Ответ 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;
}