Estoy usando un marco para mostrar el texto en uno de mis Actividades. Mi pregunta es, es posible acelerar el ritmo de la carpa por lo que se desplaza a lo largo de la pantalla más rápido. A continuación es mi XML y Java.

TextView et2 = (TextView) findViewById(R.id.noneednum);
    et2.setEllipsize(TruncateAt.MARQUEE);    
    et2.setText("");
    if (num.size() > 0) {
        for (String str : num) {
            et2.append(str + "    ");
        }
    }
    et2.setSelected(true);
}

Y XML:

<TextView
    android:id="@+id/noneednum"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:ellipsize="marquee"
    android:fadingEdge="horizontal"
    android:gravity="center_vertical|center_horizontal"
    android:lines="1"
    android:marqueeRepeatLimit="marquee_forever"
    android:scrollHorizontally="true"
    android:singleLine="true"
    android:text="Large Text"
    android:textColor="#fff"
    android:textSize="140dp" />
code.google.com/p/android/issues/detail?id=6567 y stackoverflow.com/questions/5014578/…
El primer enlace tiene TextView.MARQUEE_SPEED_FAST cannot be resolvedy la segunda opción se ve forma de complejo debe haber una manera más fácil?
El primer enlace es el problema – para una mejora para establecer la marca de velocidad 🙂 el segundo es El enlace a una solución. Supongo que no hay otra forma, pero alguien podría haber resuelto de otra manera…
Se desea aumentar la velocidad de desplazamiento

OriginalEl autor Matt | 2012-01-23

