Turalllb писал(а):вот пример
https://gyazo.com/39b76d3e992dba4c369f428c9459c8a1 этот смайл должен двигаться , когда я буду перемещать палец по этой черной области (типо тачпад на экране) . Пробовал возможности движка andengine и ничего готового не нашел, везде нужно прикоснуться к самому спрайту. Как под себя переделать аналоговое управление джостиком, который в движке andengine я тоже не понял, дошел до того, что там надо менять всю конструкцию метода. Решил самому написать всё это. Следующее, что нашел на просторах интернета, это Canvas. Сделал всё как тут
https://habrahabr.ru/sandbox/27511/. на экране есть этот смайл , который перерисовывается там где я кликну. Вот тут я получаю координаты касания
Код: Выделить всё
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN) {
touchX = event.getX();
touchY = event.getY();
invalidate(); }
return true;
}
и перерисовываю смайл в новых координатах.
Но мне нужно , чтобы касания отлавливались только в определенной области экрана и далее я их буду подставлять и без invalidate() (пока не пробовал без него рисовать) перерисовывать этот смайл, только придется как то корректировать эти координаты. Ведь нужно подставлять не сами координаты , а изменение координаты. Т.е. нажал на область тачпад и начинаю двигать пальцем и будет отслеживаться разница между координатами и непрерывно передаваться для рисования . буду прибавлять к имеющимся координатам смайла эту разницу , а n-кратное увеличение или уменьшение этих координат позволит регулировать чувствительность тачпада. И еще решается такая проблема, которую я видел в начале, если коснуться смайлика пальцем и двигать его то смайлик начинает отставать от пальца, не достаточно быстро перерисовывается что ли..
Так вот нужна помощь с тем, чтобы определить область с которой считываются координаты касания, вернее изменения этой координаты от точки касания по движению. Спасибо, буду рад любому указанию к нужным методам и способам. или же может кто посоветует более разумный или эффективный способ реализации моей задачи.
Здравствуйте! Вообще для этих целей есть Drag and Drop
https://developer.android.com/guide/top ... -drop.html
Если, Вы, используете Activity, то вот простенький пример от которого можно дальше плясать:
drag_layout
Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingRight="16dp"
android:paddingLeft="16dp"
android:paddingTop="8dp"
android:layout_gravity="center">
<TextView
android:id="@+id/option1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:background="@color/rainbow_yellow"
android:text="TextView 1"
android:gravity="center"
android:textSize="20sp"/>
<TextView
android:id="@+id/option2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:background="@color/rainbow_yellow"
android:text="TextView 2"
android:gravity="center"
android:textSize="20sp"/>
<TextView
android:id="@+id/option3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:background="@color/rainbow_yellow"
android:text="TextView 3"
android:gravity="center"
android:textSize="20sp"/>
<TextView
android:id="@+id/choice_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:background="@color/rainbow_green"
android:text="TextView 4"
android:gravity="center"
android:textSize="20sp"/>
<TextView
android:id="@+id/choice_2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:background="@color/rainbow_green"
android:text="TextView 5"
android:gravity="center"
android:textSize="20sp"/>
<TextView
android:id="@+id/choice_3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:background="@color/rainbow_green"
android:text="TextView 6"
android:gravity="center"
android:textSize="20sp"/>
</LinearLayout>
TestActivity
Код: Выделить всё
import android.content.ClipData;
import android.graphics.Typeface;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.view.DragEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
/**
* Created by 1 on 26.05.2016.
*/
public class TestActivity extends AppCompatActivity {
private TextView option1, option2, option3, choice1, choice2, choice3;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.drag_layout);
// компоненты для перетаскивания
option1 = (TextView) findViewById(R.id.option1);
option2 = (TextView) findViewById(R.id.option2);
option3 = (TextView) findViewById(R.id.option3);
// компоненты для приема
choice1 = (TextView) findViewById(R.id.choice_1);
choice2 = (TextView) findViewById(R.id.choice_2);
choice3 = (TextView) findViewById(R.id.choice_3);
// слушатели
option1.setOnTouchListener(new ChoiceTouchListener());
option2.setOnTouchListener(new ChoiceTouchListener());
option3.setOnTouchListener(new ChoiceTouchListener());
choice1.setOnDragListener(new ChoiceDragListener());
choice2.setOnDragListener(new ChoiceDragListener());
choice3.setOnDragListener(new ChoiceDragListener());
}
private final class ChoiceTouchListener implements View.OnTouchListener {
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
ClipData data = ClipData.newPlainText("", "");
View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(
view);
view.startDrag(data, shadowBuilder, view, 0);
return true;
} else {
return false;
}
}
}
private class ChoiceDragListener implements View.OnDragListener {
@Override
public boolean onDrag(View v, DragEvent event) {
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
// не обрабатываем
break;
case DragEvent.ACTION_DRAG_ENTERED:
// не обрабатываем
break;
case DragEvent.ACTION_DRAG_EXITED:
// не обрабатываем
break;
case DragEvent.ACTION_DROP:
View view = (View) event.getLocalState();
// прячем элемент, на который был сброшен компонент
view.setVisibility(View.INVISIBLE);
TextView dropTarget = (TextView) v;
TextView dropped = (TextView) view;
// меняем текст у принимающего элемента
dropTarget.setText(dropped.getText());
// делаем его жирным, чтобы было видно, что операция получилась
dropTarget.setTypeface(Typeface.DEFAULT_BOLD);
// если на объект уже сбрасывали элемент, то реагируем на эту ситуацию
Object tag = dropTarget.getTag();
if (tag != null) {
int existingID = (Integer) tag;
// делаем источник видимым
findViewById(existingID).setVisibility(View.VISIBLE);
}
// устанавливаем тег, используя его ID
dropTarget.setTag(dropped.getId());
dropTarget.setTextColor(getResources().getColor(R.color.rainbow_purple));
dropTarget.setBackgroundColor(getResources().getColor(R.color.rainbow_yellow));
break;
case DragEvent.ACTION_DRAG_ENDED:
// не обрабатываем
break;
default:
break;
}
return true;
}
}
}
Тогда, в Вашем случае, если чёрный квадратик сделать как View-элемент то можно отслеживать координаты этого элемента либо когда вызывается startDrag() (ACTION_DRAG_STARTED через методы getX()и getY()), либо когда перетаскивание заканчивается внутри границ компонента где будет находиться квадратик (View-элемент) (ACTION_DROP так же через методы getX()и getY()). А самим компонентом, внутри границ которого мы перетаскиваем наш квадратик может быть что угодно, даже сам родительский Layout, внутри которого находиться наш квадрат. Кроме этого у метода слушателя OnDragListener.onDrag() можно отслеживать и другие события:
ACTION_DRAG_ENTERED: посылается компоненту, когда перетаскивание происходит в его границах;
ACTION_DRAG_EXITED: посылается компоненту, когда перетаскивание выходит за его пределы;
ACTION_DRAG_LOCATION: посылается компоненту между ACTION_DRAG_ENTERED и ACTION_DRAG_EXITED с текущей позицией перетаскивания внутри компонента. Местоположение объекта можно получить через методы getX()и getY();
ACTION_DRAG_ENDED: рассылается всем компонентам, когда текущее перетаскивание заканчивается. Результат перетаскивания можно получить через метод getResult().
Соответственно, Вы можете унаследовать от интерфейсов-слушателей OnDragListener и OnTouchListener и не в классе активности, а и в SurfaceView (или где Вы там работаете) и переопределить методы onDrag и onTouch так как Вам это будет нужно.