Я пытаюсь использовать некоторые простые манипуляции с фотографиями на изображении в верхней части activity
в пределах ImageView
, который в среднем имеет высоту 200dp
и соответствует ширине ее родительского элемента.Android - проблемы с перетаскиванием и обрезкой
я реализовал пользовательский класс onTouchListener
, который создает matrix
и переводит изображение в ImageView
Drag:
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
matrix.set(savedMatrix);
matrix.postTranslate(v.getX(), event.getY() - start.y);
}
break;
Это отлично работает, он тащит изображение на у ось только. Но когда пользователь выпускает, я хочу, чтобы изображение обрезалось до границ видимой области ImageView
.
Crop:
case MotionEvent.ACTION_UP:
if (mode == DRAG) {
Bitmap bitmap = drawableToBitmap(view.getDrawable());
Bitmap result = Bitmap.createBitmap(bitmap,view.getLeft(), view.getTop(), view.getWidth(), view.getHeight());
view.setImageBitmap(result);
}
break;
Это обрезает изображение до нужного размера, но только из верхней части фоне не ImageView видимых границ. При вызове функции класса Bitmap
createBitmap(int x, int y, int width, int height)
мое единственное предположение: view.getTop()
запускает его сверху.
Итак, мой вопрос: как я мог рассчитать разницу между вершиной видимых границ обзора и границами фона/матрицы?
Примечание: Изображение отображает изображение (синий), который расположен в верхней части активности (голубой ищет области являются только фоном невидимые границы ImageView
, не активности)
Я хотел бы подчеркнуть, что я не хочу использовать сторонние библиотеки для достижения этой цели.
Я более чем готов предоставить дополнительный код, если потребуется.
Update:
Полный onTouch
метод:
@Override
public boolean onTouch(View v, MotionEvent event) {
ImageView view = (ImageView) v;
// Dump touch event to log
dumpEvent(event);
// Handle touch events here...
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
savedMatrix.set(matrix);
start.set(v.getX(), event.getY());
mode = DRAG;
originalY.y = (int) event.getY();
break;
case MotionEvent.ACTION_UP:
if (mode == DRAG) {
Bitmap bitmap = drawableToBitmap(view.getDrawable());
Bitmap result = Bitmap.createBitmap(bitmap,view.getLeft(), view.getTop(), view.getWidth(), view.getHeight());
view.setImageBitmap(result);
}
break;
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
matrix.set(savedMatrix);
matrix.postTranslate(v.getX(), event.getY() - start.y);
}
break;
}
view.setImageMatrix(matrix);
return true; // indicate event was handled
}
на вашем экране Выстрел, любое растровое изображение, которое вы устанавливаете в фоновом режиме на весь экран, или вы устанавливаете любую высоту, я знаю, что вы положили 200dp, но я думаю, что его видимая область изображения должна быть обрезана при нажатии кнопки, поэтому, если вы предоставите мне отображают информацию на экране с фактическим изображением, после чего я бы вызывающе помог вам. –
Изображение внутри изображения будет обрезано по ширине экрана и будет поддерживать высоту на основе обрезанного (обрезка нормального масштаба), тогда пользователь может перетащить столько же высоты, что и высота исходного изображения, это будет любое изображение (минимальное значение соответствует ширине экрана). Единственное, что исправлено в этом, - это высота самого изображения, размер матрицы является динамическим, что означает, что расстояние между верхней частью матрицы и верхней частью изображения также является динамическим. –