3 Comentarios

  1. 46

    Usted tiene que crear una clase personalizada para desplazarse por el texto:

    ScrollTextView.java

    public class ScrollTextView extends TextView {
    //scrolling feature
    private Scroller mSlr;
    //milliseconds for a round of scrolling
    private int mRndDuration = 10000;
    //the X offset when paused
    private int mXPaused = 0;
    //whether it's being paused
    private boolean mPaused = true;
    /*
    * constructor
    */
    public ScrollTextView(Context context) {
    this(context, null);
    //customize the TextView
    setSingleLine();
    setEllipsize(null);
    setVisibility(INVISIBLE);
    }
    /*
    * constructor
    */
    public ScrollTextView(Context context, AttributeSet attrs) {
    this(context, attrs, android.R.attr.textViewStyle);
    //customize the TextView
    setSingleLine();
    setEllipsize(null);
    setVisibility(INVISIBLE);
    }
    /*
    * constructor
    */
    public ScrollTextView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    //customize the TextView
    setSingleLine();
    setEllipsize(null);
    setVisibility(INVISIBLE);
    }
    /**
    * begin to scroll the text from the original position
    */
    public void startScroll() {
    //begin from the very right side
    mXPaused = -1 * getWidth();
    //assume it's paused
    mPaused = true;
    resumeScroll();
    }
    /**
    * resume the scroll from the pausing point
    */
    public void resumeScroll() {
    if (!mPaused) return;
    //Do not know why it would not scroll sometimes
    //if setHorizontallyScrolling is called in constructor.
    setHorizontallyScrolling(true);
    //use LinearInterpolator for steady scrolling
    mSlr = new Scroller(this.getContext(), new LinearInterpolator());
    setScroller(mSlr);
    int scrollingLen = calculateScrollingLen();
    int distance = scrollingLen - (getWidth() + mXPaused);
    int duration = (new Double(mRndDuration * distance * 1.00000
    / scrollingLen)).intValue();
    setVisibility(VISIBLE);
    mSlr.startScroll(mXPaused, 0, distance, 0, duration);
    invalidate();
    mPaused = false;
    }
    /**
    * calculate the scrolling length of the text in pixel
    *
    * @return the scrolling length in pixels
    */
    private int calculateScrollingLen() {
    TextPaint tp = getPaint();
    Rect rect = new Rect();
    String strTxt = getText().toString();
    tp.getTextBounds(strTxt, 0, strTxt.length(), rect);
    int scrollingLen = rect.width() + getWidth();
    rect = null;
    return scrollingLen;
    }
    /**
    * pause scrolling the text
    */
    public void pauseScroll() {
    if (null == mSlr) return;
    if (mPaused)
    return;
    mPaused = true;
    //abortAnimation sets the current X to be the final X,
    //and sets isFinished to be true
    //so current position shall be saved
    mXPaused = mSlr.getCurrX();
    mSlr.abortAnimation();
    }
    @Override
    /*
    * override the computeScroll to restart scrolling when finished so as that
    * the text is scrolled forever
    */
    public void computeScroll() {
    super.computeScroll();
    if (null == mSlr) return;
    if (mSlr.isFinished() && (!mPaused)) {
    this.startScroll();
    }
    }
    public int getRndDuration() {
    return mRndDuration;
    }
    public void setRndDuration(int duration) {
    this.mRndDuration = duration;
    }
    public boolean isPaused() {
    return mPaused;
    }
    }

    En su diseño escribir como este:

    <yourpackagename.ScrollTextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/scrolltext" />

    En su actividad de escribir como este:

    ScrollTextView scrolltext=(ScrollTextView) findViewById(R.id.scrolltext);
    scrolltext.setText(yourscrollingtext);
    scrolltext.setTextColor(Color.BLACK);
    scrolltext.startScroll();

    Si quieres aumentar la velocidad de desplazamiento, a continuación, reducir el valor de :

    private int mRndDuration = 10000;//reduce the value of mRndDuration to increase scrolling speed
    Es que funcione? se ha trabajado para mí
    para multilenguaje personalizado carpa no está funcionando ? ¿conoces alguna otra manera?
    la velocidad parece bastante al azar
    funcionó muy bien para mí. Pero aquí el próximo desplazamiento se inicia sólo después de la anterior de desplazamiento de los extremos. Ejemplo:digamos que tengo un texto de “ABC”. Su sólo después de la “C” se desplaza fuera de la pantalla(a la izquierda),”A” de la próxima desplazamiento llega a la pantalla(de la derecha).Como resultado me estoy poniendo de una pantalla en blanco después de “C” de la anterior de desplazamiento hasta que se desplaza de distancia.Necesito comenzar la próxima desplazamiento ie “A” de la próxima desplazamiento deben venir a la pantalla justo después de la “C” de la anterior desplazarse entra en la pantalla,así que no hay ningún espacio en blanco después de entre 2 rollos. Espero que me hice claro. Ahora cómo implementar esto?
    Gran respuesta! Dos cosas que me cambió, sin embargo: |1. En la actualidad la velocidad depende del texto de longitud. Para solucionarlo, hacer int duration = (int) (1000f * distance / mScrollSpeed);, donde mScrollSpeed es de alrededor de 100f. |2. Para solucionar problemas con el cambio de velocidad después de la primera ejecución, el inicio de desplazamiento después de que el diseño se calcula uso OnGlobalLayoutListener para que: scrollTextView.getViewTreeObserver().addOnGlobalLayoutListener(new ... {scrollTextView.startScroll();//remove listener after that}});

    OriginalEl autor Ramakrishna

  2. 2

    Código anterior produce un error si el TextView es una instancia de AppCompatTextView. A continuación el código funciona es AppCompatTextView. Probado en la Melcocha.

    public static void setMarqueeSpeed(TextView tv, float speed) {
    if (tv != null) {
    try {
    Field f = null;
    if (tv instanceof AppCompatTextView) {
    f = tv.getClass().getSuperclass().getDeclaredField("mMarquee");
    } else {
    f = tv.getClass().getDeclaredField("mMarquee");
    }
    if (f != null) {
    f.setAccessible(true);
    Object marquee = f.get(tv);
    if (marquee != null) {
    String scrollSpeedFieldName = "mScrollUnit";
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    scrollSpeedFieldName = "mPixelsPerSecond";
    }
    Field mf = marquee.getClass().getDeclaredField(scrollSpeedFieldName);
    mf.setAccessible(true);
    mf.setFloat(marquee, speed);
    }
    } else {
    Logger.e("Marquee", "mMarquee object is null.");
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }

    OriginalEl autor Hitesh Gupta

  3. 0

    Esto funciona para mí. Si f.get(tv) devuelve null, intente llamar a mTextView.setSelected(true) antes de llamar setMarqueeSpeed().
    Original respuesta: Android y un TextView horizontal de la velocidad de desplazamiento de la marquesina

    private void setMarqueeSpeed(TextView tv, float speed, boolean speedIsMultiplier) {
    try {
    Field f = tv.getClass().getDeclaredField("mMarquee");
    f.setAccessible(true);
    Object marquee = f.get(tv);
    if (marquee != null) {
    String scrollSpeedFieldName = "mScrollUnit";
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.L)
    scrollSpeedFieldName = "mPixelsPerSecond";
    Field mf = marquee.getClass().getDeclaredField(scrollSpeedFieldName);
    mf.setAccessible(true);
    float newSpeed = speed;
    if (speedIsMultiplier)
    newSpeed = mf.getFloat(marquee) * speed;
    mf.setFloat(marquee, newSpeed);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    Incapaz de conseguir que esto funcione. ¿Alguien puede confirmar si este es el trabajo ?
    También, cualquier otro método de uso de la reflexión ?

    OriginalEl autor Thomas Nielsen

Dejar respuesta

Please enter your comment!
Please enter your name here