Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.63
kvaka
31 / 31 / 3
Регистрация: 26.06.2012
Сообщений: 166
#1

Экраны различных устройств - Программирование Android

26.06.2012, 23:19. Просмотров 4076. Ответов 8
Метки нет (Все метки)

Мой вопрос вот в чем: есть приложение, которое состоит из бэкграунда и расположенными поверх него элементами интерфейса (кнопки и ImageView). Начитавшись разных умных источников решил использовать для указания размеров элементов и расстояний между ними единицы dp - узнав, что это аппаратно независимый пиксель я наивно решил, что это значит, что для всех устройств количество данных пикселей по горизонтали и по вертикали одинаковое, просто их размер пропорционально масштабируется. На эмуляторе все работало отлично, однако когда у меня появилась возможность установить приложение на Sony Experia X8 я был крайне удивлен, увидив, что картинка бэкграунда, как и задумывалось, растянута по экрану, а часть кнопок уползла вниз ниже границ видимости. Тогда я решил отказаться от использования dp в моем приложении.
Было принято следующее решение - создать разметку, где все элементы разложить в корневой LinearLayout, потом применить мою разметку к активити и методами getHeight() и getWith() получить габариты моего корневого LinearLayout. Потом в методе calculateGeometry() я вычислил размеры всех моих элементов исходя из найденных габаритов и применил их к элементам. В итоге ничего не вышло, т. к. размеры моего корневого элемента при вызове соответствующих методов получились 0. (для корнегого элемента я, естественно, для параметров width и height указал fill_parent).
Тогда я решил взять размеры не корневого элемента, а размера экрана устройства, получив его из объекта класса Dislay. Все размеры вычислились нормально, но нижняя часть опять уехала, т. к. я не учел высоты статусбара и титула окна. Почитав по поводу класса Display на сайте developer.android.com я узнал, что для моих нужд нужно использовать размеры не Display, а Window. Однако по поводу окон получения размеров я не нашел и решил обратиться к помощи зала.

Итак, люди помогите мне со следующими вопросами:
1) Как работают dp с разными размерами экрана?
2) Почему корневой LinearLayout при вызове getWidth() и getHight() вернул 0?
3) Как узнать размеры текущего окна Активити или размеры верхних надстроек(титула и статусбара)?
4) Может еще какой-нибудь грамотный способ существует?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.06.2012, 23:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Экраны различных устройств (Программирование Android):

eclipse, android и экраны - Программирование Android
Как в eclipse с androidsdk создать несколько экранов и переключатся между ними при нажатии на кнопку? и есть ли какие-нибудь книги или...

Адаптация под разные экраны - Программирование Android
покопался в гугле но ни как не поймую при создании проекта(Android, Eclipse) Изночально получаеш формочку определённого размера. Но у...

C# оптимизация приложения под разные экраны(не GUI) - Программирование Android
Здравствуйте. Дело в том, что изначально я делал игру(2d в Unity через спрайты) под 1366x768, но при запуске на других разрешениях...

Как адаптировать приложение под все экраны смартфонов? - Программирование Android
Всем привет! Я новичек в java и начал с самого простого-делаю кликер-игру на андроид. Скинул друзьям игру,они мне прислали скриншоты и...

Посоветуйте утилиту для создания картинок под разные экраны Android - Программирование Android
Может прога какая-то, или плагин по ФШ, всё равно что.

Как лучше организовать расположение компонентов на экране? (картинка и 3 кнопки на разные экраны) - Программирование Android
Я делаю приложение с увеличением компонентов программно. По такому принципу Кнопка.УстановитьШирину(РазмерЭкранаПоШирине / 10). Но проблема...

8
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
28.06.2012, 02:52 #2
юзаю dp и никаких проблем не было.
покажите свой layout.
0
kvaka
31 / 31 / 3
Регистрация: 26.06.2012
Сообщений: 166
28.06.2012, 23:25  [ТС] #3
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" 
    android:background="@android:color/white">
    
        <ImageView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:scaleType="fitCenter"
        android:src="@drawable/logo"/>
        
        <ImageView
        android:layout_width="fill_parent"
        android:layout_height="250dp"
        android:scaleType="fitCenter"
        android:src="@drawable/animals"/>
        
      
        
            <ImageButton 
            android:id="@+id/play_button"
            android:padding="2dp"
            android:layout_width="fill_parent"
            android:layout_height="45dp"
            android:src="@drawable/menu_play_button"  
            android:scaleType="fitCenter"
            android:background="@android:color/transparent"/>
            />
            
             <ImageButton 
            android:id="@+id/help_button"
            android:padding="2dp"
            android:layout_width="fill_parent"
            android:layout_height="45dp"
            android:src="@drawable/menu_help_button"  
            android:scaleType="fitCenter"
            android:background="@android:color/transparent"/>
            />
        
        
            <ImageButton 
            android:id="@+id/exit_button"
            android:padding="2dp"
            android:layout_width="fill_parent"
            android:layout_height="45dp"
            android:src="@drawable/menu_exit_button"  
            android:scaleType="fitCenter"
            android:background="@android:color/transparent"/>
            />
                
            
 
