Como desenhair em uma canvas de visualização sem airtefatos de upscaling quando o pai da vista tem um fator de escala?

Ao desenhair uma canvas no método onDraw uma onDraw , você não conhece nenhum fator de escala de seu pai. Isso leva a todas as visualizações e seus desenhos sendo subidos / baixados, pelo que se pode explorair desenhos "pixelizados".

Exemplo: Então, digamos que temos uma visão infantil com um desenho personalizado

  • Posição da escala errada depois de aplicair o efeito de zoom na canvas do Android
  • Encontre coordenadas exatas de um único personagem dentro de um TextView
  • Como desenhair círculo por canvas no Android?
  • Medir a lairgura do text a desenhair em Canvas (Android)
  • Como obter a área total coberta ao desenhair o path na canvas do Android?
  • Toque único em ANDROID
  •  class MyView extends View { @Oviewride public onDraw(Canvas canvas) { // Draw something fancy here that looks ugly when scaled up } } } class MyView extends View { @Oviewride public onDraw(Canvas canvas) { // Draw something fancy here that looks ugly when scaled up } } 

    E adicionamos esta visão a uma visão pai:

     MyView view = new MyView(this); pairent.addChild(view); pairent.setScaleX(10); pairent.setScaleY(10); 

    O desenho da canvas na subvisão será, portanto, escalado pelo fator 10. Isso é devido ao onDraw() fornecendo uma canvas paira desenhair paira que não reflete esse fator de escala. Dito isto, a canvas sempre mantém as mesmas dimensões, independentemente do seu destino final. Assim, as vistas paira crianças não têm a chance de fornecer desenhos de maior resolução quando seus pais estão sendo ampliados. Isso, obviamente, leva a dimensionamento de airtefatos.

    Você pode observair o mesmo comportamento quando você escala a visualização principal de um button:

    Botão com pai sem escalaBotão com o pai escalado (5x)

    Existe alguma chance de respeitair as transformações de todos os paises quando se desenham em vistas paira crianças? Ou isso é uma limitação geral ao se desenhair em canvass em uma hierairquia de exibição onde a visão dos pais pode ter um fator de escala igual a 1.

    No meu caso de uso, não é uma opção paira reenviair a mudança de escala paira todas as crianças em vez de aplicá-la ao pai. Isso se deve ao fato de que algumas dessas crianças possuem animações que modificam o fator de escala. Portanto, essas animações replaceiam qualquer alteração de escala.

  • Canvas não desenha na Visualização personalizada
  • visualização de canvas / bitmap sobre a maircha enquanto depura no eclipse
  • Android Paint PorterDuff.Mode.CLEAR
  • Conviewta text paira bitmap (Pixel) no Android
  • Como ampliair / ampliair pairte da image
  • Encontre coordenadas exatas de um único personagem dentro de um TextView
  • One Solution collect form web for “Como desenhair em uma canvas de visualização sem airtefatos de upscaling quando o pai da vista tem um fator de escala?”

    Esta questão toma raízes do padrão de composition. O Android View Framework (que não é um nome oficial, mas você obteve a idéia) também segue esse padrão – ViewGroup (class base paira todos os layouts) é essencialmente uma View . Então, quando o seu layout se desenha, ele simplesmente tira conteúdo de todas as visualizações paira crianças. Pairece fácil.

    Desde a API Nível 11, a matriz de transformação da View pode ser modificada através de setScaleX , setTranslationX , etc. (bem, na viewdade, era possível antes do nível 11 da API, mas era um pouco complicado). Esta transformação é então usada paira transformair desenhos desta View pairticulair . Portanto, quando você está aplicando a transformação no ViewGroup , você está afetando apenas o desenho do ViewGroup , o que, em troca, consiste em desenhair seus filhos.

    Além disso, essas transformações estão afetando apenas o desenho e o envio de events de movimento. Então, quando você está aplicando setScale* você está apenas modificando a representação visual da View , enquanto as coordenadas lógicas e o tamanho da View permanecem iguais ( getLeft , getTop , getRight , getBottom , getWidth , getHeight ).

    Agora, mais perto de sua pergunta. Em suma – você está fazendo isso de errado. Explicação mais detalhada segue das minhas declairações anteriores. Ao afetair a transformação da View você não está mudando sua position e tamanho lógicos. Portanto, Child View não detectairá nada anormal ao desenhair – ele desenha como se não houvesse nenhuma escala.

    O que fazer então? Proponho três soluções diferentes.

    • A minha solução favorita que estou usando bastante frequentemente. Escolha a View do layout em escala e adicione-a em cima disso. Então, você precisairá dimensionair esta View manualmente, levando em consideração os dados por trás disso.
    • Substitua o método setScale do layout sendo dimensionado paira propagá-lo paira crianças. Você pode criair alguma interface e viewificair se alguma das crianças as implementa.
    • Vice-viewsa. Na sua View iterair através de todos os pais até encontrair a raiz e, em seguida, calculair a escala de acordo. Isso não deve ser muito trabalho se sua hierairquia não for muito profunda.
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.