解决Android跑马灯不动问题

布局配置

首先来看一下请的布局吧:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    style="@style/LayoutFFStyle"
    android:orientation="vertical" 
    android:background="#F6F4EE">

    <RelativeLayout 
        style="@style/LayoutFWStyle"
        android:layout_gravity="center_vertical"
        android:gravity="center_vertical"
        android:background="#EEEEEE"
        android:paddingTop="5dip"
        android:paddingBottom="5dip">

        <LinearLayout 
            style="@style/LayoutWFStyle"
            android:orientation="horizontal"
            android:layout_alignParentLeft="true"
            android:layout_margin="10dip">

            <TextView 
                android:layout_width="100dip"
                android:layout_height="wrap_content"
                android:textColor="#000000"
                android:text="AppBlog.CN APP开发技术博客, AppBlog.CN APP开发技术博客"
                android:ellipsize="marquee"   
                android:focusable="true"   
                android:marqueeRepeatLimit="marquee_forever"   
                android:focusableInTouchMode="true"   
                android:scrollHorizontally="true"
                android:textSize="18sp"
                android:singleLine="true"
                android:layout_marginLeft="5dip"/>

            <TextView 
                android:id="@+id/search_result_list_item_percapita"
                style="@style/LayoutWWStyle"
                android:textColor="#000000"
                android:paddingLeft="5dip"
                android:textSize="18sp"
                android:gravity="center_vertical"/>
        </LinearLayout>

        <LinearLayout 
            style="@style/LayoutWFStyle"
            android:orientation="horizontal"
            android:layout_margin="10dip"
            android:layout_alignParentRight="true">

            <TextView 
                style="@style/LayoutWWStyle"
                android:gravity="center_vertical"
                android:paddingRight="5dip"
                android:text="386m"/>

            <ImageView 
                style="@style/LayoutWWStyle"
                android:layout_gravity="center_vertical"
                android:src="@drawable/arrow_right_gray"/>
        </LinearLayout>
    </RelativeLayout>

    <Gallery
        android:id="@+id/search_result_foot_gallery" 
        style="@style/LayoutFWStyle"
        android:paddingTop="10dip"
        android:paddingBottom="10dip"
        android:spacing="10dip"
        android:scrollbars="none"
        android:fadingEdge="none"
        android:unselectedAlpha="1"/>
</LinearLayout>

说明一下,这个布局是在ListView中item,在adapter去引用的,跑马灯最后就不滚动。解决方法:

设置焦点

<TextView
    android:layout_width="100dip"
    android:layout_height="wrap_content"
    android:textColor="#000000"
    android:text="AppBlog.CN APP开发技术博客, AppBlog.CN APP开发技术博客"
    android:ellipsize="marquee"   
    android:focusable="true"
    android:marqueeRepeatLimit="marquee_forever"   
    android:focusableInTouchMode="true"   
    android:scrollHorizontally="true"
    android:textSize="18sp"
    android:singleLine="true"
    android:hapticFeedbackEnabled="true"
    android:layout_marginLeft="5dip">

    <requestFocus/>
</TextView>

这种方法在ListView布局下不太靠谱,如果能够在引用这个布局文件中去设置焦点话应该可以用,但是没有试过。

重写TextView

import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;

/**
 * 解决跑马灯不动的问题
 */
public class ScrollForeverTextView extends TextView {  

    public ScrollForeverTextView(Context context) {  
        super(context);  
    }  

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

    public ScrollForeverTextView(Context context, AttributeSet attrs,  
            int defStyle) {  
        super(context, attrs, defStyle);  
    }  

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

}
<cn.appblog.widget.ScrollForeverTextView 
    android:layout_width="100dip"
    android:layout_height="wrap_content"
    android:textColor="#000000"
    android:text="AppBlog.CN APP开发技术博客, AppBlog.CN APP开发技术博客"
    android:ellipsize="marquee"   
    android:focusable="true"   
    android:marqueeRepeatLimit="marquee_forever"   
    android:focusableInTouchMode="true"   
    android:scrollHorizontally="true"
    android:textSize="18sp"
    android:singleLine="true"
    android:layout_marginLeft="5dip"/>

自定义控件

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

import com.lianlianpay.common.config.Constants;
import com.lianlianpay.common.utils.android.NLog;

/**
 * 单行文本跑马灯控件
 */
public class AutoScrollTextView extends TextView implements OnClickListener {
    public final static String TAG = AutoScrollTextView.class.getSimpleName();

