Cómo girar un drawable con anti-aliasing habilitado

Necesito girar un ImageView por unos pocos grados. Estoy haciendo esto subclassing ImageView y sobrecarga onDraw()

 @Override protected void onDraw(Canvas canvas) { canvas.save(); canvas.scale(0.92f,0.92f); canvas.translate(14, 0); canvas.rotate(1,0,0); super.onDraw(canvas); canvas.restore(); } 

El problema es que la imagen que los resultados muestran un montón de jaggies.

Http://img.skitch.com/20100608-gmdy4sexsm1c71di9rgiktdjhu.png

¿Cómo puedo antialias un ImageView que necesito rotar para eliminar jaggies? ¿Hay una mejor manera de hacer esto?

5 Solutions collect form web for “Cómo girar un drawable con anti-aliasing habilitado”

Si sabe que Drawable es un BitmapDrawable, puede utilizar el anti-aliasing en Paint del mapa de bits para hacer algo como lo siguiente:

 /** * Not as full featured as ImageView.onDraw(). Does not handle * drawables other than BitmapDrawable, crop to padding, or other adjustments. */ @Override protected void onDraw(Canvas canvas) { final Drawable d = getDrawable(); if( d!=null && d instanceof BitmapDrawable && ((BitmapDrawable)d).getBitmap()!=null ) { final Paint p = new Paint(Paint.ANTI_ALIAS_FLAG); final int paddingLeft = getPaddingLeft(); final int paddingTop = getPaddingTop(); canvas.save(); // do my rotation and other adjustments canvas.scale(0.92f,0.92f); canvas.rotate(1,0,0); if( paddingLeft!=0 ) canvas.translate(paddingLeft,0); if( paddingTop!=0 ) canvas.translate(0,paddingTop); canvas.drawBitmap( ((BitmapDrawable)d).getBitmap(),0,0,p ); canvas.restore(); } } 

Establezca antialias y filterBitmap en la pintura que dibuja el mapa de bits. Tuve un problema similar y esto funcionó para mí:

 Paint bitmapPaint = new Paint(); bitmapPaint.setAntiAlias(true); bitmapPaint.setFilterBitmap(true); 

Hice lo siguiente para que funcionara:

En AndroidManifest.xml habilité hardware-acceleration <application android:hardwareAccelerated="true"> .

En lugar de utilizar un método de dibujo personalizado, cambié el tipo de capa de la vista padre por aceleración por hardware con el anti-alias activado y agregé mis subviews de la siguiente manera:

 Paint layerPaint = new Paint(); layerPaint.setAntiAlias(true); layerPaint.setFilterBitmap(true); layerPaint.setDither(true); RelativeLayout parentLayout = (RelativeLayout) LayoutInflater.from(context).inflate(R.layout.myLayout, null); parentLayout.setLayerType(View.LAYER_TYPE_HARDWARE, layerPaint); parentLayout.addView(myChildView); 

Tengo que añadir que el recorte no se puede desactivar cuando se utiliza este enfoque.

Esta rotación resuelve sólo una parte del problema – bordes dentados, pero la imagen en su lugar se convirtió en extraño.

Ifound sólo una solución aún: en el método de sorteo de sorteo o despacho

  Bitmap bmp = ((BitmapDrawable)image.getDrawable()).getBitmap(); double scale = (0.0+bmp.getWidth()+40.0)/getWidth(); if (scale > 1){ bmp = Bitmap.createScaledBitmap(bmp, getWidth()-40, (int) (bmp.getHeight()/scale), true); } canvas.drawColor(Color.TRANSPARENT); canvas.save(); canvas.translate(20, yShift); int left = borderSize; int top = borderSize; int right = bmp.getWidth() - borderSize; int bottom = bmp.getHeight() - borderSize; if(showText){ mPaint.setColor(Color.WHITE); canvas.rotate(getAngel()); canvas.drawRect(left, top, right, bottom, mPaint); canvas.translate(0,0); textFrame.draw(canvas); }else{ // rotaed bitmap mMatrix.setRotate(getAngel()); // draw bitmap after creation of new rotated bitmap from rotated matrix canvas.drawBitmap(Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), mMatrix, true) , 0, 0, mPaint); } canvas.restore(); 

Solución @ Primoz990 trabajó para mí 🙂 También habilité Dithering, por lo que mi código final que elimina los bordes dentados en la rotación es la siguiente:

 Paint bitmapPaint = new Paint(); bitmapPaint.setAntiAlias(true); bitmapPaint.setFilterBitmap(true); bitmapPaint.setDither(true); 
  • ¿Por qué no funciona setVisibility después de animar una vista?
  • Aplicar una animación a varias vistas al mismo tiempo
  • La aplicación que utiliza libgdx se reinicia siempre que el dispositivo gira
  • ¿Por qué querría alguna vez `setRetainInstance (false)`? - O - La forma correcta de manejar la rotación del dispositivo
  • Comportamiento extraño con el sensor de orientación de Android
  • DialogFragment en Fragmento con rotación de pantalla
  • Android: gira todo el diseño
  • Rotar diseño de trama que contiene botones dinámicos
  • Cómo rotar el mapa de bits correctamente?
  • Cómo girar cuatro sprites al foco de estos sprites
  • Android Instrumentación Botón HOME
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.