PDA

Ver la Versión Completa : [ CONSULTA ] Poner un texto deslizable de derecha a izquierda


LEAJIM_454
03/11/14, 00:25:44
Hola, no se si me dejo entender quisiera hacer un textview de una sola linea que tenga entrada y salida osea que aparesca desde un lado y desaparesca en el otro, me gustaria que alguien me diga si esto se puede hacer de forma nativa o necesito de alguna libreria gracias de antemano...

rafaxplayer
03/11/14, 08:47:06
con xml se puede sin problemas y uasndo AnimationUtils.loadanimation() , yo he echo alguna intro sencilla , los archivos se guardan en res/anim.

Hay muchos ejemplos en la red por ejemplo:

http://appsmolonas.com/efectos-de-animacion-en-android-el-interpolador/

http://developer.android.com/guide/topics/graphics/view-animation.html

kriogeN
03/11/14, 16:32:08
Es mucho más fácil que todo eso, basta con indicar que su "ellipsize" es "marquee" y "marqueeRepeatLimit" con "marquee_forever".

Eso si, sólo funciona si es el elemento seleccionado, lo que yo hago es crear una subclase de TextView y sobreescribir el método isFocused para que siempre responda true. Funciona de lujo, incluso con varios elementos con marquesina al mismo tiempo.

rafaxplayer
03/11/14, 16:50:32
ostras eso no lo conocia, un ejemplillo estaría bien kriogen

kriogeN
03/11/14, 22:37:56
ostras eso no lo conocia, un ejemplillo estaría bien kriogen

Realmente no es mucho más de lo que ya he dicho.

Creas una View que herede de TextView y haces que isFocused siempre devuelva true.

Luego usas esa View en lugar del TextView, y le pones como propiedades en el Layout:

android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:focusable="true"
android:focusableInTouchMode="true"

Y ya está, si el texto ocupa más que la línea hará el efecto marquesina y se irá mostrando el texto que falta. Cuando llegue al final volverá a empezar a salir el texto inicial.

El efecto sólo se producirá si realmente el texto ocupa más que la línea, sino se comportará como un TextView normal.

rafaxplayer
03/11/14, 23:32:11
aja te explico la idea que se me ocurre..
Esto lo puedo hacer con un textview normal? mi idea es que en una lista los items llevan un textview que es una descripcion y esta segun resolucion es muy larga si lo pongo en single lin podria hacer este efecto.
como lo ves ? funcionara en el textview o tengo que crear un view?

kriogeN
03/11/14, 23:36:01
El problema es que sólo funciona si el elemento está seleccionado, por eso lo de hacer la subclase con "isFocused" devolviendo siempre true, así engañas al sistema y piensa que el elemento está seleccionado aunque no lo esté y hace el efecto marquesina.

Desde luego si vas a ponerlo en un ListView y hay varios a la vez que pueden hacer el efecto, tienes que usar la subclase.

rafaxplayer
04/11/14, 00:45:09
ok ,hare pruevas

rafaxplayer
04/11/14, 08:20:44
Bueno despues de varias pruevas no me funciona , este es mi codigo

XML

<TextView
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="Small Text"
class="com.rafaxplayer.amsfiles.classes.marqueTextView"
android:id="@+id/marquetext"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:focusable="true"
android:focusableInTouchMode="false" />

La clase:

public class marqueTextView extends TextView {

public marqueTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
public boolean isFocused() {
return true;
}
}

todo bien pero aunque el texto se mas grande no hace marque , solo lo esconde.

LEAJIM_454
05/11/14, 06:24:44
La tarjeta madre de mi ordenador se quemo por eso no pude responder, muchas gracias por su ayuda a todos lo probare en estos dias en cuanto me compre otro gracias nuevamente todo lo que viene de ustedes es de mucha ayuda.

LEAJIM_454
05/11/14, 09:11:29
Hola muchas gracias lo probe en la PC de mi hermana pero no sale como yo esperaba use la pagina de ejemplo para guiarme, se anima y todo pero no muestra el texto completo alguna idea? dejo mi codigo por si alguien puede ayudarme muchas gracias

Este es el layout de mi actividad
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.JimSoft.Entertainment.edu.ChemistryTable.MainA ctivity"
android:orientation="vertical">

<TextView
android:id="@+id/TextoAnimable"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Una enboltura de un chocolate tarda en degradarse entre 2000 a 5000 años, tirala en su correspondiente contenedor para no contaminar."
android:lines="1"/>

<Spinner
android:id="@+id/interpolador"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
/>

</LinearLayout>

Este es mi codigo java

package com.JimSoft.Entertainment.edu.ChemistryTable;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.Spinner;
import android.widget.TextView;

