В ответ на оригинальный вопрос Януша, есть несколько способов достичь этого, все они различаются по уровню сложности и были изложены ниже. Использование веб-представления - это хорошо, но оно очень ограничено с точки зрения внешнего вида и управляемости. Если вы рисуете растровое изображение с холста, наиболее универсальными решениями, которые были предложены, кажется MikeOrtiz, Robert Foss и / или то, что предложил Jacob Nordfalk. Есть отличный пример для включения android-multitouch-контроллера от PaulBourke , и отлично подходит для поддержки мультитач и всех типов пользовательских видов.
Лично, если вы просто рисуете холст на растровом изображении, а затем отображаете его внутри и в ImageView и хотите иметь возможность увеличивать и перемещать объекты с помощью мультитача, я считаю решение MikeOrtiz самым простым. Однако для моих целей код из Git , который он предоставил, кажется, работает только тогда, когда его собственный класс ImageView TouchImageView является единственным дочерним или предоставляет параметры макета как:
android:layout_height="match_parent"
android:layout_height="match_parent"
К сожалению, из-за моего макета, мне нужно было "wrap_content" для "layout_height". Когда я изменил его на это, изображение было обрезано внизу, и я не смог прокрутить или увеличить область обрезки.
Поэтому я взглянул на Source для ImageView, чтобы увидеть, как Android реализовал «onMeasure» и изменил MikeOrtiz для соответствия.
@Override
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//**** ADDED THIS ********/////
int w = (int) bmWidth;
int h = (int) bmHeight;
width = resolveSize(w, widthMeasureSpec);
height = resolveSize(h, heightMeasureSpec);
//**** END ********///
// width = MeasureSpec.getSize(widthMeasureSpec); // REMOVED
// height = MeasureSpec.getSize(heightMeasureSpec); // REMOVED
//Fit to screen.
float scale;
float scaleX = (float)width / (float)bmWidth;
float scaleY = (float)height / (float)bmHeight;
scale = Math.min(scaleX, scaleY);
matrix.setScale(scale, scale);
setImageMatrix(matrix);
saveScale = 1f;
// Center the image
redundantYSpace = (float)height - (scale * (float)bmHeight) ;
redundantXSpace = (float)width - (scale * (float)bmWidth);
redundantYSpace /= (float)2;
redundantXSpace /= (float)2;
matrix.postTranslate(redundantXSpace, redundantYSpace);
origWidth = width - 2 * redundantXSpace;
origHeight = height - 2 * redundantYSpace;
// origHeight = bmHeight;
right = width * saveScale - width - (2 * redundantXSpace * saveScale);
bottom = height * saveScale - height - (2 * redundantYSpace * saveScale);
setImageMatrix(matrix);
}
Здесь resolSize (int, int) - это «Утилита для согласования желаемого размера с ограничениями, наложенными MeasureSpec, где:
Параметры:
- size How big the view wants to be
- MeasureSpec Constraints imposed by the parent
Возвращает:
- The size this view should be."
Так что, по сути, обеспечивает поведение, немного более похожее на исходный класс ImageView, когда изображение загружается. Некоторые дополнительные изменения могут быть сделаны для поддержки большего разнообразия экранов, которые изменяют соотношение сторон. Но сейчас я надеюсь, что это поможет. Спасибо MikeOrtiz за его оригинальный код, отличная работа.