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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.67
75kolyan
0 / 0 / 0
Регистрация: 01.07.2014
Сообщений: 8
#1

Как создать квадратный TableLayout содержащий 100 ImageView? - Программирование Android

01.07.2014, 22:19. Просмотров 2437. Ответов 9
Метки нет (Все метки)

Здравствуйте уважаемые Специалисты!

Уже 2 недели ищу в интернете информацию и ничего нет.

У меня такой вопрос: есть 100 ImageView с квадратными картинками, картинки берутся из папок drawable соответственно dpi устройства и масштабируются во всех ImageView так как у каждого ImageView и у каждого tableRow установлено (android:layout_weight="1").

Вот фрагмент xml кода:
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
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#0099cc"
    android:orientation="vertical"
    android:weightSum="100" >
 
    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical|center_horizontal"
        android:layout_weight="10"
        android:gravity="center_vertical|center_horizontal"
        android:text="TextView" />
 
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="80"
        android:orientation="horizontal"
        android:weightSum="100" >
 
        <TextView
            android:id="@+id/textView3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical|center_horizontal"
            android:layout_weight="15"
            android:gravity="center_vertical|center_horizontal"
            android:text="TextView" />
 
        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="center_vertical|center_horizontal"
            android:layout_weight="70" >
 
            <TableLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_vertical|center_horizontal"
                android:gravity="center_vertical|center_horizontal" >
 
                <TableRow
                    android:id="@+id/tableRow1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_weight="1" >
 
                        <ImageView
                            android:id="@+id/imageView01"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_margin="1dp"
                            android:layout_weight="1"
                            android:src="@drawable/a" />
 
                        <ImageView
                            android:id="@+id/imageView02"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_margin="1dp"
                            android:layout_weight="1"
                            android:src="@drawable/a" />
 
                        <ImageView
                            android:id="@+id/imageView03"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_margin="1dp"
                            android:layout_weight="1"
                            android:src="@drawable/a" />
и так далее.

Вот как это выглядит на эмуляторе с экраном 480х800:

Как создать квадратный TableLayout содержащий 100 ImageView?

а вот так на эмуляторе с экраном 2560х1600:

Как создать квадратный TableLayout содержащий 100 ImageView?


как сделать так, чтобы TableLayout был бы квадратным (вторая картинка) на всех разрешениях всех устройств. Ну или квадратный FrameLayout а уже в него вложен TableLayout занимающий всю площадь квадратного FrameLayout.

Заранее благодарен за помощь!!!

Прошу так-же привести пример кода!

С уважением!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.07.2014, 22:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как создать квадратный TableLayout содержащий 100 ImageView? (Программирование Android):

Квадратный ImageView - Программирование Android
Как заставить ImageView всегда быть квадратным и при этом максимального размера (расширяться до границ Activity) ?

Скопировать картинку из одной ImageView в другую ImageView - Программирование Android
В ImageView поставлена картинка методом setImageResource. По нажатию на неё, нужно такую-же картинку поставить в другую вью, а в первой...

Как в ячейке TableLayout совместить два изображения? - Программирование Android
Собственно задача следующая: внизу активности текст. над текстом изображение собранное из нескольких слоев. в зависимости от количества...

Как подогнать ряд кнопок в TableLayout под ширину экрана? - Программирование Android
День добрый. Пишу игру простенькую Крестики-нолики. Поле состоит квадрата 3x3 из Кнопок, которые генерируются в коде. Размер кнопки...

TableLayout как отловить значение строки по нажатию (для Андроид на java) - Программирование Android
Я только начинающий, прошу помочь по возможность, уже 2 день ищу информацию так и не понял как реализовать. Необходимо по нажатию на...

Как обработать нажатие ImageView - Программирование Android
Создаю программу на Андроиде. И сразу столкнулся с проблемой. Почему то не получается... Создаю три объекта ImageView, и надо при нажатии...

