Как сделать шашки на Android?

Аватара пользователя
Arssir
Сообщения: 38
Зарегистрирован: 09 июн 2013, 15:22
Откуда: Москва

Re: Как сделать шашки на Android?

Сообщение Arssir » 17 июн 2013, 12:38

Вот что у меня получилось: я создал (списал) адаптер для GridView, а также сделал отдельный класс, наследуемый от MainActivity, для изменения размера картинки, которая выводится в ячейки GridView. Класс берет картинку, конвертирует в Bitmap и задает размер равный одной восьмой ширины экрана (8x8 шахматное поле). Код класса и адаптер по отдельности работают. Но проблема в том, что когда я указываю адаптеру взять Bitmap переменную, eclipce выдает ошибку, а в качестве решения предлагает сделать переменную static, но тогда у меня не работают другие методы этого класса.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Как сделать шашки на Android?

Сообщение rezak90 » 17 июн 2013, 13:41

как уже кто то говорил, подучите ООП и Java
R.id.team
Политика на форуме запрещена

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Как сделать шашки на Android?

Сообщение anber » 17 июн 2013, 15:12

Arssir писал(а):Вот что у меня получилось: я создал (списал) адаптер для GridView, а также сделал отдельный класс, наследуемый от MainActivity, для изменения размера картинки, которая выводится в ячейки GridView. Класс берет картинку, конвертирует в Bitmap и задает размер равный одной восьмой ширины экрана (8x8 шахматное поле). Код класса и адаптер по отдельности работают. Но проблема в том, что когда я указываю адаптеру взять Bitmap переменную, eclipce выдает ошибку, а в качестве решения предлагает сделать переменную static, но тогда у меня не работают другие методы этого класса.
Покажи код в котором eclipce выдает ошибку

Небольшой ликбез по static и не static методам: http://www.znannya.org/?view=Java_ClassVars
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
Arssir
Сообщения: 38
Зарегистрирован: 09 июн 2013, 15:22
Откуда: Москва

Re: Как сделать шашки на Android?

Сообщение Arssir » 17 июн 2013, 17:26

Класс для изменения размера

Код: Выделить всё

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);

    }
}

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Как сделать шашки на Android?

Сообщение anber » 17 июн 2013, 18:16

А что должна делать эта строчка?
iview.setImageBitmap(size.bmNeed);
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
Arssir
Сообщения: 38
Зарегистрирован: 09 июн 2013, 15:22
Откуда: Москва

Re: Как сделать шашки на Android?

Сообщение Arssir » 17 июн 2013, 18:31

anber писал(а):А что должна делать эта строчка?
iview.setImageBitmap(size.bmNeed);
Получить Image View из Bitmap

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Как сделать шашки на Android?

Сообщение anber » 17 июн 2013, 18:47

Arssir писал(а):
anber писал(а):А что должна делать эта строчка?
iview.setImageBitmap(size.bmNeed);
Получить Image View из Bitmap
А что за переменная size которая нигде не объявлена?

ага, понял size это имя класса. Кстати в Java действует соглашение что все имена классов должны ОБЯЗАНЫ начинаться с большой буквы.

С какой целью класс size наследуется от MainActivity ?
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Как сделать шашки на Android?

Сообщение anber » 17 июн 2013, 19:09

Сейчас нет времени вникать в твой код, но на первый взгляд нужно изменить класс 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.

Аватара пользователя
Arssir
Сообщения: 38
Зарегистрирован: 09 июн 2013, 15:22
Откуда: Москва

Re: Как сделать шашки на Android?

Сообщение Arssir » 17 июн 2013, 23:18

anber писал(а):
С какой целью класс size наследуется от MainActivity ?
Это был единственный способ, который я нашел, получить внутри класса размеры экрана. А что конкретно я делал не так?

Спасибо, теперь все работает. Правда немного не так, как я себе это представлял, элементы GridView смещаются и наслаиваются друг на друга. Попробую разобраться с этой проблемой.

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Как сделать шашки на Android?

Сообщение anber » 18 июн 2013, 11:34

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); 
2) Запомнил это в экземпляре класса GridAdapter в поле
private Activity mContext;
3) Собственно у экземпляра класса Activity(а значит и у любого который от него наследуется, в.т.ч. MainActivity) есть методы getResources() и getWindowManager() которые нужны для определения размеров экрана.
Внутри класса который прямо или через своих предков наследуется от Activity мы можем обращаться к ним прямо как в твоем коде, например

Код: Выделить всё

            // Вычисляем ширину и высоту экрана 
            Display display = getWindowManager().getDefaultDisplay(); 
Если мы в другом классе то можно вызвать эти методы через экземпляр класса Activity, в данном случае экземпляр MainActivity который мы передали в GridAdapter.Передаем его же как параметр в метод

Код: Выделить всё

public static Bitmap getBitmap(Activity activity){ 
и там через него получаем нужные данные:

Код: Выделить всё

    // Вычисляем ширину и высоту экрана 
    Display display = activity.getWindowManager().getDefaultDisplay(); 
Если что-то непонятно - спрашивай.

И да, вопрос на засыпку: ты понимаешь разницу между классом и экземпляром класса(объектом)? Это вопрос касается не только Java а принципов OOP. Если нет то советую почитать первые 2 главы книги "Брюс Эккель. Философия Java"
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
Arssir
Сообщения: 38
Зарегистрирован: 09 июн 2013, 15:22
Откуда: Москва

Re: Как сделать шашки на Android?

Сообщение Arssir » 18 июн 2013, 15:25

Вообщем все понятно. У меня достаточно теоретических знаний, но я не всегда понимаю как это работает, и как применяется на практике. Где-то синтаксис слишком сложной, где-то логика не явно выражена. Я раньше больше на delphi программировал.

Видимо все таки зря класс для размера создавал, картинки по размеру не совпадают с ячейками GridVeiw. Похоже придется (и будет лучше) редактировать GridAdapter.

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Как сделать шашки на Android?

Сообщение anber » 18 июн 2013, 15:33

Arssir писал(а):Я раньше больше на delphi программировал.
Я тоже ;) Вообще Java создавалась с оглядкой на Delphi но в тоже время она проще.
Arssir писал(а):Видимо все таки зря класс для размера создавал
А негативный опыт в программировании зачастую бывает полезнее - лучше запоминается :)
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
Arssir
Сообщения: 38
Зарегистрирован: 09 июн 2013, 15:22
Откуда: Москва

