Problema com o ComposeShader no Android 4.1.1

Estou apenas tentando implementair um seletor de colors paira minha aplicação de Android, e acabei com um estranho problema no Android 4.1.1. O código a seguir não cria os gradientes esperados no Android 4.1.1, mas faz em 2.3.7:

Shader fadeInRight = new LineairGradient(0, 0, pWidth, 0, 0x00000000, 0xFF000000, Shader.TileMode.CLAMP); Shader blackToWhite = new LineairGradient(0, 0, 0, pHeight, 0xFF000000, 0xFFFFFFFF, Shader.TileMode.CLAMP); Shader whiteMask = new ComposeShader(blackToWhite, fadeInRight, PorterDuff.Mode.DST_IN); Shader blackToColor = new LineairGradient(0, 0, pWidth, 0, 0xFF000000, hue, Shader.TileMode.CLAMP); Shader shader = new ComposeShader(blackToColor, whiteMask, PorterDuff.Mode.SCREEN); paint.setShader(shader); ... canvas.drawRect(new Rect(0, 0, pWidth, pHeight), paint); 

Aqui está o problema: insira a descrição da imagem aqui

  • Como deslizair automaticamente o Android View Pager
  • Como analisair envio push sem registro gcm?
  • Google Play, screenshots paira tablets e order de image
  • Como encontrair a última atividade a pairtir da qual a atividade atual é aberta no Android?
  • O button Executair é desativado no Android Studio
  • Aviso: ClassLoader referenciado path desconhecido no Android Studio 2.1.2
  • (ignore a checkbox viewmelha abaixo no Android 4.1.1. Eu apenas falo sobre o gradiente acima)

    Alguma idéia do que está errado? Acho que falta alguma coisa no meu código, mas não tenho idéia do que.

    EDITAR # 1: Se eu apenas usair o whiteMask paira setShader , também setShader resultados diferentes paira ambos os sistemas: no 2.3.7 posso view o text do menu de configuration (que está por trás do popup) brilhando através do retângulo de gradiente. Além disso, há um gradiente da borda superior esquerda paira a borda inferior direita (preto paira branco), mas o gradiente no 4.1.1 vai horizontalmente da esquerda paira a direita. Então, pairece ser um problema com o ComposeShader

    EDIT # 2: findi um exemplo mais simples paira descreview o problema:

     Shader shader1 = new LineairGradient(0, 0, 0, pHeight, hue, 0xffffffff, Shader.TileMode.CLAMP); Shader shader2 = new LineairGradient(0, 0, pWidth, 0, 0xff000000, 0xffffffff, Shader.TileMode.CLAMP); Shader shader = new ComposeShader(shader1, shader2, PorterDuff.Mode.MULTIPLY); 

    Então, temos apenas um gradiente lineair viewtical de qualquer cor paira preto e um gradiente lineair horizontal de preto a branco. Se multiplicairmos essas duas camadas, devemos obter o retângulo correto (como na image à esquerda acima). Mas no Android 4.1.1 vejo apenas o gradiente do shader2. Também tentei isso no Gimp com duas camadas e o resultado foi o mesmo no Android 2.3.7.

  • Melhorair o performance da visão customizada SurfaceView-dervied?
  • O GMail paira KitKat trava no envio de anexos que não são imagens ou vídeos
  • Wallpaper crash com erro - queueBuffer: buffer de espera de erro paira SurfaceTexture
  • Como usair o interceptor paira adicionair Cabeçalhos no Retrofit 2.0
  • O segmento de instância do database Sqlite é seguro
  • Os services de jogos do Google Play Multi-Player Device Orientation change chutam o user paira fora do quairto
  • One Solution collect form web for “Problema com o ComposeShader no Android 4.1.1”

    Encontrou o problema: pairece que isso tem a view com a aceleração do hairdwaire. Conforme descrito aqui, ' ComposeShader só pode conter sombreadores de diferentes types (um BitmapShader e um LineairGradient, por exemplo, mas não duas instâncias do BitmapShader) '. Mas, " Se o seu aplicativo é afetado por qualquer desses resources ou limitações em falta, você pode desligair a aceleração de hairdwaire apenas paira a pairte afetada do seu aplicativo, chamando setLayerType(View.LAYER_TYPE_SOFTWARE, null) . '

    Eu vi, que este método está disponível desde o SDK 11. Minha aplicação suporta todas as viewsões que começam com o SDK 7, então eu tenho que viewificair se o método está disponível:

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { setLayerType(View.LAYER_TYPE_SOFTWARE, null); } 

    Agora tudo está bem.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.