9
ILNAR_93
Android
221 / 221 / 23
Регистрация: 19.01.2013
Сообщений: 1,701
Записей в блоге: 3
02.07.2014, 10:48 #2
Возможно нужно программно задавать

android:layout_width="wrap_content" // фиксированный размер
android:layout_height="match_parent" // фиксированный размер

у FrameLayout..
0
GukZiLLA
35 / 35 / 2
Регистрация: 30.11.2013
Сообщений: 102
02.07.2014, 14:06 #3
Делал как-то давно сапера, так вот там я использовал GridView и величину ячейки задавал - длина грида / количество ячеек

То есть брал величину ширины экрана в портретном режиме
Вычитал отступы по сторонам в dp
Задавал гриду размеры match_parent по ширине
После gridView.post(new Runnable(...)) - получал ширину грида и делил на количество элементов по горизонтали - так получая ширину одной ячейки
Так как ячейки квадратные, то высчитывал общую высоту всей доски и применял ко гриду

Все сводилось к методу, в который я передавал количество горизонтально, количество вертикально и все)
При этом после этого присваивалось gridView.setNumColumns(количество горизонтально);

Возможно есть и легче пути)
0
75kolyan
0 / 0 / 0
Регистрация: 01.07.2014
Сообщений: 8
02.07.2014, 17:41  [ТС] #4
Здравствуйте уважаемый GukZiLLA! А могли-бы Вы выложить немного кода для примера как это сделать, а то я не всё понял?
0
GukZiLLA
35 / 35 / 2
Регистрация: 30.11.2013
Сообщений: 102
02.07.2014, 19:57 #5
Цитата Сообщение от 75kolyan Посмотреть сообщение
Здравствуйте уважаемый GukZiLLA! А могли-бы Вы выложить немного кода для примера как это сделать, а то я не всё понял?
Могу. Вот накидал рабочий код, конечно он небрежный и можно улучшать, но, думаю Вы все поймете и сделаете по-своему.

Вот GridView

XML
1
2
3
4
5
6
7
8
<GridView
        android:id="@+id/grid"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_margin="20dp" >
        
    </GridView>
А это метод, который заполняет его нужным количеством и пример адаптера

Java
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
void createField(final Activity ac, final int columns, int lines) {
        final GridView grid = (GridView) ac.findViewById(R.id.grid);
        grid.setNumColumns(columns);
        
        final List<Integer> nums = new ArrayList<Integer>(columns * lines);
        for(int i = 0; i < columns * lines; i++) {
            nums.add(i);
        }
        
        grid.post(new Runnable() {
            @Override
            public void run() {
                grid.setAdapter(new AdGrid(ac, nums, columns, grid.getMeasuredWidth()));
            }
        });
        
    }
    
    
    class AdGrid extends BaseAdapter {
 
        int oneWidth;
        
        Activity ac;
        List<Integer> nums;
        int columns;
        int widthGrid;
        AdGrid(Activity ac, List<Integer> nums, int columns, int widthGrid) {
            this.ac = ac;
            this.nums = nums;
            this.columns = columns;
            
            this.widthGrid = widthGrid;
            oneWidth = widthGrid / columns;
        }
        
        @Override
        public int getCount() {
            return nums.size();
        }
 
        @Override
        public Object getItem(int location) {
            return nums.get(location);
        }
 
        @Override
        public long getItemId(int arg0) {
            return 0;
        }
 
        @Override
        public View getView(int location, View v, ViewGroup parent) {
            
            int number = nums.get(location);
            
            TextView tv = new TextView(ac);
            
            GridView.LayoutParams par = new GridView.LayoutParams(oneWidth, oneWidth);
            tv.setLayoutParams(par);
            
            tv.setBackgroundColor(Color.LTGRAY);
            tv.setText(number+"");
            tv.setGravity(Gravity.CENTER);
            tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, oneWidth / 2);
            
            return tv;
        }
        
    }

Использовать это, например, так:

Java
1
createField(this, 10, 7);
Где this - это Ваша расширенная активити

