У відповідь на оригінальне запитання Януша існує декілька способів досягти цього, всі вони різняться за рівнем складності та були описані нижче. Використання веб-перегляду - це добре, але дуже обмежено з точки зору зовнішнього вигляду та відчуття та керованості. Якщо ви малюєте растрову карту з полотна, найбільш універсальними рішеннями, які були запропоновані, є такі, як MikeOrtiz, Роберт Фосс та / або те, що запропонував Джейкоб Нордфальк. Є чудовий приклад включення Android-мультитач-контролера від PaulBourke , і чудово підходить для підтримки мультитач і всіх типів користувацьких поглядів.
Особисто, якщо ви просто малюєте полотно до растрової карти, а потім показуєте її всередині та ImageView і хочете мати змогу збільшувати масштаби та переміщуватися за допомогою мультитач, я вважаю рішення MikeOrtiz як найпростіше. Однак, для моїх цілей код з наданого ним Git , здається, працює лише тоді, коли його користувальницький клас ImageView TouchImageView є єдиним дочірнім або надають параметри компонування як:
android:layout_height="match_parent"
android:layout_height="match_parent"
На жаль, завдяки моєму дизайну верстки мені знадобився "wrap_content" для "layout_height". Коли я змінив це на це, зображення було обрізано внизу, і я не міг прокручувати або збільшувати масштаб на обрізану область. Тому я подивився на Джерело для 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);
}
Тут resolutionSize (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 за його оригінальний код, чудова робота.