В ответе на оригинальный вопрос Януша есть несколько способов достижения этого, каждый из которых различается по уровню сложности и был указан ниже. Использование веб-представления - это хорошо, но оно очень ограничено с точки зрения внешнего вида и управляемости. Если вы рисуете растровое изображение с холста, наиболее универсальные решения, которые были предложены, это 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 за его оригинальный код, отличная работа.