Изменить форму изображения в android

Я добился успеха в реализации функции увеличения/уменьшения масштаба и перетаскивания в изображениях на холсте.

Теперь то, что я хочу, - это изменение размера, чтобы изображения, подобные приведенным ниже, основывались на iPhone App enter image description here

Как изменить форму изображения с помощью iPhone SDK?

Итак, как я могу добиться такой функциональности в Android?

Ответ 1

В принципе вам нужно сделать недействительным изображение и повторно рисовать на холсте с самого начала::

img=(ImageView)findViewById(R.id.yourimageidfromxml);

img.onTouchEvent(MotionEvent me)
{
   int X=me.getX(); 
   int Y=me.getY();
   img.invalidate();
   img.repaint(X,Y);

}

void paint(int X,int Y)
{
  img.setWidth(X);
  img.setHeight(Y);
}

Масштабирующее изображение преобразуется с помощью перерисовки на холсте с самого начала

Ответ 2

Если путем повторной калибровки вы ссылаетесь на "растяжение" растрового изображения на вертикальной и горизонтальной плоскостях, вы просто изменяете прямоугольник, в который втягивается форма (например, овал).

Например:

Это ваша первоначальная форма овала:

canvas.drawOval(new Rect(0,0,100,100), bluePaint);

Это тот же овал, просто растянутый (измененный) на горизонтальной плоскости:

canvas.drawOval(new Rect(0,0,200,100), bluePaint);

Надеюсь, это поможет.

Ответ 3

Существует два варианта, в которых используется пользовательское представление. Первый заключается в создании пользовательского представления, которое заполняет ваш "холст". Вы можете отслеживать 8 синих и 1 зеленые круги в представлении как объекты Rect. Переопределите onTouchEvent(MotionEvent), а затем проверьте, находятся ли события движения в любом из ваших элементов управления и соответственно обновляют их (я немного упрощаю это здесь:)). Из вашего onTouchEvent вы бы назвали invalidate(). Вы onDraw(Canvas) можете обрабатывать чертежи элементов управления и обновлять изображение в соответствии с тем, как ваши элементы управления были изменены с момента последнего вызова onDraw.

Другой вариант - сделать что-то подобное, но с представлением, которое только инкапсулирует круг и элементы управления, а это означает, что для перемещения вида потребуется контейнер, который позволит виду изменения параметров макета. Для этого ваш метод onTouchEvent должен вызвать недействительность с этим видом макета, потому что ему нужно будет пересчитать размер и положение вашего представления. Это определенно будет сложнее, но в зависимости от того, что вы пытаетесь достичь, работая с отдельными представлениями, может быть лучше, чем сохранение представлений ваших кругов в коде в одном представлении.

Ответ 4

Изменение размера изображения может быть достигнуто с помощью простого ImageView с scaleType "fitXY".

Вам нужно добавить синие маркеры размера.

Изменение поворота изображения (зеленая рукоятка) может быть достигнуто с помощью:

public static Bitmap rotate(Bitmap src, float degree) {
    // create new matrix
    Matrix matrix = new Matrix();
    // setup rotation degree
    matrix.postRotate(degree);

    // return new bitmap rotated using matrix
    return Bitmap.createBitmap(src, 0, 0, src.getWidth(), src.getHeight(), matrix, true);
}

Источник: http://xjaphx.wordpress.com/2011/06/22/image-processing-rotate-image-on-the-fly/

См. http://xjaphx.wordpress.com/learning/tutorials/ для получения дополнительных примеров обработки изображений для Android.