Sombra larga de Android TextView

He estado intentando esto desde la mañana, pero no puedo conseguir que funcione.

Lo que estoy tratando de hacer es crear un poco como sombra larga para el TextView, que es similar a lo siguiente:

Http://www.iceflowstudios.com/v3/wp-content/uploads/2013/07/long_shadow_banner.jpg http://web3canvas.com/wp-content/uploads/2013/07/lsd-ps-action-720×400 .png

Mi solución hasta ahora era crear una gran cantidad de TextViews y conectarlos en cascada entre sí, pero hay un montón de problemas de rendimiento si voy con la forma actual.

Otra solución es el uso de una fuente personalizada que tiene ese atractivo similar, pero no puedo encontrar ninguno que coincida con la fuente que estoy utilizando actualmente.

Así que me preguntaba, ¿es posible utilizar: (Tengo que mencionar, las vistas de texto se crean dinámicamente)

TV.setShadowLayer(1f, 5f, 5f, Color.GREY); 

Para crear varios de ellos en una línea (como una capa en cascada), haciendo que la sombra parezca suave? ¿O sugieren alguna otra solución?

Gracias por adelantado.

3 Solutions collect form web for “Sombra larga de Android TextView”

Intente jugar con imágenes raster:

  1. Detectar límites del texto mediante el método Paint.getTextBounds()
  2. Crear Bitmap transparente con métricas tales (W + H) x H (puede utilizar Bitmap.Config.ALPHA_8 para optimizar el uso de memoria)
  3. Dibujar texto en este Bitmap de Bitmap en la posición 0x0
  4. Copiar la primera fila de Bitmap de Bitmap en uno nuevo con ancho original, pero con una altura de 1px
  5. Itere sobre el Y-axis del Bitmap de Bitmap (de arriba a abajo) y dibuje un Bitmap de Bitmap línea con el desplazamiento correspondiente por X-axis (extraerá algunos píxeles transparentes)
  6. Ahora tienes la parte superior de tu sombra
  7. Dibuje la parte inferior usando la misma técnica, pero eligiendo la última fila de este Bitmap

Este algoritmo puede ser optimizado si detecta que todos los píxeles de la última fila tienen el mismo color (sombra completa).

ACTUALIZACIÓN 1

Logré tal resultado usando esta solución rápida:

Introduzca aquí la descripción de la imagen

MainActivity.java

 import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity { @Override protected void onCreate(Bundle state) { super.onCreate(state); LongShadowTextView longShadow = new LongShadowTextView(this); longShadow.setText("Hello World"); setContentView(longShadow); } } 

LongShadowTextView.java

 import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.RectF; import android.view.View; public class LongShadowTextView extends View { private Bitmap mBitmap; private String mText; public LongShadowTextView(Context context) { super(context); } public void setText(String text) { Paint paint = new Paint(); // TODO provide setters for these values paint.setColor(Color.BLACK); paint.setTextSize(142); Rect rect = new Rect(); paint.getTextBounds(text, 0, text.length(), rect); Bitmap bitmap = Bitmap.createBitmap(rect.width() + rect.height(), rect.height(), Bitmap.Config.ALPHA_8); Canvas canvas = new Canvas(bitmap); canvas.drawText(text, 0, rect.height(), paint); Rect src = new Rect(); RectF dst = new RectF(); int w = bitmap.getWidth(); int h = bitmap.getHeight(); src.left = 0; src.right = w; for (int i = 0; i < h; ++i) { src.top = i; src.bottom = i + 1; dst.left = 1; dst.top = i + 1; dst.right = 1 + w; dst.bottom = i + 2; canvas.drawBitmap(bitmap, src, dst, null); } mText = text; mBitmap = bitmap; } @Override protected void onDraw(Canvas canvas) { canvas.drawBitmap(mBitmap, 0, 0, null); } } 

ACTUALIZAR 2

Aquí está el resultado final que logré. Clonar esta demo de github.

Introduzca aquí la descripción de la imagen

Me temo que su enfoque sugerido de usar setShadowLayer() no funcionará como este enfoque efectivamente dibuja un segundo TextPaint con borrosa.

Superponer varios TextPaints uno encima del otro significará esencialmente que necesitas compensarlo en 1px para cada paso, lo cual es muy intenso gráficamente y tendrá un rendimiento muy bajo.

Esta es una excelente pregunta y un verdadero desafío!

La única solución que viene a la mente es manejar cada glifo independientemente, inspeccionando todos los elementos de la trayectoria y extendiendo una sombra entre el punto más bajo inferior izquierdo y superior derecho. Esto parece muy complicado, y no sé si hay alguna mecánica en el SDK que facilite un enfoque como ese.

Lectura sugerida:

  • Esta pregunta aborda la obtención de trayectorias de glifo de TTFs.
  • Esta respuesta ilustra cómo se puede aprovechar el uso de rutas de acceso , aunque se trata de un enfoque de JavaScript.

Pequeño comentario si alguien intenta ejecutar el método setText (). No está funcionando ahora. Debe llamar a invalidate (); En setText (); método

  public void setText(String value) { boolean changed = mText == null && value != null || mText != null && !mText.equals(value); mText = value; if (changed) { refresh(); } invalidate(); } 
  • XML de Android: se desplaza entre campos EditText
  • El contenido favorito no se muestra correctamente en la vista web
  • Programar '? SelectableItemBackground' en la vista de Android
  • Sintaxis de sentencias condicionales en el diseño XML de Android
  • Android - Creación de una máscara circular en vídeo
  • Declaración de atributos elegibles en Android
  • ¿Puede un ToggleButton cambiar la funcionalidad de otros botones en la misma Actividad?
  • Barra de herramientas superpone la barra de estado
  • Android: Qué práctica es mejor para usar CoordinatorLayout
  • Equivalencia de setTag (clave, valor) en XML
  • Vista emergente de Android No funciona
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.