In risposta alla domanda originale di Janusz, ci sono diversi modi per raggiungere questo obiettivo che variano nel loro livello di difficoltà e sono stati indicati di seguito. L'utilizzo di una visualizzazione Web è buono, ma è molto limitato in termini di aspetto grafico e controllabilità. Se stai disegnando una bitmap da una tela, le soluzioni più versatili che sono state proposte sembrano essere quelle di MikeOrtiz, Robert Foss e / o ciò che Jacob Nordfalk ha suggerito. C'è un ottimo esempio per incorporare il controller multitouch per Android di PaulBourke ed è ottimo per avere il supporto multi-touch e tutti i tipi di visualizzazioni personalizzate.
Personalmente, se stai semplicemente disegnando una tela su una bitmap e poi la visualizzi all'interno e su ImageView e vuoi essere in grado di ingrandire e spostarti utilizzando il multi-touch, trovo la soluzione di MikeOrtiz come la più semplice. Tuttavia, per i miei scopi, il codice di Git che ha fornito sembra funzionare solo quando la sua classe ImageView personalizzata TouchImageView è l'unica figlia o fornisce i parametri di layout come:
android:layout_height="match_parent"
android:layout_height="match_parent"
Sfortunatamente a causa del mio design del layout, avevo bisogno di "wrap_content" per "layout_height". Quando l'ho cambiato in questo, l'immagine è stata ritagliata in basso e non ho potuto scorrere o ingrandire l'area ritagliata. Quindi ho dato un'occhiata a Source per ImageView solo per vedere come Android implementasse "onMeasure" e cambiò quello di MikeOrtiz per adattarlo.
@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) è un'utilità per riconciliare una dimensione desiderata con i vincoli imposti da MeasureSpec, dove:
parametri:
- size How big the view wants to be
- MeasureSpec Constraints imposed by the parent
Ritorna:
- The size this view should be."
Quindi essenzialmente fornendo un comportamento un po 'più simile alla classe ImageView originale quando l'immagine viene caricata. Alcune ulteriori modifiche potrebbero essere apportate per supportare una maggiore varietà di schermi che modificano le proporzioni. Ma per ora spero che questo aiuti. Grazie a MikeOrtiz per il suo codice originale, ottimo lavoro.