Re: Как сделать шашки на Android?

Сообщение Arssir » 24 июн 2013, 02:37

Решил полностью отказаться от адаптера и GridView,а сделать все при помощи обычных координат. Но возникла проблема с передаче метода класса определяющего размер в метод onDraw.

Измененный MainActivity:

Код: Выделить всё

@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Position p = new Position(this); 
		setContentView(p);

	}
Добавленный класс Position:

Код: Выделить всё

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);
	
	}
}
Не знаю что писать на месте трех знаков вопроса (???). Activity туда не подходит, вернее ее не получается никак объявить.

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Как сделать шашки на Android?

Сообщение anber » 24 июн 2013, 11:00

Arssir писал(а):Не знаю что писать на месте трех знаков вопроса (???). Activity туда не подходит, вернее ее не получается никак объявить.
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?

Сообщение KamiSempai » 24 июн 2013, 11:04

Arssir писал(а):Не знаю что писать на месте трех знаков вопроса (???). Activity туда не подходит, вернее ее не получается никак объявить.
Можно написать getContext().

anber, опередил, но и облажался. Зачем полученный контекст приводить к классу Activity?
Работать, конечно, будет, но только если при создании объекта Position в качестве контекста использовалось Activity.
А если мне вздумается передать в конструктор getApplicationContext()?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
anber
Сообщения: 584
Зарегистрирован: 10 июн 2013, 15:05
Откуда: UA

Re: Как сделать шашки на Android?

Сообщение anber » 24 июн 2013, 12:49

KamiSempai писал(а):Зачем полученный контекст приводить к классу Activity?
Потому что

Код: Выделить всё

public static Bitmap getBitmap(Activity activity){ 
KamiSempai писал(а):Работать, конечно, будет, но только если при создании объекта Position в качестве контекста использовалось Activity.
А если мне вздумается передать в конструктор getApplicationContext()?
anber писал(а):В данном случае Context как раз и является искомой Activity
Личные сообщения с просьбой ответить на форуме или написать программу я просто удаляю, если я в хорошем настроении. Если в плохом добавляю автора в черный список. По любым другим вопросам feel free to write to me.

Аватара пользователя
Arssir
Сообщения: 38
Зарегистрирован: 09 июн 2013, 15:22
Откуда: Москва

Re: Как сделать шашки на Android?

Сообщение Arssir » 24 июн 2013, 14:13

anber, спасибо, помогло, буду знать о таких особенностях на будущее)

Возникла еще одна странная проблема. Я хочу разместить картинку шахматного поля по центру экрана, картинка - квадратная. Я задал ей размер ширины и высоты, равный ширине экрана, вписывается идеально. Чтобы разместить ее по центру я задал координату Y равную половине высоты экрана минус половина высоты картинки. По идеи должен получится квадрат в центре экрана, но поле смещается немного вниз. Предполагаю, что это из-за панели сверху экрана показывающую время, зарядку и тому подобное, а также название приложения. Если проблема не в этом все равно хотелось бы узнать как избавится от этих панелей.
Последний раз редактировалось Arssir 24 июн 2013, 15:14, всего редактировалось 1 раз.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Как сделать шашки на Android?

Сообщение KamiSempai » 24 июн 2013, 15:11

anber писал(а):Потому что

Код: Выделить всё

public static Bitmap getBitmap(Activity activity){ 
Кхм.... Как у вас тут все запущено. Мне стоило прочитать предыдущие посты перед ответом.
anber, видимо Вы не совсем понимаете смысл контекста, хоть и даете правильные советы. Context - это абстрактный класс, требующий реализации кучи методов, одним из которых является getResources(). То есть это метод класса Context, а не Activity. Activity лишь реализует его.
Следовательно в метод getBitmap можно и нужно передавать Context вместо Activity.

Если это Вас не переубедило, попробуйте ответить на мой последний вопрос.
KamiSempai писал(а):А если мне вздумается передать в конструктор getApplicationContext()?
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Аватара пользователя
Arssir
Сообщения: 38
Зарегистрирован: 09 июн 2013, 15:22
Откуда: Москва

Re: Как сделать шашки на Android?

Сообщение Arssir » 24 июн 2013, 15:19

KamiSempai писал(а):Кхм.... Как у вас тут все запущено. Мне стоило прочитать предыдущие посты перед ответом.
anber, видимо Вы не совсем понимаете смысл контекста, хоть и даете правильные советы. Context - это абстрактный класс, требующий реализации кучи методов, одним из которых является getResources(). То есть это метод класса Context, а не Activity. Activity лишь реализует его.
Следовательно в метод getBitmap можно и нужно передавать Context вместо Activity.
А если проще объяснить? Вместо Activity activity нужно писать Context context?

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Как сделать шашки на Android?

Сообщение KamiSempai » 24 июн 2013, 15:40

Arssir писал(а):А если проще объяснить? Вместо Activity activity нужно писать Context context?
Именно. Как Вы назовете параметр не так критично, но Класс должен быть Context.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

Ответить