И выглядит это все так

Как создать квадратный TableLayout содержащий 100 ImageView?
0
GukZiLLA
35 / 35 / 2
Регистрация: 30.11.2013
Сообщений: 102
02.07.2014, 22:30 #6
Новый код, пробуйте и тогда при любых размерах поля N x Y и при любой ориентации экрана всегда все будет масштабироваться и влазить

Java
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
    void createField(final Activity ac, final int columns, final int lines) {
        final GridView grid = (GridView) ac.findViewById(R.id.grid);
        grid.setNumColumns(columns);
        
        final List<Integer> nums = new ArrayList<Integer>(columns * lines);
        for(int i = 0; i < columns * lines; i++) {
            nums.add(i);
        }
        
        ViewGroup.LayoutParams params = grid.getLayoutParams();
        params.width = ViewGroup.LayoutParams.MATCH_PARENT;
        params.height = ViewGroup.LayoutParams.MATCH_PARENT;
        
        grid.post(new Runnable() {
            @Override
            public void run() {
                int width = grid.getMeasuredWidth();
                int height = grid.getMeasuredHeight();
                
                int oneWidth = width / columns;
                int oneHeight = height / lines;
                
                int oneSize = oneWidth > oneHeight ? oneHeight : oneWidth;
                
                ViewGroup.LayoutParams par = grid.getLayoutParams();
                par.width = oneSize * columns;
                par.height = oneSize * lines;
                
                grid.setAdapter(new AdGrid(ac, nums, oneSize));
            }
        });
        
    }
    
    
    
    
    static class AdGrid extends BaseAdapter {
 
        Activity ac;
        List<Integer> nums;
        int oneWidth;
        AdGrid(Activity ac, List<Integer> nums, int oneWidth) {
            this.ac = ac;
            this.nums = nums;
            this.oneWidth = oneWidth;
        }
        
        
        @Override
        public int getCount() {
            return nums.size();
        }
 
        @Override
        public Object getItem(int location) {
            return nums.get(location);
        }
 
        @Override
        public long getItemId(int arg0) {
            return 0;
        }
 
        @Override
        public View getView(int location, View v, ViewGroup parent) {
            
            int number = nums.get(location);
            
            TextView tv = new TextView(ac);
            
            GridView.LayoutParams par = new GridView.LayoutParams(oneWidth, oneWidth);
            tv.setLayoutParams(par);
            
            tv.setBackgroundColor(Color.LTGRAY);
            tv.setText(number+"");
            tv.setGravity(Gravity.CENTER);
            tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, oneWidth / 2);
            
            return tv;
        }
        
    }
Примеры

Как создать квадратный TableLayout содержащий 100 ImageView?Как создать квадратный TableLayout содержащий 100 ImageView?
0
75kolyan
0 / 0 / 0
Регистрация: 01.07.2014
Сообщений: 8
03.07.2014, 00:17  [ТС] #7
Огромное Вам СПАСИБО GukZiLLA!!!

Я постараюсь разобраться в этом коде, с таким ещё не работал. Я раньше писал на Pascal а теперь изучаю Java. Я уже написал одну игру тест вопрос и 4 варианта ответов для Андроида,сейчас тестирую и дорабатываю её. А теперь хочу переделать другую мою игру с Паскаля на Джаву для Андроида и столкнулся с проблемой. У Вас в примере в ячейках GridView вместо картинок просто серый фон и текст а мне надо туда вставить 121 ImageView (11 строк на 11 столбцов) и ещё отслеживать нажатия на этих ImageView и менять в них картинки во время работы приложения.

Мне-бы просто как-нибудь сделать квадратный FrameLayout а в него вставить TableLayout с ImageView и всё, дальше у меня уже весь игровой код в голове. В общем проблема во внешнем оформлении. Почему у FrameLayouta нет свойства уровнять ширину и высоту?

