Создаем управляемое движение объектом с помощью перетаскивания
Главная » Создаем управляемое движение объектом с помощью перетаскивания

В этом уроке мы научимся создавать движение объекта по экрану с полным контролем этого движения прикосновением пальца. У нас на экране будет находится всеми любимое изображение ic_launcher, которое можно будет передвигать по всему экрану в любую точку. 

Начнем с создания нового проекта, выбираем Blank Activity, минимальная версия Android  будет 2,2+. 

Создадим нехитрый интерфейс приложения. Открываем файл activity_main.xml и добавим туда элемент ImageView:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/move"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <ImageView
 android:id="@+id/ImageView"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_centerHorizontal="true"
 android:src="@drawable/ic_launcher" />
</RelativeLayout>

Теперь переходим к написанию самой программы в MainActivity.java. Все происходящее будет вертеться вокруг использования двух вещей - RelativeLayout.LayoutParams и класса MotionEvent. С помощью RelativeLayout.LayoutParams мы запихнем наше изображение в определенные рамки (сделаем его размером 100*100) и будем изменять положение изображения, отслеживая новые координаты положения изображения на экране.

Класс MotionEvent описывает движение с помощью набора значений координат. Он состоит из определенных команд и числовых значений по осям координат, определяющим положение объекта. Например, когда пользователь впервые прикасается к экрану, вызывается команда ACTION_DOWN, а также набор значений X, Y, включающих координаты точки прикосновения. 

Из класса MotionEvent у нас будет использовано 2 команды: MotionEvent.ACTION_DOWN - отслеживает факт прикосновения к объекту и начало движения, здесь будут определяться начальные координаты объекта, далее в работу вступает MotionEvent.ACTION_MOVE, в которой происходит динамическое изменение положения объекта за время жеста прикосновения и содержится точка последней остановки, установленная после завершения действия MotionEvent.ACTION_DOWN.

Добавляем в файл MainActivity.java следующий код:

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.RelativeLayout;

public class MainActivity extends Activity implements View.OnTouchListener {

 private ImageView mImageView;
 private ViewGroup mMoveLayout;
 private int mX;
 private int mY;

 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);

 //Связываемся с нашими объектами, определяя изображение через заданный ViewGroup:
 mMoveLayout = (ViewGroup) findViewById(R.id.move);
 mImageView = (ImageView) mMoveLayout.findViewById(R.id.ImageView);

 //Создаем программно RelativeLayout с параметрами 100*100:
 RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(100, 100);

 //Применяем эти параметры к нашему изображению:
 mImageView.setLayoutParams(layoutParams);
 //И настраиваем ему слушателя (обработчик) прикосновений:
 mImageView.setOnTouchListener(this);
 }
 //Обрабатываем прикосновения к объекту:
 public boolean onTouch(View view, MotionEvent event) {

 //Определение координат через getRawX() и getRawY() дает
 //координаты по отношению к размерам экрана устройства:
 final int X = (int) event.getRawX();
 final int Y = (int) event.getRawY();

 switch (event.getAction() & MotionEvent.ACTION_MASK) {

 //ACTION_DOWN срабатывает при прикосновении к экрану,
 //здесь определяется начальное стартовое положение объекта:
 case MotionEvent.ACTION_DOWN:
 RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
 mX = X - lParams.leftMargin;
 mY = Y - lParams.topMargin;
 break;

 //ACTION_MOVE обрабатывает случившиеся в процессе прикосновения изменения, здесь
 //содержится информация о последней точке, где находится объект после окончания действия прикосновения ACTION_DOWN:
 case MotionEvent.ACTION_MOVE:
 RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view
 .getLayoutParams();
 layoutParams.leftMargin = X - mX;
 layoutParams.topMargin = Y - mY;
 layoutParams.rightMargin = -250;
 layoutParams.bottomMargin = -250;
 view.setLayoutParams(layoutParams);
 break;
 }
 return true;
 }
}

Ну а теперь проверим, работает ли программа, получилось ли желаемое управляемое движение. Запускаем приложение и любуемся результатом:

Объект в одном положении Успешно передвинутый Android на другую сторону

Наш Андруша успешно двигается по всему экрану, надеюсь у вас также :).

Категория: Уроки программирования | Просмотров: 1520 | Добавил: Oleg | Теги: Touch, Android движение объектов, Move, движение, перетаскивание | Рейтинг: 5.0/2
Всего комментариев: 1
avatar
1 Zastrel • 12:34, 06.09.2015
А если подсказать как сохранить новые параметры вообще цены не было.
avatar