Тащим нарисованный квадрат по экрану

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Тащим нарисованный квадрат по экрану

Сообщение damager82 » 27 фев 2012, 14:58

Тема создана как ответ на вопрос из темы: viewtopic.php?f=32&t=473
Вынес в отдельную тему, т.к. пример будет полезен начинающим разбираться с Touch-событиями.

Наиболее простой вариант реализации:

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

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;

public class MainActivity extends Activity {

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(new MyView(this));
	}

	class MyView extends View {
		Paint p;
		// координаты для рисования квадрата
		float x = 100;
		float y = 100;
		int side = 100;

		// переменные для перетаскивания
		boolean drag = false;
		float dragX = 0;
		float dragY = 0;

		public MyView(Context context) {
			super(context);
			p = new Paint();
			p.setColor(Color.GREEN);
		}

		protected void onDraw(Canvas canvas) {
			// рисуем квадрат
			canvas.drawRect(x, y, x + side, y + side, p);
		}

		@Override
		public boolean onTouchEvent(MotionEvent event) {
			// координаты Touch-события
			float evX = event.getX();
			float evY = event.getY();

			switch (event.getAction()) {
			// касание началось
			case MotionEvent.ACTION_DOWN:
				// если касание было начато в пределах квадрата
				if (evX >= x && evX <= x + side && evY >= y && evY <= y + side) {
					// включаем режим перетаскивания
					drag = true;
					// разница между левым верхним углом квадрата и точкой касания
					dragX = evX - x;
					dragY = evY - y;
				}
				break;
			// тащим
			case MotionEvent.ACTION_MOVE:
				// если режим перетаскивания включен
				if (drag) {
					// определеяем новые координаты для рисования
					x = evX - dragX;
					y = evY - dragY;
					// перерисовываем экран
					invalidate();
				}
				break;
			// касание завершено
			case MotionEvent.ACTION_UP:
				// выключаем режим перетаскивания
				drag = false;
				break;
			}
			return true;
		}
	}
}
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

budgie
Сообщения: 10
Зарегистрирован: 19 янв 2012, 14:23

Re: Тащим нарисованный квадрат по экрану

Сообщение budgie » 02 мар 2012, 11:24

спасибо, отличный урок.

а вот вопрос: если я создам два экземпляра класса MyView и размещу их на экране, то как при таче определять какой квадрат я тащу?

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Тащим нарисованный квадрат по экрану

Сообщение damager82 » 05 мар 2012, 11:05

budgie писал(а):если я создам два экземпляра класса MyView и размещу их на экране, то как при таче определять какой квадрат я тащу?
Тач будет обработан одним из MyView и тащить будете нарисованный в нем квадрат.
Либо я не понял вопрос.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

budgie
Сообщения: 10
Зарегистрирован: 19 янв 2012, 14:23

Re: Тащим нарисованный квадрат по экрану

Сообщение budgie » 09 мар 2012, 12:28

Вопрос поняли, но работать так как вы сказали не будет потому что каждый новый view оказывается на вершине стека и занимает всю площадь экрана.
Но я уже нашла решение, спасибо.

Grigory
Сообщения: 7
Зарегистрирован: 30 май 2012, 15:51

Re: Тащим нарисованный квадрат по экрану

Сообщение Grigory » 14 авг 2012, 10:01

как сделать так чтоб квадрат не мог уходить краями за экран?
то есть как можно определить границы экрана аппарата чтоб квадрат двигался только в этих пределах?

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

Re: Тащим нарисованный квадрат по экрану

Сообщение rezak90 » 14 авг 2012, 10:13

я так понял здесь кусочек кода? а то рисование должно происходить в отдельном потоке, ну и конечно желательно в качестве "палитры" использовать SurfaceView
R.id.team
Политика на форуме запрещена

Grigory
Сообщения: 7
Зарегистрирован: 30 май 2012, 15:51

Re: Тащим нарисованный квадрат по экрану

Сообщение Grigory » 14 авг 2012, 10:14

budgie писал(а):Вопрос поняли, но работать так как вы сказали не будет потому что каждый новый view оказывается на вершине стека и занимает всю площадь экрана.
Но я уже нашла решение, спасибо.
и какое вы нашли решение подскажите?

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

Re: Тащим нарисованный квадрат по экрану

Сообщение rezak90 » 14 авг 2012, 10:20

а вообще это помоему велосипед такой... у андроида в доках есть хороший пример по drag and drop с хорошим интерфейсом OnDragEventListener
R.id.team
Политика на форуме запрещена

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Тащим нарисованный квадрат по экрану

Сообщение damager82 » 14 авг 2012, 14:11

