Em um layout, quero dimensionar a imagem de plano de fundo (mantendo sua proporção) para o espaço alocado quando a página é criada. Alguém tem uma idéia de como fazer isso?
Estou usando layout.setBackgroundDrawable()
e um BitmapDrawable()
para definir gravity
para recorte e preenchimento, mas não vejo nenhuma opção para dimensionamento.
Respostas:
Para personalizar o dimensionamento da imagem de fundo, crie um recurso como este:
Em seguida, será centralizado na vista, se usado como plano de fundo. Também existem outros sinalizadores: http://developer.android.com/guide/topics/resources/drawable-resource.html
fonte
Você ainda não tentou fazer exatamente o que deseja, mas pode dimensionar um ImageView usando
android:scaleType="fitXY"
e ele será dimensionado para caber no tamanho que você der ao ImageView.
Assim, você pode criar um FrameLayout para o seu layout, colocar o ImageView dentro dele e, em seguida, qualquer outro conteúdo necessário no FrameLayout, além de um fundo transparente.
fonte
Existe uma maneira fácil de fazer isso no drawable:
your_drawable.xml
A única desvantagem é que, se não houver espaço suficiente, sua imagem não será totalmente exibida, mas será cortada, não encontrei uma maneira de fazer isso diretamente de um drawable. Mas a partir dos testes que fiz, ele funciona muito bem e não captura muito da imagem. Você pode jogar mais com as opções de gravidade.
Outra maneira será apenas criar um layout, onde você usará um
ImageView
e definiráscaleType
comofitCenter
.fonte
error: <item> must have a 'name' attribute.
Para manter a proporção, você deve usar
android:scaleType=fitCenter
oufitStart
etc. O usofitXY
não mantém a proporção original da imagem!Observe que isso funciona apenas para imagens com um
src
atributo, não para a imagem de fundo.fonte
Use a imagem como tamanho de fundo para o layout:
fonte
android:scaleType="centerCrop"
funciona.Quando você define o Drawable de um ImageView usando o
setBackgroundDrawable
método, a imagem sempre será dimensionada. Parâmetros comoadjustViewBounds
ou diferentesScaleTypes
serão apenas ignorados. A única solução para manter a proporção que eu encontrei é redimensionar oImageView
depois de carregar o seu drawable. Aqui está o trecho de código que eu usei:No trecho de código acima, bmp é o objeto Bitmap a ser mostrado e imageView é o
ImageView
objeto.Uma coisa importante a ser observada é a alteração dos parâmetros de layout . Isso é necessário porque
setMaxHeight
esetMaxWidth
só fará diferença se a largura e a altura estiverem definidas para quebrar o conteúdo e não para preencher o pai. Fill pai, por outro lado é a configuração desejada no início, porque de outra maneiracontainerWidth
econtainerHeight
ambos têm valores iguais a 0. Assim, no seu arquivo de layout você terá algo parecido com isso para o seu ImageView:fonte
Essa não é a solução com melhor desempenho, mas como sugerido por alguém em vez de segundo plano, você pode criar FrameLayout ou RelativeLayout e usar o ImageView como pseudo segundo plano - outros elementos estarão posicionados simplesmente acima:
O problema do ImageView é que apenas os scaleTypes disponíveis são: CENTER, CENTER_CROP, CENTER_INSIDE, FIT_CENTER, FIT_END, FIT_START, FIT_XY, MATRIX ( http://etcodehome.blogspot.de/2011/05/android-imageview-scaletype-samples.html )
e "redimensionar a imagem de fundo (mantendo sua proporção)" em alguns casos, quando você deseja que uma imagem preencha a tela inteira (por exemplo, imagem de fundo) e a proporção da tela seja diferente da imagem, o scaleType necessário é do tipo de TOP_CROP, porque:
CENTER_CROP centraliza a imagem em escala em vez de alinhar a borda superior com a borda superior da visualização da imagem e FIT_START se ajusta à altura da tela e não preenche a largura. E como o usuário Anke notou, o FIT_XY não mantém a proporção.
Felizmente, alguém estendeu o ImageView para oferecer suporte a TOP_CROP
https://stackoverflow.com/a/14815588/2075875
Agora, o IMHO seria perfeito se alguém escrevesse o Drawable personalizado, que dimensiona uma imagem assim. Então poderia ser usado como parâmetro de fundo.
O novo registro sugere pré-escala do drawable antes de usá-lo. Aqui estão as instruções de como fazê-lo: Java (Android): Como dimensionar um drawable sem Bitmap? Embora tenha desvantagem, esse drawable / bitmap com escala superior usará mais RAM, enquanto o dimensionamento instantâneo usado pelo ImageView não requer mais memória. A vantagem poderia ser menos carga do processador.
fonte
O código Abaixo cria o bitmap perfeitamente com o mesmo tamanho da visualização de imagem. Obtenha a altura e a largura da imagem de bitmap e calcule a nova altura e largura com a ajuda dos parâmetros do imageview. Isso fornece a imagem necessária com a melhor proporção.
fonte
O que Dweebo propôs funciona. Mas, na minha humilde opinião, é desnecessário. Um drawable de fundo é bem dimensionado por si só. A vista deve ter largura e altura fixas, como no exemplo a seguir:
fonte
Uma opção para tentar é colocar a imagem na
drawable-nodpi
pasta e definir o plano de fundo de um layout para o ID do recurso desenhável.Definitivamente, isso funciona com a redução, mas ainda não testei com a redução.
fonte
Kotlin:
Se você precisava desenhar um bitmap em uma Visualização, dimensionado para FIT.
Você pode fazer os cálculos adequados para definir bm a altura igual ao contêiner e ajustar a largura; no caso, a proporção largura / altura bm é menor que a proporção largura / altura do contêiner ou o inverso no cenário oposto.
Imagens:
fonte
você precisará pré-dimensionar esse drawable antes de usá-lo como plano de fundo
fonte
Você pode usar um dos seguintes:
android: gravity = "fill_horizontal | clip_vertical"
Ou
android: gravity = "fill_vertical | clip_horizontal"
fonte