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

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

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

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

26.11.2014, 23:45. Просмотров 1540. Ответов 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     Программное масштабирование
Посмотрите здесь:

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 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,648
Завершенные тесты: 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,648
Завершенные тесты: 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,648
Завершенные тесты: 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,648
Завершенные тесты: 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,648
Завершенные тесты: 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
Сообщений: 402
28.11.2014, 15:03     Программное масштабирование #15
Если не задать параметр weightSum у родительского лаяута, то 1 считается за 100%, поэтому 3/4 и 1/4 будут выглядеть как 0.75 и 0.25
Spelcrawler
526 / 496 / 111
Регистрация: 12.03.2014
Сообщений: 1,648
Завершенные тесты: 1
28.11.2014, 15:51     Программное масштабирование #16
Gabberr,
Цитата Сообщение от Spelcrawler Посмотреть сообщение
чем больше вес, тем меньше места элементу остается
А как это объяснить, когда вес = 1 и 3?

Добавлено через 3 минуты
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<LinearLayout
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:orientation="vertical"
        android:weightSum="4">
 
        <LinearLayout
            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="3"/>
        
        
        </LinearLayout>

Даже в таком случае тот linearLayout, у которого вес = 3 занимает 1/4, а другой, у которого вес = 1 - 3/4. И если убрать строчку android:weightSum="4" - ничего не измениться. НО, если заменить внутренним элементам android:layout_height="match_parent" на android:layout_height="0dp" - работает так, как ожидается. Опять же не важно установлен android:weightSum="4" или нет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2014, 15:58     Программное масштабирование
Еще ссылки по теме:

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

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

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

Программное добавление элементов - Программирование Android
Уважаемы подскажите такую ситуацию, не могу немного понять...Как на Relative разметке программно добавлять элементы, чтобы их можно было...

Программное создание TextView - Программирование Android
Всем привет! помогите пожалуйста. Как сделать по нажатию на кнопку автоматическое создание нескольких других элементов например TextView...


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

Или воспользуйтесь поиском по форуму:
Gabberr
102 / 102 / 17
Регистрация: 13.10.2009
Сообщений: 402
28.11.2014, 15:58     Программное масштабирование #17
а ну да, естественно, при использовании весов ширину или высоту нужно занулять.
Yandex
Объявления
28.11.2014, 15:58     Программное масштабирование
Ответ Создать тему
Опции темы

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