Vou tentar explicar exatamente o que preciso fazer.
Eu tenho três telas separadas, digamos A, B, C. Existe outra tela chamada, dizer HomeScreen, onde todos os bitmap das três telas devem ser exibidos na visualização da Galeria e o usuário pode selecionar em qual visualização deseja ir.
Consegui obter os Bitmaps de todas as três telas e exibi-los na visualização da Galeria, colocando todo o código apenas na Atividade da Tela Inicial. Agora, isso complicou muito o código e eu gostaria de simplificá-lo.
Então, posso chamar outra Atividade da Tela inicial e não exibi-la e apenas obter o Bitmap dessa tela. Por exemplo, digamos que eu apenas chamo HomeScreen e chama Atividade A, B, C e nenhuma das Atividades de A, B, C é exibida. Apenas fornece o bitmap dessa tela por getDrawingCache (). E então podemos exibir esses bitmaps na visualização da Galeria na Tela inicial.
Espero ter explicado o problema com muita clareza.
Por favor, deixe-me saber se isso é realmente possível.
Respostas:
existe uma maneira de fazer isso. você precisa criar um bitmap e um canvas e chamar view.draw (canvas);
aqui está o código:
se a vista não foi exibida antes do tamanho ser zero. É possível medir assim:
EDIT: de acordo com este post , Passar
WRAP_CONTENT
como valor paramakeMeasureSpec()
não faz nenhum bem (embora para algumas classes de exibição funcione), e o método recomendado é:fonte
v.layout(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
obter isso funcione corretamente, mas graças para o código :)v.measure(0, 0); v.getMeasuredWidth(); v.getMeasuredHeight();
.Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
Funciona melhoraqui está a minha solução:
Aproveitar :)
fonte
Tente isso,
fonte
Sei que esse pode ser um problema antigo, mas estava com problemas para que qualquer uma dessas soluções funcionasse para mim. Especificamente, descobri que, se alguma alteração fosse feita na exibição depois de inflada, essas alterações não seriam incorporadas ao bitmap renderizado.
Aqui está o método que acabou funcionando no meu caso. Com uma ressalva, no entanto. antes de ligar,
getViewBitmap(View)
eu inflado minha visualização e solicitei o layout com dimensões conhecidas. Isso foi necessário, já que meu layout de exibição tornaria zero altura / largura até que o conteúdo fosse colocado dentro.O "molho mágico" para mim foi encontrado aqui: https://groups.google.com/forum/#!topic/android-developers/BxIBAOeTA1Q
Felicidades,
Levi
fonte
measure()
elayout()
antes de preencher minha opinião, obtive resultados estranhos. Mover essas chamadas para baixo, acimacreateBitmap()
corrigido para mim!Há uma excelente função de extensão Kotlin no Android KTX:
View.drawToBitmap(Bitmap.Config)
fonte
Espero que isto ajude
O
getDrawingCache()
método Update foi descontinuado no nível da API 28. Portanto, procure outra alternativa para o nível da API> 28.fonte
getDrawingCache
está atualmente obsoleto.Layout ou visualização em bitmap:
Método de chamada:
fonte
Eu acho que isso é um pouco melhor:
Usando o código acima, você não precisa especificar o tamanho do bitmap (use 0 para largura e altura) se quiser usar o da própria exibição.
Além disso, se você deseja converter vistas especiais (SurfaceView, Surface ou Window, por exemplo) em um bitmap, considere usar a classe PixelCopy . Requer API 24 e acima. Eu não sei como fazer isso antes.
fonte
fonte