public class MainActivity extends Activity {

TextView Texto;
Animation animacion1;
Spinner combo_spinner;

int [] interpolador = {
R.anim.acelerador

};

String [] interpolador_nombre = {
"accelerate"
};
ArrayAdapter<String> combo_adaptador;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);


Texto = (TextView) findViewById( R.id.TextoAnimable);

combo_adaptador = new ArrayAdapter<String> (
this,
android.R.layout.simple_spinner_item,
interpolador_nombre);

combo_spinner = (Spinner) findViewById(R.id.interpolador);
combo_spinner.setAdapter(combo_adaptador);
combo_spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

@Override
public void onItemSelected(AdapterView<?> padre, View arg1,
int position, long id) {

animacion1 = AnimationUtils.loadAnimation(
MainActivity.this,
interpolador[position]);

//animacion1.setStartTime(1000);
Texto.startAnimation(animacion1);

}

@Override
public void onNothingSelected(AdapterView<?> padre) {
// TODO Auto-generated method stub

}

});
}
}

Y finalmente este es el xml de la animacion
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_interpolator">
<translate
android:fromXDelta="-100%p"
android:toYDelta="0"
android:duration="12000"
android:repeatCount="infinite"/>
</set>

Muchas gracias por toda la ayuda proporcionada.

rafaxplayer
05/11/14, 16:53:04
Bueno al final lo conseguí. no me funcionaba con la custom class de textview que comentaba kriogen es mas fácil de la forma que muestro lo único que hay que seleccionar el textview para que xute y no es esa mi solucion.

el xml es este :

<TextView
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="Small Text"
class="com.rafaxplayer.amsfiles.classes.marqueTextView"
android:id="@+id/marquetext"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:focusable="true"
android:focusableInTouchMode="false" />

Lo que en el listenerclick del item en concreto hay que establecer el textview en selected=true.

kriogeN
06/11/14, 10:01:05
Bueno al final lo conseguí. no me funcionaba con la custom class de textview que comentaba kriogen es mas fácil de la forma que muestro lo único que hay que seleccionar el textview para que xute y no es esa mi solucion.

el xml es este :

<TextView
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="Small Text"
class="com.rafaxplayer.amsfiles.classes.marqueTextView"
android:id="@+id/marquetext"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:focusable="true"
android:focusableInTouchMode="false" />

Lo que en el listenerclick del item en concreto hay que establecer el textview en selected=true.

Claro, ya te lo he dicho en el otro post, hay que engañar al sistema para que crea que siempre está Focused.

Yo en el XML lo defino así:

<com.rafaxplayer.amsfiles.classes.marqueTextView
android:layout_width="200dp"
android:layout_height="wrap_content"
android:text="Small Text"
android:id="@+id/marquetext"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:focusable="true"
android:focusableInTouchMode="true" />

LEAJIM_454
07/11/14, 01:00:30
KriogeN eres lo maximo me funcionó de maravilla, el unico problema fue que tuve que cambiar el width a fill_parent por que no me mostraba todo el texto, gracias por tu ayuda.

LEAJIM_454
07/11/14, 20:35:59
Hola de nuevo busque por todas partes comenzando por Stack over flow y no encontre nada, podrias decirme por favor como puedo hacer para cambiar el texto una vez que haya terminado pero el marque continue su animación no se si me entiendes... Gracias de antemano.

kriogeN
07/11/14, 20:42:42
Hola de nuevo busque por todas partes comenzando por Stack over flow y no encontre nada, podrias decirme por favor como puedo hacer para cambiar el texto una vez que haya terminado pero el marque continue su animación no se si me entiendes... Gracias de antemano.

No. No te entiendo.

¿Te refieres a hacer un setText nuevo cuando el marquee haya terminado?

LEAJIM_454
08/11/14, 06:35:49
No. No te entiendo. ¿Te refieres a hacer un setText nuevo cuando el marquee haya terminado?

Si, exactamente eso, setText pero no se como hacerlo... ¿podrias guiarme por favor?

gonza28
16/02/15, 16:37:59
Ya hice todo bien.
Pero tengo un problema:
El texto no llega a verse hasta el final. Ates de llegar al final, se repite la animacion desde el principio. Claro, texto de unos 90 caracteres. una o 2 palabras antes se reinicia la cuestion.

xml:

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Ejemplo."
gn28:cust_font="Chelsea"
android:textColor="@color/white"
android:id="@+id/textMarquee"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:focusable="true"
android:focusableInTouchMode="false"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:paddingLeft="10dip"
android:paddingRight="10dip" />

En la actividad:

textMarquee=(TextView)findViewById(R.id.textMarque e);
textMarquee.setSelected(true);
//textMarquee.setSingleLine();
textMarquee.isFocused();