Мобильные платформыФорумОбщее

Как узнать _физический_ размер экрана на Андроиде?

Страницы: 1 2 3 Следующая »
#0
16:12, 20 сен 2012

Ну или не размер, а плотность пикселей. Чтобы размер изображения на всех устройствах был одинаковый (в сантиметрах).
Желательно на NDK.

#1
16:22, 20 сен 2012

Нашел только для явы:
http://developer.android.com/reference/android/util/DisplayMetrics.html

Для NDK не знаю... сам сейчас пишу на NDK без явы, но в моём случае достаточно терминов ldpi/mdpi/hdpi/xhdpi.

#2
10:09, 21 сен 2012

ALPINE
> но в моём случае достаточно терминов ldpi/mdpi/hdpi/xhdpi.

А тЫ их как получаешь?
И как они трактуются? Ну то есть таблица, что типа xhdpi - это 100% гарантия того, что dpi будет от такого-то до такого-то, а hdpi означает такие-то границы ну и так далее.

#3
12:10, 24 сен 2012

Итак, я решил сделать как тут:
http://developer.android.com/reference/android/util/DisplayMetrics.html
итак, я начал писать:

jclass c; jmethodID m; jobject o;
c = env->FindClass ("android/util/DisplayMetrics");
LOGI("class is %x", c);
m = env->GetMethodID(c, "<init>", "()V");
LOGI("constructor is %x", m);
o = env->NewObject(c, m);
LOGI("object is %x", o);

Дальше надо вызвать метод getWindowManager()
Так вот, чей это метод?
И правильно ли я понимаю, что вся это цепочка методов там внутри создаёт новые экземпляры класса и их надо будет потом удалить, или на это следует забить и предоставить это жабамашине и вообще это вызывается не более одного раза за работу программы.

#4
13:00, 24 сен 2012

TarasB
ну и каша! А не проще ли от наследовать NativeActivity, выполнить этот код на java и передать данные в с++ ?

public class MyNativeActivity extends NativeActivity {}

шож.. вы так боитесь написать свои пару-строчек на java, в чем страхи то?

Что с вами будет когда зайдет речь о портирование на mac(ios)? тоже с++ only, не выйдет..

#5
13:03, 24 сен 2012

ReeV
> А не проще ли ... выполнить этот код на java

Ну нах, ещё и джаву подключать. У меня и так автогенерированный R.java иногда протухает после того, как я закрою и снова открою эклипс, приходится его удалять. Так как он автогенерированный, то он просто заново такой же создаётся и никаких проблем. А если протухнет файл, который я набирал долго и мучительно?

Ну и к тому же, жабокрестовый проект уже не получится компилировать студией как виндовое приложение и нормально отлаживать.

Короче, я тут родил такой  код, у вас он работает?

float GetXDPI ()
  {
    jclass c; jmethodID m; jobject o, dm; jfieldID fid;

    c = env->FindClass      ("android/util/DisplayMetrics");
    m = env->GetMethodID    (c, "<init>", "()V");
    dm = env->NewObject      (c, m);

    fid = env->GetFieldID    (c, "xdpi", "F");

    c = env->FindClass      ("android/app/NativeActivity");
    m = env->GetMethodID    (c, "getWindowManager", "()Landroid/view/WindowManager;");
    o = env->CallObjectMethod  (appState->activity->clazz, m);

    c = env->GetObjectClass    (o);
    m = env->GetMethodID    (c, "getDefaultDisplay", "()Landroid/view/Display;");
    o = env->CallObjectMethod  (o, m);

    c = env->GetObjectClass    (o);
    m = env->GetMethodID    (c, "getMetrics", "(Landroid/util/DisplayMetrics;)V");
    o = env->CallObjectMethod  (o, m, dm);

    float result = env->GetFloatField  (dm, fid);
    LOGI("xdpi is %f", result);
    return result;
  }

Ну вот, с местными табами в 2 пробела всё поплыло Т_Т

#6
13:12, 24 сен 2012

>>Ну нах, ещё и джаву подключать
>>Ну и к тому же, жабокрестовый проект уже не получится компилировать студией как виндовое приложение и нормально отлаживать.
LOL!

я пытался помочь...

#7
13:17, 24 сен 2012

ReeV
Ты хочешь сказать, что написать кроссплатформенную программу на жабе и крестах легче, чем на просто крестах? НЕ ВЕРЮ.
Лучше код мой проверь, работает или нет? А то я не знаю, у меня вот вывел
xdpi=127.498039
ydpi=128.336838
а я и не знаю, правда это или мусор с кучи

#8
13:33, 24 сен 2012

Engine - c++
:
Android - java(main-loop)
iOS  -  obj-c(main-loop)
windows - c(main-loop)

з.ы я думаю в твоем случае лучше взять Marmalade и на нем прогать.

#9
14:58, 24 сен 2012

ReeV
> з.ы я думаю в твоем случае лучше взять Marmalade и на нем прогать.
Он платный и народ что-то говорил что из-за багов мармеладить долго не вышло, пришлось на чистом ндк насвинячить.

#10
15:51, 24 сен 2012

TarasB
я тоже сначала писал на NativeActivity, но издержки по подключению рекламы.. пришлось написать свой активити)

#11
16:13, 24 сен 2012

ReeV
> я тоже сначала писал на NativeActivity, но издержки по подключению рекламы..

А это обязательно?

#12
23:48, 24 сен 2012

TarasB
да, завязывай это гиблое дело.

#13
13:12, 26 сен 2012

TarasB
> ldpi/mdpi/hdpi/xhdpi.
> А тЫ их как получаешь?
Пока никак :) Надеялся, что смог бы получить их без особых заморочек (мне ж не числовое значение dpi надо), Но, кажется, придется и правда через jclass, jobject вызывать ява-методы.

> да, завязывай это гиблое дело.
Не согласен, я тоже пишу на NDK и постараюсь не упереться в яву вообще никаким боком. Максимум - редкие вызовы ява-методов наподобие обсуждаемого здесь получения данных о дисплее.

TarasB
> Короче, я тут родил такой  код, у вас он работает?
Работает, но у меня xdpi,ydpi показывает соответственно 160.000 и 160.421051; если измерить размер экрана линейкой и посчитать число пикселей на дюйм, оно будет заметно меньше. Такое и на китайском планшете LY-F1, и на смартфоне LG E400 (141.767441, 140.137924). Хотя ydpi должно быть 320 px / ( 2.559" ) = 125 dpi.

Так что данные весьма недостоверны...

#14
13:20, 26 сен 2012

ALPINE
А вот на моём покетбуке цифра идеально сошлась.

Я не думаю, что есть ещё более нормальный способ узнать дпи.

Страницы: 1 2 3 Следующая »
Мобильные платформыФорумОбщее

Тема в архиве.