    private float textLength = 0f;// 文本长度
    private float viewWidth = 0f;
    private float step = 0f;// 文字的横坐标
    private float y = 0f;// 文字的纵坐标
    private float temp_view_plus_text_length = 0.0f;// 用于计算的临时变量
    private float temp_view_plus_two_text_length = 0.0f;// 用于计算的临时变量
    public boolean isStarting = false;// 是否开始滚动
    private Paint paint = null;// 绘图样式
    private CharSequence text = "";// 文本内容
    private float speed = 0.5f;
    private int textColor = 0xFF000000;

    public int getTextColor() {
        return textColor;
    }

    public void setTextColor(int color) {
        this.textColor = color;
    }

    public float getSpeed() {
        return speed;
    }

    public void setSpeed(float speed) {
        this.speed = speed;
    }

    public AutoScrollTextView(Context context) {
        super(context);
        initView();
    }

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

    public AutoScrollTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initView();
    }

    /** */
    /**
     * 初始化控件
     */
    private void initView() {
        setOnClickListener(this);
    }

    /**
    /**
     * 文本初始化,每次更改文本内容或者文本效果等之后都需要重新初始化一下!
     */
    public void init(float width/*WindowManager windowManager*/) {
        NLog.i(Constants.TAG, "width: " + width);
        text = super.getText();
        paint = super.getPaint();
        // Paint paint = new Paint();
        text = getText().toString();
        textLength = paint.measureText(text.toString());
        // viewWidth = getWidth();
        // if (viewWidth == 0) {
        //     if (windowManager != null) {
        //         Display display = windowManager.getDefaultDisplay();
        //         viewWidth = display.getWidth();
        //     }
        // }
        viewWidth = width;
        step = textLength;
        temp_view_plus_text_length = viewWidth + textLength;
        temp_view_plus_two_text_length = viewWidth + textLength * 2;
        y = getTextSize() + getPaddingTop();
        paint.setColor(textColor);
    }

    @Override
    public Parcelable onSaveInstanceState() {
        Parcelable superState = super.onSaveInstanceState();
        SavedState ss = new SavedState(superState);

        ss.step = step;
        ss.isStarting = isStarting;

        return ss;
    }

    @Override
    public void onRestoreInstanceState(Parcelable state) {
        if (!(state instanceof SavedState)) {
            super.onRestoreInstanceState(state);
            return;
        }
        SavedState ss = (SavedState) state;
        super.onRestoreInstanceState(ss.getSuperState());

        step = ss.step;
        isStarting = ss.isStarting;
    }

    public static class SavedState extends BaseSavedState {
        public boolean isStarting = false;
        public float step = 0.0f;

        SavedState(Parcelable superState) {
            super(superState);
        }

        @Override
        public void writeToParcel(Parcel out, int flags) {
            super.writeToParcel(out, flags);
            out.writeBooleanArray(new boolean[]{isStarting});
            out.writeFloat(step);
        }

        public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() {

            public SavedState[] newArray(int size) {
                return new SavedState[size];
            }

            @Override
            public SavedState createFromParcel(Parcel in) {
                return new SavedState(in);
            }
        };

        private SavedState(Parcel in) {
            super(in);
            boolean[] b = null;
            in.readBooleanArray(b);
            if (b != null && b.length > 0)
                isStarting = b[0];
            step = in.readFloat();
        }
    }

    /**
     * 开始滚动
     */
    public void startScroll() {
        isStarting = true;
        invalidate();
    }

    /**
     * 停止滚动
     */
    public void stopScroll() {
        isStarting = false;
        invalidate();
    }

    @Override
    public void onDraw(Canvas canvas) {
        //super.onDraw(canvas);

        canvas.drawText(text, 0, text.length(), temp_view_plus_text_length - step, y, paint);
        if (!isStarting) {
            return;
        }
        step += speed;
        if (step > temp_view_plus_two_text_length)
            step = textLength;
        invalidate();
    }

    @Override
    public void onClick(View v) {
        if (isStarting)
            stopScroll();
        else
            startScroll();
    }

}
marquee = (AutoScrollTextView) findViewById(R.id.marquee);  
//marquee.setText(String.format(getResources().getString(R.string.marquee0),Consts.termno,"2015-12-28"));  
marquee.setText("上证指数3000.15 6.81(0.37%) 深圳成指3000.15 6.81(0.37%)");  
//marquee.setTextColor(0xffff0000);//注意:颜色必须在这里设置,xml中设置无效!默认黑色。  
//如果想改变跑马灯的文字内容或者文字效果,则在调用完setText方法之后,需要再调用一下init(width)方法,重新进行初始化和相关参数的计算。  
marquee.setSpeed(1.5f);  
 marquee.init(width);//width通常就是屏幕宽!  
marquee.startScroll();

版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/02/18/android-running-lamp-not-moving-solution/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
解决Android跑马灯不动问题
布局配置 首先来看一下请的布局吧: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://sche……
<<上一篇
下一篇>>
文章目录
关闭
目 录