Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 510
#1

Программное масштабирование - Программирование Android

26.11.2014, 23:45. Просмотров 1640. Ответов 16
Метки нет (Все метки)

Доброе время суток.
Возникла проблема с масштабированием при поддержки разных экранов разных производителей.
Для масштабирования содержимого экрана (в основном кнопки) использую следующий алгоритм:
считываю высоту и ширину дисплея и делю на разрешение экрана на котором было все сделано/размещено, тем самым получаю коэф. пересчета.
Java
1
2
3
4
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    float HeightScaling = ((float) metrics.heightPixels)/((float)552);
    float WidthScaling =  ((float) metrics.widthPixels)/((float)1024);
Затем масштабирую все кнопки (размещены одна под другой) умножая на полученные коэф.

Java
1
2
3
4
   for (int i = 0; i < ButtonArray.length; i++){
        RelativeLayout.LayoutParams btnParam = (RelativeLayout.LayoutParams) ButtonArray[i].getLayoutParams();  
        btnParam.height = (int) (((float) btnParam.height) * HeightScaling);    
    }
Все экраны должны быть одинаковы, но есть одна проблема:
Первичный экран (на котором было все сделано/размещено) имеет разрешение 1024х600 (Lenovo A2107), а полученное значение metrics.heightPixels = 552 (видимо с учетом панели внизу экрана), а вот для экрана Samsung G350 (реальное разрешение 800x480) значение metrics.heightPixels = 480 . Из-за такой разницы в полученных значениях кнопки вылазят за предел экрана.

Подскажите, как мне правильно от масштабировать элементы экрана.
Или может эти кнопки пусть занимают всю высоту экрана равномерно распределяясь по высоте экрана?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2014, 23:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Программное масштабирование (Программирование Android):

Масштабирование Canvas - Программирование Android
Здравствуйте. Задача растянуть все изображения во весь экран- SurfaceView (не зависимо от разрешения телефона и соотношения его сторон),...

Масштабирование компонентов на андроиде - Программирование Android
Сейчас пытаюсь освоить андроид 2.3.3 (но если окажется, что там все плохо, то может повышу версию). Суть проблемы: нужно расставить 6...

Масштабирование элементов экрана - Программирование Android
Здравствуйте. Такой вопрос. Допустим есть несколько рядов с кнопками на activity и в зависимости от размера экрана один или два последних...

Масштабирование картинок из drawable - Программирование Android
Здравствуйте! Суть в следующем, есть самодельное меню из картинок, при портретной ориентации находится вверху при ландшафтной слева. ...

Обновление БД на андроид, Масштабирование иконок - Программирование Android
Добрый день,уважаемые форумчане. При программировании на андроиде столкнулся с несколькими проблемами, а именно: 1. У меня в приложении...

Как реализовать масштабирование рисунка? - Программирование Android
Здравствуйте. Нужно нарисовать схему объекта, аналогия как в дубль гисе, чтобы при увеличении масштаба выводился текст(названия объектов)....

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
27.11.2014, 09:53 #2
Задавайте размеры сразу в dp.
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 510
27.11.2014, 14:50  [ТС] #3
С этого начинал, не подходит..
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
27.11.2014, 14:54 #4
Цитата Сообщение от korsaj Посмотреть сообщение
С этого начинал, не подходит..
Значит что-то делаете не так) Что конкретно должно получится, лучше нарисуйте.
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 510
27.11.2014, 15:16  [ТС] #5
Должно получится вот так:
При DP сохраняются физические размеры элементов экрана (остаются 4 крайних кнопки) на маленьком экране, центральные вылазят внизу..
Миниатюры
Программное масштабирование  
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
27.11.2014, 15:22 #6
korsaj, а обязательно эти кнопки программно создавать?
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 510
27.11.2014, 15:38  [ТС] #7
Нет, весь экран в Layout, я просто масштабирую программно.
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
27.11.2014, 15:46 #8
Первое что пришло в голову, может и проще можно:
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
56
57
58
59
60
61
62
63
64
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent">
 
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:layout_weight="1">
 
        <Button
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight=".1"/>
 
        <Button
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight=".1"/>
 
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight=".1"/>
 
        <Button
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight=".1"/>
 
        </LinearLayout>
 
 
    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:layout_weight=".3"/>
 
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:layout_weight="1">
 
        <Button
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight=".1"/>
 
        <Button
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight=".1"/>
 
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight=".07"/>
 
        </LinearLayout>
 
