Как сделать шашки на Android?
Re: Как сделать шашки на Android?
Вот что у меня получилось: я создал (списал) адаптер для GridView, а также сделал отдельный класс, наследуемый от MainActivity, для изменения размера картинки, которая выводится в ячейки GridView. Класс берет картинку, конвертирует в Bitmap и задает размер равный одной восьмой ширины экрана (8x8 шахматное поле). Код класса и адаптер по отдельности работают. Но проблема в том, что когда я указываю адаптеру взять Bitmap переменную, eclipce выдает ошибку, а в качестве решения предлагает сделать переменную static, но тогда у меня не работают другие методы этого класса.
Re: Как сделать шашки на Android?
как уже кто то говорил, подучите ООП и Java
R.id.team
Политика на форуме запрещена
Политика на форуме запрещена
Re: Как сделать шашки на Android?
Покажи код в котором eclipce выдает ошибкуArssir писал(а):Вот что у меня получилось: я создал (списал) адаптер для GridView, а также сделал отдельный класс, наследуемый от MainActivity, для изменения размера картинки, которая выводится в ячейки GridView. Класс берет картинку, конвертирует в Bitmap и задает размер равный одной восьмой ширины экрана (8x8 шахматное поле). Код класса и адаптер по отдельности работают. Но проблема в том, что когда я указываю адаптеру взять Bitmap переменную, eclipce выдает ошибку, а в качестве решения предлагает сделать переменную static, но тогда у меня не работают другие методы этого класса.
Небольшой ликбез по static и не static методам: http://www.znannya.org/?view=Java_ClassVars
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.
Re: Как сделать шашки на Android?
Класс для изменения размера
Адаптер (подчеркивает предпоследнюю строчку)
Базовый класс
Код: Выделить всё
package com.arssir.checkers;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Display;
import android.widget.ImageView;
public class size extends MainActivity {
// Конвертируем Drawable в Bitmap
Bitmap bmOriginal = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
// Вычисляем ширину и высоту изображения
int im_width = bmOriginal.getWidth();
int im_height = bmOriginal.getHeight();
// Вычисляем ширину и высоту экрана
Display display = getWindowManager().getDefaultDisplay();
int disp_width = display.getWidth();
int disp_height = display.getHeight();
// Уменьшение
int need_width = disp_width / 8;
int need_height = disp_width / 8;
// Задаем bitmap нужного размера
Bitmap bmNeed = Bitmap.createScaledBitmap(bmOriginal, need_width, need_height, false);
}Код: Выделить всё
package com.arssir.checkers;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
public class GridAdapter extends BaseAdapter {
private Context mContext;
private Integer mCols, mRows;
public GridAdapter(Context context, int cols, int rows) {
mContext = context;
mCols = cols;
mRows = rows;
}
@Override
public int getCount() {
return mCols * mRows;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView iview; // для вывода картинки
if (convertView == null)
iview = new ImageView(mContext);
else
iview = (ImageView) convertView;
//iview.setImageResource(R.drawable.man_1);
iview.setImageBitmap(size.bmNeed);
return iview;
}
}Код: Выделить всё
package com.arssir.checkers;
import android.app.Activity;
import android.os.Bundle;
import android.widget.GridView;
public class MainActivity extends Activity {
private GridView mGrid;
private GridAdapter mAdapter;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mGrid = (GridView)findViewById(R.id.field);
mGrid.setNumColumns(8);
mGrid.setEnabled(true);
mAdapter = new GridAdapter(this, 8, 8);
mGrid.setAdapter(mAdapter);
}
}Re: Как сделать шашки на Android?
А что должна делать эта строчка?
iview.setImageBitmap(size.bmNeed);
iview.setImageBitmap(size.bmNeed);
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.
Re: Как сделать шашки на Android?
Получить Image View из Bitmapanber писал(а):А что должна делать эта строчка?
iview.setImageBitmap(size.bmNeed);
Re: Как сделать шашки на Android?
А что за переменная size которая нигде не объявлена?Arssir писал(а):Получить Image View из Bitmapanber писал(а):А что должна делать эта строчка?
iview.setImageBitmap(size.bmNeed);
ага, понял size это имя класса. Кстати в Java действует соглашение что все имена классов должны ОБЯЗАНЫ начинаться с большой буквы.
С какой целью класс size наследуется от MainActivity ?
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.
Re: Как сделать шашки на Android?
Сейчас нет времени вникать в твой код, но на первый взгляд нужно изменить класс size так:
и адаптер на такой:
Код: Выделить всё
package com.arssir.checkers;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Display;
public class Size {
public static Bitmap getBitmap(Activity activity){
// Конвертируем Drawable в Bitmap
Bitmap bmOriginal = BitmapFactory.decodeResource(activity.getResources(), R.drawable.ic_launcher);
// Вычисляем ширину и высоту изображения
int im_width = bmOriginal.getWidth();
int im_height = bmOriginal.getHeight();
// Вычисляем ширину и высоту экрана
Display display = activity.getWindowManager().getDefaultDisplay();
int disp_width = display.getWidth();
int disp_height = display.getHeight();
// Уменьшение
int need_width = disp_width / 8;
int need_height = disp_width / 8;
// Задаем bitmap нужного размера
Bitmap bmNeed = Bitmap.createScaledBitmap(bmOriginal, need_width, need_height, false);
return bmNeed;
}
}
Код: Выделить всё
package com.example.testForum;
import android.app.Activity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
public class GridAdapter extends BaseAdapter {
private Activity mContext;
private Integer mCols, mRows;
public GridAdapter(Activity context, int cols, int rows) {
mContext = context;
mCols = cols;
mRows = rows;
}
@Override
public int getCount() {
return mCols * mRows;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ImageView iview; // для вывода картинки
if (convertView == null)
iview = new ImageView(mContext);
else
iview = (ImageView) convertView;
iview.setImageBitmap(Size.getBitmap(mContext));
return iview;
}
}
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.
Re: Как сделать шашки на Android?
Это был единственный способ, который я нашел, получить внутри класса размеры экрана. А что конкретно я делал не так?anber писал(а):
С какой целью класс size наследуется от MainActivity ?
Спасибо, теперь все работает. Правда немного не так, как я себе это представлял, элементы GridView смещаются и наслаиваются друг на друга. Попробую разобраться с этой проблемой.
Re: Как сделать шашки на Android?
Сложно однозначно сказать. Этот код можно исправить разными способами чтобы он заработал, и все они допустимые.Arssir писал(а):А что конкретно я делал не так?
Вообще создать класс который может получить размер экрана - идея вполне здравая. Но реализация не очень:
1) Класс MainActivity и так может получить размер экрана. Зачем создавать еще один, если можно получить размер экрана в MainActivity и передать его как параметр в конструктор GridAdapter?
2) наследоваться от MainActivity (size extends MainActivity) - очень плохая идея. Получается что класс size делает все то же что и MainActivity + еще свои действия, которые выполняются непонятно где - не в каком-то методе, и как их потом получить непонятно. В итоге имеет 2 класса которые в конечном итоге наследуются от Activity. А класс Activity вообще предназначен для взаимодействия с пользователем через графический интерфейс. Более того, их в нормальном режиме запускает система по запросу приложения, а не вручную, и одновременно может быть активен только один класс который наследует Activity, который в данные момент выводит информацию на экран.
Что сделал я в своем примере?
1) Передал в конструктор GridAdapter ссылку на экземпляр класса MainActivity - параметр this:
Код: Выделить всё
mAdapter = new GridAdapter(this, 8, 8); private Activity mContext;
3) Собственно у экземпляра класса Activity(а значит и у любого который от него наследуется, в.т.ч. MainActivity) есть методы getResources() и getWindowManager() которые нужны для определения размеров экрана.
Внутри класса который прямо или через своих предков наследуется от Activity мы можем обращаться к ним прямо как в твоем коде, например
Код: Выделить всё
// Вычисляем ширину и высоту экрана
Display display = getWindowManager().getDefaultDisplay(); Код: Выделить всё
public static Bitmap getBitmap(Activity activity){ Код: Выделить всё
// Вычисляем ширину и высоту экрана
Display display = activity.getWindowManager().getDefaultDisplay(); И да, вопрос на засыпку: ты понимаешь разницу между классом и экземпляром класса(объектом)? Это вопрос касается не только Java а принципов OOP. Если нет то советую почитать первые 2 главы книги "Брюс Эккель. Философия Java"
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.
Re: Как сделать шашки на Android?
Вообщем все понятно. У меня достаточно теоретических знаний, но я не всегда понимаю как это работает, и как применяется на практике. Где-то синтаксис слишком сложной, где-то логика не явно выражена. Я раньше больше на delphi программировал.
Видимо все таки зря класс для размера создавал, картинки по размеру не совпадают с ячейками GridVeiw. Похоже придется (и будет лучше) редактировать GridAdapter.
Видимо все таки зря класс для размера создавал, картинки по размеру не совпадают с ячейками GridVeiw. Похоже придется (и будет лучше) редактировать GridAdapter.
Re: Как сделать шашки на Android?
Я тожеArssir писал(а):Я раньше больше на delphi программировал.
А негативный опыт в программировании зачастую бывает полезнее - лучше запоминаетсяArssir писал(а):Видимо все таки зря класс для размера создавал
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.
Re: Как сделать шашки на Android?
Решил полностью отказаться от адаптера и GridView,а сделать все при помощи обычных координат. Но возникла проблема с передаче метода класса определяющего размер в метод onDraw.
Измененный MainActivity:
Добавленный класс Position:
Не знаю что писать на месте трех знаков вопроса (???). Activity туда не подходит, вернее ее не получается никак объявить.
Измененный MainActivity:
Код: Выделить всё
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Position p = new Position(this);
setContentView(p);
}Код: Выделить всё
public class Position extends View{
public Position(Context context) { super(context); }
float X = 0;
float Y = 0;
protected void onDraw(Canvas canvas)
{
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.BLACK);
canvas.drawPaint(paint);
canvas.drawBitmap(Size.getBitmap(???), X, Y, null);
}
}
Re: Как сделать шашки на Android?
Activity не нужно объявлять, нужно получить уже существующую.Arssir писал(а):Не знаю что писать на месте трех знаков вопроса (???). Activity туда не подходит, вернее ее не получается никак объявить.
У класса View есть метод getContext() а значит и у Position тоже.
В данном случае Context как раз и является искомой Activity, только его нужно привести к типу Activity:
Код: Выделить всё
canvas.drawBitmap(Size.getBitmap((Activity)getContext()), X, Y, null); Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Как сделать шашки на Android?
Можно написать getContext().Arssir писал(а):Не знаю что писать на месте трех знаков вопроса (???). Activity туда не подходит, вернее ее не получается никак объявить.
anber, опередил, но и облажался. Зачем полученный контекст приводить к классу Activity?
Работать, конечно, будет, но только если при создании объекта Position в качестве контекста использовалось Activity.
А если мне вздумается передать в конструктор getApplicationContext()?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Как сделать шашки на Android?
Потому чтоKamiSempai писал(а):Зачем полученный контекст приводить к классу Activity?
Код: Выделить всё
public static Bitmap getBitmap(Activity activity){ KamiSempai писал(а):Работать, конечно, будет, но только если при создании объекта Position в качестве контекста использовалось Activity.
А если мне вздумается передать в конструктор getApplicationContext()?
anber писал(а):В данном случае Context как раз и является искомой Activity
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.
Re: Как сделать шашки на Android?
anber, спасибо, помогло, буду знать о таких особенностях на будущее)
Возникла еще одна странная проблема. Я хочу разместить картинку шахматного поля по центру экрана, картинка - квадратная. Я задал ей размер ширины и высоты, равный ширине экрана, вписывается идеально. Чтобы разместить ее по центру я задал координату Y равную половине высоты экрана минус половина высоты картинки. По идеи должен получится квадрат в центре экрана, но поле смещается немного вниз. Предполагаю, что это из-за панели сверху экрана показывающую время, зарядку и тому подобное, а также название приложения. Если проблема не в этом все равно хотелось бы узнать как избавится от этих панелей.
Возникла еще одна странная проблема. Я хочу разместить картинку шахматного поля по центру экрана, картинка - квадратная. Я задал ей размер ширины и высоты, равный ширине экрана, вписывается идеально. Чтобы разместить ее по центру я задал координату Y равную половине высоты экрана минус половина высоты картинки. По идеи должен получится квадрат в центре экрана, но поле смещается немного вниз. Предполагаю, что это из-за панели сверху экрана показывающую время, зарядку и тому подобное, а также название приложения. Если проблема не в этом все равно хотелось бы узнать как избавится от этих панелей.
Последний раз редактировалось Arssir 24 июн 2013, 15:14, всего редактировалось 1 раз.
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Как сделать шашки на Android?
Кхм.... Как у вас тут все запущено. Мне стоило прочитать предыдущие посты перед ответом.anber писал(а):Потому чтоКод: Выделить всё
public static Bitmap getBitmap(Activity activity){
anber, видимо Вы не совсем понимаете смысл контекста, хоть и даете правильные советы. Context - это абстрактный класс, требующий реализации кучи методов, одним из которых является getResources(). То есть это метод класса Context, а не Activity. Activity лишь реализует его.
Следовательно в метод getBitmap можно и нужно передавать Context вместо Activity.
Если это Вас не переубедило, попробуйте ответить на мой последний вопрос.
KamiSempai писал(а):А если мне вздумается передать в конструктор getApplicationContext()?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.
Re: Как сделать шашки на Android?
А если проще объяснить? Вместо Activity activity нужно писать Context context?KamiSempai писал(а):Кхм.... Как у вас тут все запущено. Мне стоило прочитать предыдущие посты перед ответом.
anber, видимо Вы не совсем понимаете смысл контекста, хоть и даете правильные советы. Context - это абстрактный класс, требующий реализации кучи методов, одним из которых является getResources(). То есть это метод класса Context, а не Activity. Activity лишь реализует его.
Следовательно в метод getBitmap можно и нужно передавать Context вместо Activity.
- KamiSempai
- Сообщения: 1339
- Зарегистрирован: 17 фев 2012, 21:23
- Откуда: Мордор
Re: Как сделать шашки на Android?
Именно. Как Вы назовете параметр не так критично, но Класс должен быть Context.Arssir писал(а):А если проще объяснить? Вместо Activity activity нужно писать Context context?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.
Хватит таскать макулатуру на тренировку! Используй T Note.