Мелкие детали рисунка - выбор
Мелкие детали рисунка - выбор
Делаю головоломку Эйнштейна для Андроида
оригинал на C++ - http://games.flowix.com
Как удобнее сделать выбор фишек?
Размер большой фишки - 48 пикселей, маленькой - 16. В такие трудно попасть пальцем.
оригинал на C++ - http://games.flowix.com
Как удобнее сделать выбор фишек?
Размер большой фишки - 48 пикселей, маленькой - 16. В такие трудно попасть пальцем.
- Вложения
-
- скриншот
- einstein.png (94.45 КБ) 13446 просмотров
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Мелкие детали рисунка - выбор
Можно использовать PopupWindow. При клике на набор фишек показывать их увеличенный вариант в этом PopupWindow.
А если его показывать точно над уменьшенной копией и анимацию хорошую сделать получится просто зашибись.
Еще я бы не советовал пихать все в одно окно. На планшете будет терпимо, а на телефоне лишком мелко получается. Пусть подсказки будут в одном окне, а сами фишки в другом.
Ну и, конечно, лучше использовать разные разметки для разных ориентаций экрана. Например для портретного режима лучше показывать фишки в сетке 2х3 а не 3х2.
PS: Я бы не прочь себе такую игрушку на телефон поставить. Буду рад помочь скорейшему ее созданию.
А если его показывать точно над уменьшенной копией и анимацию хорошую сделать получится просто зашибись.
Еще я бы не советовал пихать все в одно окно. На планшете будет терпимо, а на телефоне лишком мелко получается. Пусть подсказки будут в одном окне, а сами фишки в другом.
Ну и, конечно, лучше использовать разные разметки для разных ориентаций экрана. Например для портретного режима лучше показывать фишки в сетке 2х3 а не 3х2.
PS: Я бы не прочь себе такую игрушку на телефон поставить. Буду рад помочь скорейшему ее созданию.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Мелкие детали рисунка - выбор
Модель уже есть и работает. Нужно придумать как сделать интерфейс, сохранение и загрузку игры (объекты имеют метод toString() - их можно использовать для сохранения), таблицу рекордов, музыку (можно взять оригинальные wav и сконвертировать в mp3).
Проблема в том, что нужно видеть одновременно игровое поле и подсказки, использованные подсказки можно убирать с экрана, но место для них на экране всё равно должно остаться.
В каких координатах выдаётся место нажатия в onTouchEvent ? В координатах View или всего экрана?
Прилагаю исходники на данный момент, без ресурсов - Слишком большой размер вложения.
Картинки ресурсов можно взять из оригинальной игры, сконвертировав из bmp в png, заменив '-' на '_' и приведя имена файлов к нижнему регистру.
Проблема в том, что нужно видеть одновременно игровое поле и подсказки, использованные подсказки можно убирать с экрана, но место для них на экране всё равно должно остаться.
В каких координатах выдаётся место нажатия в onTouchEvent ? В координатах View или всего экрана?
Прилагаю исходники на данный момент, без ресурсов - Слишком большой размер вложения.
Картинки ресурсов можно взять из оригинальной игры, сконвертировав из bmp в png, заменив '-' на '_' и приведя имена файлов к нижнему регистру.
- Вложения
-
- Einstein2.zip
- исходики без ресурсов
- (15.59 КБ) 323 скачивания
Re: Мелкие детали рисунка - выбор
это смотря где ты переопределишь onTouchEvent, если в Activity то будут координаты всего экрана, если во View то уже координаты вьюхи. Во View не переопределял onTouchEvent, но мне кажется что он будет возврящать координаты экрана, просто будет срабатывать только тогда когда нажатие входит в поле зрение View.В каких координатах выдаётся место нажатия в onTouchEvent ? В координатах View или всего экрана?
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Мелкие детали рисунка - выбор
onTouchEvent всегда возвращает координаты нажатия относительно View, а не всего экрана.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Мелкие детали рисунка - выбор
Устройство посылает события с координатами экрана, а обработчик приводит эти координаты к координатам View обрабатывающим эти события.
Чтобы получить необработанные координаты (т.е. координаты экрана, не привязанные к View) можно вызвать методы getRawX и getRawY.
Чтобы получить необработанные координаты (т.е. координаты экрана, не привязанные к View) можно вызвать методы getRawX и getRawY.
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Мелкие детали рисунка - выбор
По поводу проблемы с одновременным отображением...
Если использовать ViewPager, перемещаться между фишками и подсказками можно будет в одно движение пальцем.
Если использовать ViewPager, перемещаться между фишками и подсказками можно будет в одно движение пальцем.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Мелкие детали рисунка - выбор
С использованием GridView вместо одного EinsteinView всё упростилось - попадать стало удобнее, даже без увеличения размеров фишек. Вместо onTouchEvent - onItemClick, и андроид сам подсвечивает нажетую фишку.
ViewPager не подойтёт, поскольку нужно видеть одновременно игровое поле и хотя бы часть подсказок (фактически, это не подсказки, а правила - Rules).
Но как описать лейауты, чтобы размеры подгонались под экран?
cell_layout.xml:
hor_rule.xml:
vert_rule.xml:
einstein.xml:
einstein.xml,ландшафт:
ViewPager не подойтёт, поскольку нужно видеть одновременно игровое поле и хотя бы часть подсказок (фактически, это не подсказки, а правила - Rules).
Но как описать лейауты, чтобы размеры подгонались под экран?
cell_layout.xml:
Код: Выделить всё
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/empty"
android:src="@drawable/hint_tile" />
<TableLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical" >
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/empty"
android:src="@drawable/small_a1" />
<ImageView
android:id="@+id/imageView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/empty"
android:src="@drawable/small_a2" />
<ImageView
android:id="@+id/imageView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/empty"
android:src="@drawable/small_a3" />
</TableRow>
<TableRow
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/imageView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/empty"
android:src="@drawable/small_a4" />
<ImageView
android:id="@+id/imageView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/empty"
android:src="@drawable/small_a5" />
<ImageView
android:id="@+id/imageView6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/empty"
android:src="@drawable/small_a6" />
</TableRow>
</TableLayout>
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone" />
</FrameLayout>Код: Выделить всё
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/empty"
android:src="@drawable/large_b1" />
<ImageView
android:id="@+id/imageView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/empty"
android:src="@drawable/large_b2" />
<ImageView
android:id="@+id/imageView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/empty"
android:src="@drawable/large_b3" />
</LinearLayout>
<ImageView
android:id="@+id/arrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|center_horizontal"
android:contentDescription="@string/empty"
android:src="@drawable/betwarr" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone" />
</FrameLayout>Код: Выделить всё
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/empty"
android:src="@drawable/large_a1" />
<ImageView
android:id="@+id/imageView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/empty"
android:src="@drawable/large_b1" />
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone" />
</LinearLayout>Код: Выделить всё
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/vertLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<GridView
android:id="@+id/einsteinView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:numColumns="6" >
</GridView>
<GridView
android:id="@+id/horHints"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:numColumns="3" >
</GridView>
<GridView
android:id="@+id/vertHints"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:numColumns="9" >
</GridView>
</LinearLayout>Код: Выделить всё
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/horLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:orientation="vertical" >
<GridView
android:id="@+id/einsteinView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numColumns="6" >
</GridView>
<GridView
android:id="@+id/vertHints"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numColumns="6" >
</GridView>
</LinearLayout>
<GridView
android:id="@+id/horHints"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:numColumns="auto_fit" >
</GridView>
</LinearLayout>Re: Мелкие детали рисунка - выбор
Решил пока проблемы с увеличением рисунков заменой ImageView на View и свойства android:src на android:background и вписыванием размеров в программе в виде констант - под другой размер экрана работать не будет - как их считать не знаю. Можно, конечно, прописать эти константы в dimen.xml в нескольких вариантах.
- Вложения
-
- einstein.png (83.91 КБ) 13397 просмотров
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Мелкие детали рисунка - выбор
По поводу "попадать стало удобней" советую почитать одну статью с хабра: http://habrahabr.ru/post/142445/
С этим однозначно нужно что-то делать. Залил скрин себе на телефон, не в восторге. Лично меня напрягают такие маленькие кнопочки.
PS: Вернусь из отпуска, через 2 недели, попытаюсь сделать всплывающее окошко из PopupWindow, для увеличения ячейки. Если до меня этого никто еще не сделает
С этим однозначно нужно что-то делать. Залил скрин себе на телефон, не в восторге. Лично меня напрягают такие маленькие кнопочки.
PS: Вернусь из отпуска, через 2 недели, попытаюсь сделать всплывающее окошко из PopupWindow, для увеличения ячейки. Если до меня этого никто еще не сделает
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Мелкие детали рисунка - выбор
попадать стало не удобнО, а удобнЕЕ, чем в первом варианте (исходники которого выложены). У меня телефон с экраном 4 дюйма, 480x800 пискелей - при меньшем (по размеру) экране попадать будет совсем трудно, при меньшем разрешении - не различить детали на рисунке. Если устройство с джойстиком, можно сделать выбор джойстиком, но у меня джойстика нет.
Игровое поле сейчас размером 480x480 пикселей, занимает всю верхнюю или левую часть экрана, размеры вшиты в код программы.
Делать больше - придётся и для него прокрутку делать.
Остальная часть экрана - подсказки, с прокруткой, без увеличения. В портретном разрешении видно 12 горизонтальных и 9 вертикальных, в ландшафте - 14 горизонтальных и 6 вертикальных.
Мелкие картинки фишек из ресурсов выкинул - получаю уменьшением больших.
Ссылка с хабра рекомендует делать объекты размером 1 дюйм - но таких на экран влезет совсем мало.
Всплывающее окно:
размеры тоже вшиты в код - как их вычислить не знаю.
По короткому нажатию на кнопку, фишка удаляется, по долгому - удаляются все остальные.
Хотел сделать контекстное меню, но оно почему-то не вызывается.
Игровое поле сейчас размером 480x480 пикселей, занимает всю верхнюю или левую часть экрана, размеры вшиты в код программы.
Делать больше - придётся и для него прокрутку делать.
Остальная часть экрана - подсказки, с прокруткой, без увеличения. В портретном разрешении видно 12 горизонтальных и 9 вертикальных, в ландшафте - 14 горизонтальных и 6 вертикальных.
Мелкие картинки фишек из ресурсов выкинул - получаю уменьшением больших.
Ссылка с хабра рекомендует делать объекты размером 1 дюйм - но таких на экран влезет совсем мало.
Всплывающее окно:
Код: Выделить всё
onCellClick = new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id1) {
Cell cell = (Cell) parent.getItemAtPosition(position);
if (!cell.isOpened()) {
View pv = inflater.inflate(R.layout.cell_popup, null, false);
Einstein.this.cell = cell;
setupButton(pv, 0, R.id.imageButton1);
setupButton(pv, 1, R.id.imageButton2);
setupButton(pv, 2, R.id.imageButton3);
setupButton(pv, 3, R.id.imageButton4);
setupButton(pv, 4, R.id.imageButton5);
setupButton(pv, 5, R.id.imageButton6);
int w = 250;
int h = 150;
pw = new PopupWindow(pv, w, h, true);
pw.setBackgroundDrawable(getResources().getDrawable(R.drawable.tile));
pw.setOutsideTouchable(true);
pw.showAsDropDown(view);
}
}
};По короткому нажатию на кнопку, фишка удаляется, по долгому - удаляются все остальные.
Хотел сделать контекстное меню, но оно почему-то не вызывается.
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Мелкие детали рисунка - выбор
Как и обещал выкладываю пример с использованием PopupWindow. Все-таки успел доделать до отъезда.
Там и автоматическое вычисление позиции, и размеров.
Анимация только мне не нравится. Потом как-нибудь доделаю.
Там и автоматическое вычисление позиции, и размеров.
Анимация только мне не нравится. Потом как-нибудь доделаю.
- Вложения
-
- ZoomWindow.rar
- (77.09 КБ) 331 скачивание
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Мелкие детали рисунка - выбор
Почему не стал наследовать ZoomWindow от PopupWindow? Вроде так было бы логичнее.KamiSempai писал(а):Как и обещал выкладываю пример с использованием PopupWindow. Все-таки успел доделать до отъезда.
Там и автоматическое вычисление позиции, и размеров.
Анимация только мне не нравится. Потом как-нибудь доделаю.
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Мелкие детали рисунка - выбор
Можно было и так, но у PopupWindow есть куча медов за правильную работу которых я не собираюсь отвечать.AndreyI писал(а):Почему не стал наследовать ZoomWindow от PopupWindow? Вроде так было бы логичнее.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Мелкие детали рисунка - выбор
ZoomWindow - обёртка для PopupWindow. Никакие виртуальные методы PopupWindow не переопределяются, так что вполне разумно не делать наследования. Обертка же скрывает методы, которые не нужны для использования. Другой вариант - оставить всё в MainActivity, но там и так будет много методов.AndreyI писал(а):Почему не стал наследовать ZoomWindow от PopupWindow? Вроде так было бы логичнее.
Re: Мелкие детали рисунка - выбор
Размеры PopupWindow вычисляются автоматически так:
Но координаты можно будет узнать, когда окно будет на экране.
Как правило, pw появляется под view - и только когда там нет места - сверху.
При использовании pw.showAsDropDown(view); как я понял, игнорируется pw.setAnimationStyle(R.style.Animations_Alpha);
Предложенный способ вычисления координат основан на том, что уменьшенная копия показана на экране и не учитывает возможность использования не всей площади экрана (статус строка, заголовок - заголовок я отключил, но статус-строку (где выводится время, заряд, уровень сигнала) оставил. Часть окна может оказаться под статус-строкой.
При повороте экрана нужно делать pw.dismiss(); иначе программа зависает.
Мне пока не очень нравится вот это:
Код: Выделить всё
pw.setWindowLayoutMode(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
pw.showAsDropDown(view);Как правило, pw появляется под view - и только когда там нет места - сверху.
При использовании pw.showAsDropDown(view); как я понял, игнорируется pw.setAnimationStyle(R.style.Animations_Alpha);
Предложенный способ вычисления координат основан на том, что уменьшенная копия показана на экране и не учитывает возможность использования не всей площади экрана (статус строка, заголовок - заголовок я отключил, но статус-строку (где выводится время, заряд, уровень сигнала) оставил. Часть окна может оказаться под статус-строкой.
При повороте экрана нужно делать pw.dismiss(); иначе программа зависает.
Мне пока не очень нравится вот это:
(в оригинале это были левая и правая кнопки мыши, в андроиде правой кнопке мыши обычно соответствует долгое нажатие)По короткому нажатию на кнопку, фишка удаляется, по долгому - удаляются все остальные.
Re: Мелкие детали рисунка - выбор
Добавил звуки на всплывающее окно, длинное и короткое нажатие и конец игры. Теперь долгое нажатие фиксируется лучше.
Re: Мелкие детали рисунка - выбор
Заменил изображения на TextView. Масштабироваться должно бы лучше, но еще остаются "магические константы".
Добавил анимацию ячейки
Каждая ячейка анимируется почему-то только один раз, хотя можно анимировать сразу несколько.
Код: Выделить всё
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Cell cell = getItem(position);
View view = super.getView(position, convertView, parent);
int w = parent.getWidth();
int h = parent.getHeight();
return cell.setupView(view, w/6-3, h/6-4); // Из-за того, что у GridView остаются поля
}
private void setupTextLayout(TextView v, int szx, int szy) {
v.setTextSize(szy * 0.55f); // Зависит от шрифта
setupSizes(v, szx, szy);
}
private void setupSizes(View v, int szx, int szy) {
v.setMinimumHeight(szx);
v.setMinimumWidth(szy);
LayoutParams lp = v.getLayoutParams();
lp.height = szy;
lp.width = szx;
v.setLayoutParams(lp);
}Код: Выделить всё
if (!mOpened) {
final Animation animation = new ScaleAnimation(1.f / 3, 1, 0.5f, 1,
Animation.RELATIVE_TO_SELF, first%3/3.f,
Animation.RELATIVE_TO_SELF, (float)(first/3));
animation.setDuration(1000);
tv.post(new Runnable() {
public void run() {
tv.startAnimation(animation);
}
});
mOpened = opened;
}
- Вложения
-
- einstein.png (54.05 КБ) 13326 просмотров
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Мелкие детали рисунка - выбор
Когда уже игра будет доделана?
Мну в ожидании
Мну в ожидании
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Мелкие детали рисунка - выбор
В общем то доделана. Но проверена только на моём телефоне. Но куда её скинуть?