Desplazamiento horizontal automático en TextView
Tengo la galería de encargo. La galería representa los elementos que son diseño de marco. Hay una imageView y textView encima de ella.
Si texto en textView es demasiado largo, necesito que se desplace automáticamente. Es una línea de texto, y es necesario desplazarse horizontalmente.
- Cómo establecer la sombra alrededor de TextView
- Establecer TextView texto de html-formatted cadena recurso en XML
- Android - Cómo configurar una fuente personalizada para toda la aplicación
- Cómo escribir texto de derecha a izquierda (Texto árabe) en Android?
- Obtener posición absoluta para un desplazamiento dado en TextView (Android)
He encontrado este fragmento de código:
TextView android:text="Single-line text view that scrolls automatically" android:singleLine="true" android:ellipsize="marquee" android:marqueeRepeatLimit ="marquee_forever" android:focusable="true" android:focusableInTouchMode="true" android:scrollHorizontally="true" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
Funciona en mi aplicación de prueba con sólo una vista de texto en ella. Pero no funciona en mi galería. Notando que sucede, el texto se queda quieto.
¿Alguna ayuda?
- Cómo reemplazar elipses con fade / fading edge en textview en Android sdk?
- Almacenar un texto grande y estructurado en la aplicación Android
- Acceso a TextView desde otra clase
- ¿Hay alguna manera de desactivar la función de zoom en los campos de entrada en la vista web?
- Visualización de varias líneas de texto y variables en un AlertDialog mediante setMessage ()
- Zoom textview con imagen y texto (contenido html) en android
- Android: No se puede cambiar el texto aparece en AlertDialog
- Android EditText texto y diseño de sugerencias
Pruebe esta clase personalizada de TextView:
public class AutoScrollingTextView extends TextView { public AutoScrollingTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public AutoScrollingTextView(Context context, AttributeSet attrs) { super(context, attrs); } public AutoScrollingTextView(Context context) { super(context); } @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { if (focused) { super.onFocusChanged(focused, direction, previouslyFocusedRect); } } @Override public void onWindowFocusChanged(boolean focused) { if (focused) { super.onWindowFocusChanged(focused); } } @Override public boolean isFocused() { return true; } }
Y establezca los siguientes atributos XML:
android:scrollHorizontally="true" android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever"
Esto funciona maravillosamente en mis aplicaciones de diccionario donde múltiples entradas pueden necesitar desplazarse automáticamente simultáneamente para mostrar contenido completo.
El efecto de marco en un TextView
sólo está diseñado para funcionar cuando la vista se enfoca o selecciona. El código XML que tiene intenta hacer el TextView
enfocado todo el tiempo. Desafortunadamente, ya que sólo se puede enfocar una vista en cualquier momento, y puesto que tiene varias vistas en la galería, este enfoque no funcionará para usted.
La forma más sencilla de lograr esto es hacer que los TextViews
siempre se seleccionen. Múltiples TextViews
pueden mantener el estado seleccionado al mismo tiempo. Selección está destinado a ser utilizado para un elemento activo de un AdapterView, pero todavía funciona fuera de uno. En primer lugar, elimine los atributos que modifican el foco del XML y luego simplemente llame a TextView.setSelected(true)
algún momento después de que se inicialice la vista, por ejemplo, en Activity.onCreate(Bundle)
(no hay ningún atributo XML para esto). Si está suministrando las vistas desde un adaptador, puede llamar a TextView.setSelected(true)
durante el método getView()
después de inflar la vista.
Aquí hay un ejemplo de proyecto que muestra la carpa que trabaja para múltiples TextViews y el comportamiento dentro de una Galería.
Intente usar ViewPager en lugar de galería. Esto está disponible en paquetes de soporte de android. http://android-developers.blogspot.in/2011/08/horizontal-view-swiping-with-viewpager.html
He intentado todo, y finalmente se me ocurrió esto. Esto funciona para mí … espero que esto te ayude algún día. Aclamaciones.
package com.gui.custom_views; import android.content.Context; import android.graphics.Paint; import android.graphics.Typeface; import android.text.TextUtils; import android.util.AttributeSet; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.LinearInterpolator; import android.view.animation.TranslateAnimation; import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TextView; import com.media_player.AndroidMediaPlayerActivity; /** * Custom Automatic Scrollable Text View * * @author Veljko Ilkic * */ public class AutomaticScrollTextView extends LinearLayout { // Context of application Context context; // TextView private TextView mTextField1; // Horizontal scroll private ScrollView mScrollView1; // Animation on start private Animation mMoveTextOnStart = null; // Out animation private Animation mMoveText1TextOut = null; // Duration of animation on start private int durationStart; // Duration of animation private int duration; // Pain for drawing text private Paint mPaint; // Text current width private float mText1TextWidth; /** * Control the speed. The lower this value, the faster it will scroll. */ public static final int MS_PER_PX = 80; /** * Control the pause between the animations. Also, after starting this * activity. */ public static final int PAUSE_BETWEEN_ANIMATIONS = 0; private boolean mCancelled = false; // Layout width private int mWidth; // Animation thread private Runnable mAnimation1StartRunnable; public AutomaticScrollTextView(Context context) { super(context); init(context); this.context = context; } public AutomaticScrollTextView(Context context, AttributeSet attrs) { super(context, attrs); init(context); this.context = context; } private void init(Context context) { initView(context); // init helper mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setStrokeWidth(1); mPaint.setStrokeCap(Paint.Cap.ROUND); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); mWidth = getMeasuredWidth(); // Calculate prepare(); // Setup setupText1Marquee(); } @Override public void setOnClickListener(OnClickListener l) { super.setOnClickListener(l); mTextField1.setOnClickListener(l); } // Method to finally start the marquee. public void startMarquee() { prepare(); prepareTextFields(); startTextField1Animation(); mCancelled = false; } private void startTextField1Animation() { mAnimation1StartRunnable = new Runnable() { public void run() { mTextField1.setVisibility(View.VISIBLE); mTextField1.startAnimation(mMoveTextOnStart); } }; postDelayed(mAnimation1StartRunnable, PAUSE_BETWEEN_ANIMATIONS); } public void reset() { mCancelled = true; if (mAnimation1StartRunnable != null) { removeCallbacks(mAnimation1StartRunnable); } mTextField1.clearAnimation(); prepareTextFields(); mMoveTextOnStart.reset(); mMoveText1TextOut.reset(); mScrollView1.removeView(mTextField1); mScrollView1.addView(mTextField1); mTextField1.setEllipsize(TextUtils.TruncateAt.END); invalidate(); } public void prepareTextFields() { mTextField1.setEllipsize(TextUtils.TruncateAt.END); mTextField1.setVisibility(View.INVISIBLE); expandTextView(mTextField1); } private void setupText1Marquee() { // Calculate duration of animations durationStart = (int) ((mWidth + mText1TextWidth) * MS_PER_PX); duration = (int) (2 * mWidth * MS_PER_PX); // On start animation mMoveTextOnStart = new TranslateAnimation(0, -mWidth - mText1TextWidth, 0, 0); mMoveTextOnStart.setDuration(durationStart); mMoveTextOnStart.setInterpolator(new LinearInterpolator()); mMoveTextOnStart.setFillAfter(true); // Main scrolling animation mMoveText1TextOut = new TranslateAnimation(mWidth, -mWidth - mText1TextWidth, 0, 0); mMoveText1TextOut.setDuration(duration); mMoveText1TextOut.setInterpolator(new LinearInterpolator()); mMoveText1TextOut.setFillAfter(true); mMoveText1TextOut.setRepeatCount(Animation.INFINITE); // Animation listeners mMoveTextOnStart .setAnimationListener(new Animation.AnimationListener() { public void onAnimationStart(Animation animation) { invalidate(); mTextField1.invalidate(); } public void onAnimationEnd(Animation animation) { if (mCancelled) { return; } mTextField1.startAnimation(mMoveText1TextOut); } public void onAnimationRepeat(Animation animation) { invalidate(); mTextField1.invalidate(); } }); mMoveText1TextOut .setAnimationListener(new Animation.AnimationListener() { public void onAnimationStart(Animation animation) { invalidate(); mTextField1.invalidate(); } public void onAnimationEnd(Animation animation) { if (mCancelled) { return; } } public void onAnimationRepeat(Animation animation) { invalidate(); mTextField1.invalidate(); } }); } private void prepare() { // Measure mPaint.setTextSize(mTextField1.getTextSize()); mPaint.setTypeface(mTextField1.getTypeface()); mText1TextWidth = mPaint.measureText(mTextField1.getText().toString()); setupText1Marquee(); } private void initView(Context context) { setOrientation(LinearLayout.VERTICAL); setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, Gravity.LEFT)); setPadding(0, 0, 0, 0); // Scroll View 1 LayoutParams sv1lp = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); sv1lp.gravity = Gravity.CENTER_HORIZONTAL; mScrollView1 = new ScrollView(context); // Scroll View 1 - Text Field mTextField1 = new TextView(context); mTextField1.setSingleLine(true); mTextField1.setEllipsize(TextUtils.TruncateAt.END); mTextField1.setTypeface(null, Typeface.BOLD); mScrollView1.addView(mTextField1, new ScrollView.LayoutParams( mTextField1.getWidth(), LayoutParams.WRAP_CONTENT)); addView(mScrollView1, sv1lp); } public void setText1(String text) { String temp = ""; if (text.length() < 10) { temp = " " + text + " "; } else { temp = text; } mTextField1.setText(temp); } public void setTextSize1(int textSize) { mTextField1.setTextSize(textSize); } public void setTextColor1(int textColor) { mTextField1.setTextColor(textColor); } private void expandTextView(TextView textView) { ViewGroup.LayoutParams lp = textView.getLayoutParams(); lp.width = AndroidMediaPlayerActivity.getScreenWidth(); textView.setLayoutParams(lp); } }
Encontré este problema una vez y finalmente arreglé el problema llamando .setFocus () en el textView.
Hola Tienes Tag en el propio archivo xml. Y también usar la propiedad Scrollview de FOCUS_DOWN en el archivo java … Hope It helps to u …
Este código está funcionando correctamente para mí.
Scrollview = (ScrollView) findViewById (R.id.scrollview1); Tb2.setTextSize (30);
tb2.setMovementMethod(new ScrollingMovementMethod()); scrollview.post(new Runnable() { public void run() { scrollview.fullScroll(View.FOCUS_DOWN); } });
public class ScrollingTextView extends TextView { public ScrollingTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public ScrollingTextView(Context context, AttributeSet attrs) { super(context, attrs); } public ScrollingTextView(Context context) { super(context); } @Override protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) { if (focused) { super.onFocusChanged(focused, direction, previouslyFocusedRect); } } @Override public void onWindowFocusChanged(boolean focused) { if (focused) { super.onWindowFocusChanged(focused); } } @Override public boolean isFocused() { return true; } } <com.test.autoscroll.ScrollingTextView android:id="@+id/actionbar_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="10dip" android:paddingRight="10dip" android:textSize="16dip" android:textStyle="bold" android:lines="1" android:scrollHorizontally="true" android:ellipsize="marquee" android:text="autoscrollable textview without focus to textview...working...." android:marqueeRepeatLimit="marquee_forever" />
- Detectar actividad del usuario (correr, andar en bicicleta, conducir) usando Android
- Desactivación de la eliminación de notificaciones de Android