Em resposta à pergunta original de Janusz, existem várias maneiras de conseguir isso, as quais variam em seu nível de dificuldade e foram descritas abaixo. O uso de uma visualização na Web é bom, mas é muito limitado em termos de aparência e controle. Se você estiver desenhando um bitmap a partir de uma tela, as soluções mais versáteis propostas serão as de MikeOrtiz, Robert Foss e / ou o que Jacob Nordfalk sugeriu. Há um ótimo exemplo para incorporar o android-multitouch-controller por PaulBourke e é ótimo por ter o suporte multi-touch e todos os tipos de visualizações personalizadas.
Pessoalmente, se você está simplesmente desenhando uma tela em um bitmap e, em seguida, exibindo-a no interior e no ImageView e deseja poder ampliar e se movimentar usando o multitoque, acho a solução de MikeOrtiz a mais fácil. No entanto, para meus propósitos, o código do Git que ele forneceu parece funcionar apenas quando a classe ImageView personalizada do TouchImageView é o único filho ou fornece os parâmetros de layout como:
android:layout_height="match_parent"
android:layout_height="match_parent"
Infelizmente, devido ao meu design de layout, eu precisava de "wrap_content" para "layout_height". Quando mudei para isso, a imagem foi cortada na parte inferior e não pude rolar ou aplicar zoom na região cortada. Então, dei uma olhada no Source for ImageView apenas para ver como o Android implementou o "onMeasure" e mudei o de MikeOrtiz para se adequar.
@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);
}
Aqui resolveSize (int, int) é um "Utilitário para reconciliar um tamanho desejado com restrições impostas por um MeasureSpec, em que:
Parâmetros:
- size How big the view wants to be
- MeasureSpec Constraints imposed by the parent
Devoluções:
- The size this view should be."
Então, essencialmente, fornecendo um comportamento um pouco mais semelhante à classe ImageView original quando a imagem é carregada. Mais algumas alterações podem ser feitas para oferecer suporte a uma variedade maior de telas que modificam a proporção. Mas, por enquanto, espero que isso ajude. Obrigado a MikeOrtiz por seu código original, ótimo trabalho.