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

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

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

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

26.11.2014, 23:45. Просмотров 1394. Ответов 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 . Из-за такой разницы в полученных значениях кнопки вылазят за предел экрана.

Подскажите, как мне правильно от масштабировать элементы экрана.
Или может эти кнопки пусть занимают всю высоту экрана равномерно распределяясь по высоте экрана?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Spelcrawler
522 / 492 / 110
Регистрация: 12.03.2014
Сообщений: 1,643
Завершенные тесты: 1
27.11.2014, 09:53     Программное масштабирование #2
Задавайте размеры сразу в dp.
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 508
27.11.2014, 14:50  [ТС]     Программное масштабирование #3
С этого начинал, не подходит..
Spelcrawler
522 / 492 / 110
Регистрация: 12.03.2014
Сообщений: 1,643
Завершенные тесты: 1
27.11.2014, 14:54     Программное масштабирование #4
Цитата Сообщение от korsaj Посмотреть сообщение
С этого начинал, не подходит..
Значит что-то делаете не так) Что конкретно должно получится, лучше нарисуйте.
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 508
27.11.2014, 15:16  [ТС]     Программное масштабирование #5
Должно получится вот так:
При DP сохраняются физические размеры элементов экрана (остаются 4 крайних кнопки) на маленьком экране, центральные вылазят внизу..
Миниатюры
Программное масштабирование  
Spelcrawler
522 / 492 / 110
Регистрация: 12.03.2014
Сообщений: 1,643
Завершенные тесты: 1
27.11.2014, 15:22     Программное масштабирование #6
korsaj, а обязательно эти кнопки программно создавать?
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 508
27.11.2014, 15:38  [ТС]     Программное масштабирование #7
Нет, весь экран в Layout, я просто масштабирую программно.
Spelcrawler
522 / 492 / 110
Регистрация: 12.03.2014
Сообщений: 1,643
Завершенные тесты: 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
Сообщений: 508
27.11.2014, 15:53  [ТС]     Программное масштабирование #9
Идея понятна, только листвью по центру не пойдет, там просто кнопки.
... не совсем кнопки, там по три в горизонталь и крайние имеют размер имеют размер по содержимому
Spelcrawler
522 / 492 / 110
Регистрация: 12.03.2014
Сообщений: 1,643
Завершенные тесты: 1
27.11.2014, 15:54     Программное масштабирование #10
Ну просто LinearLayout добавьте и в нем кнопки с layout_width = match_parent
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 508
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
Сообщений: 508
28.11.2014, 13:41  [ТС]     Программное масштабирование #12
А это нормальный и проблемный экраны:
Миниатюры
Программное масштабирование   Программное масштабирование  
Spelcrawler
522 / 492 / 110
Регистрация: 12.03.2014
Сообщений: 1,643
Завершенные тесты: 1
28.11.2014, 13:55     Программное масштабирование #13
korsaj, если честно, сам не совсем понимаю логику работы веса. Насколько понял, чем больше вес, тем меньше места элементу остается на экране. Т.е. не как написано в уроке по ссылке выше, а на оборот. Например, если я хочу чтобы первая кнопка занимала 3/4, а вторая 1/4, нужно установить первой вес = 1, второй = 3. Странно и не логично, но так оно работает, а может я чего-то не знаю.
korsaj
148 / 117 / 9
Регистрация: 16.08.2013
Сообщений: 508
28.11.2014, 14:27  [ТС]     Программное масштабирование #14
Я тоже это заметил. Почему так не понятно.
Gabberr
 Аватар для Gabberr
101 / 101 / 17
Регистрация: 13.10.2009
Сообщений: 402
28.11.2014, 15:03     Программное масштабирование #15
Если не задать параметр weightSum у родительского лаяута, то 1 считается за 100%, поэтому 3/4 и 1/4 будут выглядеть как 0.75 и 0.25
Spelcrawler
522 / 492 / 110
Регистрация: 12.03.2014
Сообщений: 1,643
Завершенные тесты: 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     Программное масштабирование
Еще ссылки по теме:

Масштабирование компонентов на андроиде Android
Масштабирование картинок, отрисованных на кнопках Android
Android Как реализовать масштабирование рисунка?
Android Обновление БД на андроид, Масштабирование иконок
Масштабирование элементов экрана Android

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

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

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