</LinearLayout>
Был вот такой код разметки. Здесь вроде значения dp уже подправлены
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
29.06.2012, 00:09 #4
если указывать размер в dp, то на девайсах с разным разрешением экрана, элементы будут иметь одинаковые размеры, соответственно если у другого девайса экран меньше, то что-то может и не поместится, зато размер не будет зависеть от разрешения экрана.

Добавлено через 6 минут
что бы указать размеры в пропорциях используют android:layout_weight.
для разных типов девайсов, которые сильно отличаются по величине, делают дополнительные лаяуты (например для планшетов) - http://developer.android.com/intl/ru...s/screens.html

Добавлено через 2 минуты
вот еще полезная ссылка - http://startandroid.ru/materialy/pam...n-density.html

Добавлено через 2 минуты
если указывать в пикселях, то на одном девайсе кнопка может быть вдвое больше чем на другом с тем же размером дисплея.

Добавлено через 1 минуту
а getWidth() и getHight() вернут не 0 только тогда, когда лаяут уже нарисовался на экране.

Добавлено через 3 минуты
еще одна ссылка - http://developer.android.com/intl/ru...s_support.html

Добавлено через 9 минут
когда, например, хотят сделать низу панельку с кнопочками, то в корневой лаяут добавляют 2 лаяута.
первый лаяут android:layout_weight=1, второй android:layout_weight=0, это значит, что панелька будет иметь определенную указанную величину, а верхний лаяут будет просто занимать все остальное пространство и никуда кнопочки не вылезут.

Добавлено через 5 минут
в верхний лаяут можешь добавить свой рисуночек и указать размеры fill_parent + добавит margin и рисунок будет адаптироваться под размеры экрана не влияя на кнопочки
0
kvaka
31 / 31 / 3
Регистрация: 26.06.2012
Сообщений: 166
29.06.2012, 00:28  [ТС] #5
в смысле, в верхний лейаут добавить рисунок не бекграундом, а ImageView?
по поводу размещения кнопок: т. е. мне надо расположить все кнопки в лейауте, размеры которого полюбому влезут на любое устройство, а остаток займет картинка, так?

И еще: когда происходит прорисовка активити на экране?
я пытался найти размеры после setContentView()
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
29.06.2012, 00:37 #6
бекграундом не бекграундом - это уже другая тема, смысл в том, что бы сделать нижнюю панель фиксированного размера(какого хотите) и указав размер в dp он вдруг не станет слишком маленьким или слишком большим.
а контекст помещаете в верхний лаяут (картинки там или не картинки), и нижняя панелька всегда будет на одном месте и одного размера.

Добавлено через 1 минуту
Цитата Сообщение от kvaka Посмотреть сообщение
И еще: когда происходит прорисовка активити на экране?
я пытался найти размеры после setContentView()
вроде после выполнения метода onCreate активити, нужно тестить что бы сказать точно.
если увидели активити на экране, значит прорисовка произошла)
1
flashok
87 / 89 / 1
Регистрация: 14.02.2009
Сообщений: 293
29.06.2012, 00:38 #7
вы сначало прочитайте те ссылки которые вам дали и вопросы сами отпадут
0
V0v1k
1159 / 983 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
29.06.2012, 01:06 #8
вот так, например, можно получить размеры
Java
1
2
3
4
5
6
7
8
9
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
 
    @Override
    public void run() {
        Log.v("Log", "" + findViewById(R.id.qqq).getWidth());
 
    }
}, 100);
06-28 20:47:52.624: V/Log(631): 480

Добавлено через 20 минут
еще можно екстенднуть лаяут о получить размеры в методе onMeasure переопределив его.
0
kvaka
31 / 31 / 3
Регистрация: 26.06.2012
Сообщений: 166
29.06.2012, 01:49  [ТС] #9
Спасибо, до последнего я еще не дошел. Сейчас вроде решается вопрос установкой веса - очень помогли
0
29.06.2012, 01:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.06.2012, 01:49
Привет! Вот еще темы с ответами:

5.2'' и 5.0'' экраны - разные лэйауты в итоге. Как добавить values\dimens.xml(1080*1920 420dpi)? - Программирование Android
Привет! Я боролся с этой проблемой около недели и не могу понять, как заставить это работать. У меня есть въюхи на экране. И один values\...

Взаимодействие устройств (Wi-Fi) - Программирование Android
Ребята, помогите пожалуйста разобраться с проблемой. Как реализовать взаимодействие устройств в локальной сети (Wi-Fi)? Пытался...

Bluetooth. Поиск устройств - Программирование Android
Всем привет. Подскажите пожалуйста как правильно написать поиск устройств. Читал несколько статей и никак не могу понять как написать код,...

Рассылка сообщений группе устройств - Программирование Android
Добрый день! Необходимо посылать сообщение из сервера группе устройств. Пишу в Android Studio. Думал использовать Cloud to Device...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.