Моя игра располагается только в положении android:screenOrientation="landscape" и должна в нём оставаться. Высоту я выставил с помощью LinearLayout Weihgt Sum=100 и на высоту во FrameLayout (который вложен в LinearLayout) я выделил 70 от 100 и теперь мне надо просто сделать так, чтобы ширина FrameLayout стала равной его высоте. А уже TableLayot со всеми 121 ImageView я вложу во FrameLayout и он займёт всю ширину и высоту своего родителя, то-есть квадратного FrameLayout и таким образом все 121 картинки будут всегда располагаться в квадратном поле и по центру экрана.

Вот что мне надо:

Как создать квадратный TableLayout содержащий 100 ImageView?

Есть ли такой способ или в Джаве вообще нет возможности создать квадратный Layout?

С уважением!!!
0
GukZiLLA
35 / 35 / 2
Регистрация: 30.11.2013
Сообщений: 102
03.07.2014, 09:31 #8
Цитата Сообщение от 75kolyan Посмотреть сообщение
У Вас в примере в ячейках GridView вместо картинок просто серый фон и текст а мне надо туда вставить 121 ImageView (11 строк на 11 столбцов) и ещё отслеживать нажатия на этих ImageView и менять в них картинки во время работы приложения.
Оу, хотите совет? Если пишите игру, то всегда пишите ее на движках. У меня друг пишет на паскале, используя замечательный движок ZenGL. На сколько я знаю, он экспортирует игры и под декстоп, и под андроид и под айос. А код всегда один!

Для джавы есть другой хорожий движок - libGDX
На нем я сам написал две маленькие игры.

Цитата Сообщение от 75kolyan Посмотреть сообщение
Есть ли такой способ или в Джаве вообще нет возможности создать квадратный Layout?
Вот прям в верстке? Нет, но я же написал пример. Вы можете в метод createFIeld передать например 10 на 10 и будет квадрат.
1
75kolyan
0 / 0 / 0
Регистрация: 01.07.2014
Сообщений: 8
04.07.2014, 09:16  [ТС] #9
И снова большое СПАСИБО GukZiLLA!!!

Почитал про движки, потом попробую. На выходных буду разбираться с GridView и адаптером для создания сетки 10 х 10, как Вы и писали: "Вы можете в метод createFIeld передать например 10 на 10 и будет квадрат".

Правда чувство неудовлетворения от невозможности создания квадратного FrameLayout всё таки осталось. Ведь наверняка есть много моментов, когда это может понадобиться. Я вот тут нашел статью про то как сделать квадратную кнопку переопределив метод OnMeasure, правда там не понятно куда надо вставлять этот код и как его использовать в текущей активности. Не хватает полного кода.

Может быть есть такая возможность через этот метод OnMeasure сделать квадратный FrameLayout или вообще любой Layout? Если это возможно, то можно пожалуйста код выложить и где его вставить и как использовать!

С уважением!
0
75kolyan
0 / 0 / 0
Регистрация: 01.07.2014
Сообщений: 8
10.07.2014, 08:36  [ТС] #10
На выходных разбирался с движками и должен сказать, что оба движка ОЧЕНЬ достойны внимания! Правда для libGDX есть уроки а вот с ZenGL надо разбираться самому, да и не понятно как импортировать игру в арк файл, поэтому остановился на libGDX. Правда поставить движок пока не получилось, буду дальше пробовать настраивать.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2014, 08:36
Привет! Вот еще темы с ответами:

Как обработать нажатие на ImageView? - Программирование Android
Ребят, не пойму в чем ошибка, как обработать нажатие на картинку? public class MainActivity extends ActionBarActivity implements...

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

Как реализовать переворачивание ImageView в Android? - Программирование Android
Добрый день! Подскажите, кто знает как реализовать анимацию переворачивания например ImageView, то есть как будто лежит карта и мы ее...

Как ровно наложить imageview на surfaceview - Программирование Android
Не удается подогнать правильно размер эти двух view. Хочу чтобы фотография накладывалась на изображение с камеры, но фотография всегда...


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

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

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