rezak90 писал(а):а вообще это помоему велосипед такой... у андроида в доках есть хороший пример по drag and drop с хорошим интерфейсом OnDragEventListener
Просто цель этого примера не рисование, а обработка тач-касаний. Визуализация поможет лучше понять.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

Grigory
Сообщения: 7
Зарегистрирован: 30 май 2012, 15:51

Re: Тащим нарисованный квадрат по экрану

Сообщение Grigory » 14 авг 2012, 14:49

как сделать так чтоб квадрат не мог уходить краями за экран?
то есть как можно определить границы экрана аппарата чтоб квадрат двигался только в этих пределах?

AndreyI
Сообщения: 372
Зарегистрирован: 14 май 2012, 16:18

Re: Тащим нарисованный квадрат по экрану

Сообщение AndreyI » 14 авг 2012, 15:01

rezak90 писал(а):а вообще это помоему велосипед такой... у андроида в доках есть хороший пример по drag and drop с хорошим интерфейсом OnDragEventListener
эта фича появилось начиная с Honeycomb (3.1). А доля устройств с Андроидом ниже Honeycomb пока еще очень велика (больше 60%) чтобы её использовать для широкого круга пользователей.

Аватара пользователя
MeTeOpA
Сообщения: 85
Зарегистрирован: 07 мар 2012, 12:50

Re: Тащим нарисованный квадрат по экрану

Сообщение MeTeOpA » 14 авг 2012, 20:40

не путайте SurfaceView с Canvas... =)

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

Re: Тащим нарисованный квадрат по экрану

Сообщение rezak90 » 15 авг 2012, 00:09

я и не путаю, SurfaceView поддерживает рисование в фоновом потоке о чём я и намекнуть что лучше использовать его и рисовать на канве в отдельном потоке...
R.id.team
Политика на форуме запрещена

Аватара пользователя
MeTeOpA
Сообщения: 85
Зарегистрирован: 07 мар 2012, 12:50

Re: Тащим нарисованный квадрат по экрану

Сообщение MeTeOpA » 15 авг 2012, 20:43

А не blit-blit ли?

Аватара пользователя
MeTeOpA
Сообщения: 85
Зарегистрирован: 07 мар 2012, 12:50

Re: Тащим нарисованный квадрат по экрану

Сообщение MeTeOpA » 16 авг 2012, 13:51

+ Для рисования на SurfaceView нужно знать OpenGL А это намного сложнее чем Canvas-овские методы,где можно нарисовать линию одной функцией....

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

Re: Тащим нарисованный квадрат по экрану

Сообщение rezak90 » 16 авг 2012, 16:50

в SurfaceView линия рисуется так же как и в обычном Canvas))) ну не совсем так, но ничего трудного там нету, а тем более знать OpenGL не нужно.
R.id.team
Политика на форуме запрещена

k.chaiko
Сообщения: 21
Зарегистрирован: 02 авг 2012, 17:23

Re: Тащим нарисованный квадрат по экрану

Сообщение k.chaiko » 16 авг 2012, 17:02

rezak90 писал(а):в SurfaceView линия рисуется так же как и в обычном Canvas))) ну не совсем так, но ничего трудного там нету, а тем более знать OpenGL не нужно.
OpenGL знать не нужно, но доп. код написать придеться, плохо ли это я не знаю, я сам пытался разобраться с SurfaceView, пока неочень понял, урок бы по этому пригодился очень, по простому я на Canvase рисовал, но русских уроков по потоковости в рисовании не находил нигде..

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

Re: Тащим нарисованный квадрат по экрану

Сообщение rezak90 » 16 авг 2012, 17:05

мне тоже сначала было не понятно, но потом разобрался, может как нить и напишу урок по нему, а пока сейчас с drag and drop разбераюсь.
R.id.team
Политика на форуме запрещена

Alexei
Сообщения: 6
Зарегистрирован: 28 июн 2012, 16:51

Re: Тащим нарисованный квадрат по экрану

Сообщение Alexei » 22 ноя 2012, 17:34

Grigory писал(а):
budgie писал(а):Вопрос поняли, но работать так как вы сказали не будет потому что каждый новый view оказывается на вершине стека и занимает всю площадь экрана.
Но я уже нашла решение, спасибо.
и какое вы нашли решение подскажите?
Столкнулся с такой же проблемой.
Добавил 2 View.
Одно View(второе) перетаскивается спокойно. Первое не реагирует никак =(
Посоветуйте решение.

tolik777
Сообщения: 37
Зарегистрирован: 06 июл 2012, 14:25

Re: Тащим нарисованный квадрат по экрану

Сообщение tolik777 » 26 ноя 2012, 17:29

Такой вопрос по примеру. Хочу сделать так, чтобы квадрат появлялся в центре экрана при запуске. Но метод getWidth() возвращает ноль.

Ответить