Cómo invertir la dirección de la marquesina de un TextView
Quiero invertir la dirección de la marquesina en el TextView. Por defecto, el texto se mueve de derecha a izquierda, quiero que se mueva de izquierda a derecha. ¿Cómo puedo hacer esto?
- Dpi valor de "grandes", "medio" y "pequeño" vistas de texto android
- Cómo alinear verticalmente texto en un TextView con Compound Drawable
- ¿Cuáles son la semántica de cada constante de InputType?
- Cómo aplicar sombra a ImageView?
- Paginación de texto en Android
- Establecer el estilo TextView (en negrita o en cursiva)
- Añadir "Ver más" al final de textview después de 3 líneas
- Flujo textview alrededor de la imagen
- Android: establece el texto en TextView
- Espacio de ancho cero con charecters especiales
- El tamaño de fuente de TextView en la aplicación Android cambia al cambiar el tamaño de la fuente de la configuración nativa
- Cómo establecer un texto sobre una imagen?
- Detectar si TextView abarca más de 2 líneas
Me imaginé una manera muy simple y fácil de hacer esto. Hice un efecto de carpa para moverse en ambas direcciones dependiendo de nuestra selección. Así que, aquí está el truco:
Utilicé un TextView dentro de un HorizontalScrollView. Controlé su desplazamiento de forma programática. Conseguí la longitud del texto usando:
scroll_pos = (int)myTextView.getLayout().getLineWidth(0);
Luego utilicé Handler y lo llamé recursivamente hasta llegar al límite de desplazamiento. En este controlador hice mi HorizontalScrollView para desplazarse a una cierta posición:
Handler hHandler = new Handler() { @Override public void handleMessage(Message msg) { hScroll.scrollTo(scroll_pos, 0); scroll_pos--; if(scroll_pos >= 0) hHandler.sendEmptyMessage(0); } };
Y aquí va, una marquesina suave de izquierda a derecha. ¡Aclamaciones!
Otra forma sencilla es usar HTML y también se puede cambiar de dirección fácilmente direction="Left"
<html><body><FONT COLOR="#000000" ><marquee id="mrqSlogan" direction="Left" style="width: auto;" >text your</marquee></FONT></body></html>
Y pasar a WebView
webView.loadDataWithBaseURL(null, yourhtmltext, "text/html" , null, null);
Finalmente encontré la MEJOR solución aquí: https://github.com/Torob/MarqueeView
Gracias a torob.ir (es un persa mejor motor de búsqueda de precios)
Para usar esta biblioteca:
- Simplemente agregue este archivo java ( MarqueeView.java ) a su carpeta java del proyecto
-
En su disposición del xml puso su TextView dentro de este MarqueeView como esto:
<your.packagename.MarqueeView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/horizontalScrollView" android:scrollbars="none" android:visibility="visible" android:clickable="false"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/test" android:id="@+id/scrollingtext" android:singleLine="true" android:focusable="false" android:focusableInTouchMode="false" android:paddingRight="25dp" android:paddingLeft="25dp" /> </your.packagename.MarqueeView>
La funcionalidad que está buscando no parece estar disponible en este momento.
Usted podría crear su propio texto de la marquesina reversa de la fuente en TextView.java pero hay bastantes referencias a la "marquesina" dentro de ella. He contado más de 50 por lo que puede tomar algún tiempo para invertir la dirección de desplazamiento.
Pensé que un poco de apoyo de idioma bidireccional podría permitirle engañar a la textview en desplazamiento de izquierda a derecha, pero Android no parece apoyar RTL idiomas muy bien.
Por ahora su única opción sería aceptar la dirección de la marquesina o crear su propia clase TextView que admita su funcionalidad.
Miraría esta sección de la línea 3810 – 3815
if (mMarquee != null && mMarquee.isRunning()) { canvas.translate(-mMarquee.mScroll, 0.0f); }
Eliminando el signo menos antes de mMarquee se convierte en:
if (mMarquee != null && mMarquee.isRunning()) { canvas.translate(mMarquee.mScroll, 0.0f); }
Obvously usted necesitará hacer cambios adicionales pero esto le señalaría en la dirección correcta (literalmente).
Te sugiero que crees tu propio componente con este comportamiento.
Así: ViewFlipper con un único TextView como su hijo (con el texto mostrado).
flipper.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.marquee_in)); flipper.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.marquee_out));
Marquee en:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="0%p" android:toXDelta="-100%p" android:duration="1500"/> </set>
Marquee fuera:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromXDelta="100%p" android:toXDelta="0%p" android:duration="1500"/> </set>
Tienes que ajustar un poco la duración para que parezca una animación "nativa". Todos los derechos reservados
Aquí está la solución:
Establecer en el archivo de diseño:
<TextView android:id="@+id/textId" android:layout_width="fill_parent" android:layout_height="wrap_content" android:textColor="#337700" android:textSize="20px" android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever" android:singleLine="true" android:textStyle="bold" android:text="Download Form for Different Vehiecle Purposes ....!!!"> </TextView>
Y establecer esto en la actividad:
tv = (TextView) findViewById(R.id.textId); tv.setSelected(true);
En mi caso esto está moviendo el texto de derecha a izquierda.
Para el texto de derecha a izquierda para cada uno de usar: probar esto:
TextView tv = (TextView) findViewById(R.id.txt); Rect bounds = new Rect(); Paint textPaint = tv.getPaint(); String text = tv.getText().toString(); textPaint.getTextBounds(text, 0, text.length(), bounds); int width = bounds.width(); LinearLayout.LayoutParams lp = (LayoutParams) tv.getLayoutParams(); lp.width = width + 100; int startX = 300; TranslateAnimation ta = new TranslateAnimation(startX, lp.width, 0, 0); ta.setDuration(20000); ta.setRepeatCount(-1); tv.setAnimation(ta);
- Android: apertura de la actividad de SMS con múltiples destinatarios especificados
- LocationManager.getLastKnownLocation () return null