#android #ontouchlistener
#Android #ontouchlistener
Вопрос:
У меня есть два изображения на экране и прослушиватель, который позволяет перемещать каждое из них по отдельности. Кроме того, одно из них может вращаться.
При выборе другой настройки пользователь может перемещать оба изображения одновременно. Этот прослушиватель отлично работает, когда изображения перемещаются по отдельности, но как только пользователь решит переместить их оба одновременно, повернутое изображение будет перемещаться по наклонным осям вместо направления, в котором пользователь перемещает палец.
Например, если изображение повернуто на 90 градусов и пользователь переместит палец вверх, изображение переместится вправо. Я пробовал экспериментировать с тригонометрией, но это не объясняет, почему она работает правильно, когда выбрано только повернутое изображение.
onTouch ():
case MotionEvent.ACTION_DOWN: {
mPrevX = event.getX();
mPrevY = event.getY();
// Save the ID of this pointer.
mActivePointerId = event.getPointerId(0);
break;
}
case MotionEvent.ACTION_MOVE: {
// Find the index of the active pointer and fetch its position.
int pointerIndex = event.findPointerIndex(mActivePointerId);
if (pointerIndex != -1) {
float currX = event.getX(pointerIndex);
float currY = event.getY(pointerIndex);
// Only move if the ScaleGestureDetector isn't processing a
// gesture.
if (!mScaleGestureDetector.isInProgress()) {
if(!expandSelection){
adjustTranslation(view, currX - mPrevX, currY - mPrevY);
} else {
for(int i = 0; i < viewArr.length; i ){
adjustTranslation(viewArr[i], currX - mPrevX, currY - mPrevY);
}
}
}
}
}
break;
}
Отрегулируйте перевод ():
private static void adjustTranslation(View view, float deltaX, float deltaY) {
float[] deltaVector = {deltaX, deltaY};
view.getMatrix().mapVectors(deltaVector);
view.setTranslationX( (view.getTranslationX() deltaVector[0]) );
view.setTranslationY( (view.getTranslationY() deltaVector[1]) );
}
Комментарии:
1. Попробуйте mapPoints () вместо mapVectors (). Хотя это может сойти с ума, включая перевод дважды. Он делает именно то, что должен, если отображение ничего не делает.
Ответ №1:
Мне все еще нужно внести некоторые коррективы в масштабные коэффициенты, но ниже приведен имеющийся у меня код, который может избавить вас от головной боли, если вы столкнетесь с чем-то подобным. Сначала меня действительно сбили с толку знаки в уравнениях.
float cos = (float) Math.cos( Math.toRadians(viewArr[i].getRotation() ));
float sin = (float) Math.sin( Math.toRadians(viewArr[i].getRotation() ));
adjustTranslation(viewArr[i], (currX - mPrevX) * cos (currY - mPrevY) * sin, (currY - mPrevY) * cos - (currX - mPrevX) * sin);
Редактировать:
Вот код, который учитывает масштаб (я не тестировал это для искаженного изображения):
adjustTranslation(viewArr[i],
((currX - mPrevX) * cos (currY - mPrevY) * sin) / viewArr[i].getScaleX(),
((currY - mPrevY) * cos - (currX - mPrevX) * sin) / viewArr[i].getScaleY());