</LinearLayout>
Добавлено через 44 секунды
Можно поиграться с layout_weight чтобы увеличить/уменьшить нужные объекты.
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 510
27.11.2014, 15:53  [ТС] #9
Идея понятна, только листвью по центру не пойдет, там просто кнопки.
... не совсем кнопки, там по три в горизонталь и крайние имеют размер имеют размер по содержимому
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
27.11.2014, 15:54 #10
Ну просто LinearLayout добавьте и в нем кнопки с layout_width = match_parent
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 510
28.11.2014, 13:33  [ТС] #11
Ага, понятно. Спасибо, открыли глаза )))

А весовые коэф вы как выбирали?

Добавлено через 7 минут
Уже нашел
http://startandroid.ru/ru/uroki/vse-...elementov.html

Добавлено через 21 час 18 минут
Подскажите как правильно выбирать весовые коэф?
Вот мой лайаут
Кликните здесь для просмотра всего текста
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:baselineAligned="false"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >
 
    <LinearLayout
        android:id="@+id/LeftLinearLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1.0"
        android:orientation="vertical" >
 
        <Button
            android:id="@+id/button1"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="10dp"
            android:layout_weight="1" />
 
        <Button
            android:id="@+id/button2"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="5dp"
            android:layout_weight="1" />
 
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:orientation="vertical" >
 
        </LinearLayout>
 
        <Button
            android:id="@+id/button3"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="10dp"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_weight="1" />
 
    </LinearLayout>
 
    <LinearLayout
        android:id="@+id/CentralLinearLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="0.35"
        android:orientation="vertical" >
 
    </LinearLayout>
 
    <LinearLayout
        android:id="@+id/RightLinearLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1.0"
        android:orientation="vertical" >
 
        <Button
            android:id="@+id/button4"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="10dp"
            android:layout_weight="1" />
 
        <Button
            android:id="@+id/button5"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_marginTop="5dp"
            android:layout_weight="1" />
 
        <android.widget.GridLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
 
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:orientation="vertical" >
 
        </LinearLayout>
 
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:orientation="vertical" >
 
        </LinearLayout>
 
    </LinearLayout>
 
</LinearLayout>


Подобрал коэф методом тыка (что очень не нравится). Пробовал выставлять по соотношения (1:1:1 работает), если выбираю 1:3:1, то на экране "черт знает что", центральная часть исчезает, а правая вылазит за границы экрана...
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 510
28.11.2014, 13:41  [ТС] #12
А это нормальный и проблемный экраны:
Миниатюры
Программное масштабирование   Программное масштабирование  
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,649
Завершенные тесты: 1
28.11.2014, 13:55 #13
korsaj, если честно, сам не совсем понимаю логику работы веса. Насколько понял, чем больше вес, тем меньше места элементу остается на экране. Т.е. не как написано в уроке по ссылке выше, а на оборот. Например, если я хочу чтобы первая кнопка занимала 3/4, а вторая 1/4, нужно установить первой вес = 1, второй = 3. Странно и не логично, но так оно работает, а может я чего-то не знаю.
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 510
28.11.2014, 14:27  [ТС] #14
Я тоже это заметил. Почему так не понятно.
Gabberr
102 / 102 / 17
Регистрация: 13.10.2009
Сообщений: 403
28.11.2014, 15:03 #15
Если не задать параметр weightSum у родительского лаяута, то 1 считается за 100%, поэтому 3/4 и 1/4 будут выглядеть как 0.75 и 0.25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2014, 15:03
Привет! Вот еще темы с ответами:

Масштабирование картинок, отрисованных на кнопках - Программирование Android
Здравствуйте. Есть кнопки с отрисовнными на них картинками android:drawableLeft=&quot;@drawable/icon_temp_btn_on_off&quot;, где...

Масштабирование картинки в зависимости от разрешения экрана - Программирование Android
как программно масштабировать картинку в зависимости от разрешение экрана?

Масштабирование ImageView в процентах от размера дисплея - Программирование Android
Всем привет! У меня такой вопрос образовался по разметке интерфейса, сделал прокручиваемый layout, в котором располагаются картинки и...

Программное добавление View - Программирование Android
Доброго времени. Знаю что на эту тему много инфы, как на форуме так и на других ресурсах, но решения своей проблемы все же не нашел. суть...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.11.2014, 15:03
Ответ Создать тему
Опции темы

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