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?
- ¿Cómo usar las cadenas formateadas junto con marcadores de posición en Android?
- Cómo procesar textview para HTML y Linkify
- RequestFocus no funciona
- Cómo asignar el tamaño de texto en el valor de sp usando código java
- Cómo cambiar el texto de TextView en el cambio de texto de EditText?
- Android: Html.fromHtml () problema de método extraño
- XAMARIN (C #) - ¿Hay una manera de subrayar un TextView mediante programación?
- Crear programaticamente fondo textview desde drawable en android
- Establecer desvanecimiento de texto en Android 4.0.3
- Android Hello GridView Tutorial no mostrará imágenes
- Etiqueta: TextLayoutCache Texto: Valor de caché eliminado
- Android TextView ¿Qué hace eleganteTextHeight? (API 21)
- Fondo de desvanecimiento de TextView desplazable
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