【Android 实现跑马灯效果的定制化文字滚动条】

业务场景:滚动条的应用有很多,消息轮播、公告等等,接下来给出一种实现的方法,并且该方法实现了跑马灯的多种自定义的滚动条件,可根据具体需求删减

一、实现

1.1 首先,我们需要创建好一个java类和对应的layout下的xml文件,接下来首先在xml中创建一个TextView组件

    <TextView
        android:id="@+id/runTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal|top"
        android:layout_marginLeft="12dp"
        android:layout_marginTop="50dp"
        android:ellipsize="marquee"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:marqueeRepeatLimit="marquee_forever"
        android:scrollHorizontally="true"
        android:singleLine="true"
        android:textColor="#000000"
        android:textSize="36sp"
        android:paddingLeft="90dp" />

注:这里TextView组件的设置与下文类中代码的设置是有重复的,可自行删减

1.2 接下来,我们在对应类中添加全局变量:

    TextView marqueeText;

    // 在类的成员变量中保存Runnable的引用
    private Runnable hideRunnable;
    // 在类的成员变量中保存Runnable的引用
    private Runnable scrollRunnable;

    private Runnable requestRunnable;
    private Handler handler = new Handler();

1.3 onCreate方法中添加:

        marqueeText = findViewById(R.id.runTextView);
        marqueeText.bringToFront();

1.4 封装出可以随时调用跑马灯方法:

void runText(String text){
    
    
        Log.i("show text","the runner text is :" + text);
        int addTime = 0;
        isSwitchVideo = "";
        //设置滚动条长度为五个字符 宽度
        Paint paint = new Paint();
        paint.setTextSize(marqueeText.getTextSize());
        float width = paint.measureText("国") * 25; //假设“国”是最宽的字符
        ViewGroup.LayoutParams params = marqueeText.getLayoutParams();
        params.width = (int) width;
        marqueeText.setLayoutParams(params);

// 在runText方法的开始处取消之前的Runnable
        if (hideRunnable != null) {
    
    
            marqueeText.removeCallbacks(hideRunnable);
        }
        // 在runText方法的开始处取消之前的Runnable
        if (scrollRunnable != null) {
    
    
            handler.removeCallbacks(scrollRunnable);
        }
        // 将滚动条设置为可见
        marqueeText.setVisibility(View.VISIBLE);
        marqueeText.setText(text);


        Log.i(TAG, "-----------runText ---收到打印的消息"+ text);
        if (text.length() > 15) {
    
    
            Log.i(TAG, "--------------15字以上 ---开始滚动");
            // 如果文本长度超过五个字符,启动滚动效果
            marqueeText.setEllipsize(TextUtils.TruncateAt.MARQUEE);
            //这行代码设置了跑马灯的重复次数。在这里,设置为1表示跑马灯效果只会播放一次 -1表示无限循环
            marqueeText.setMarqueeRepeatLimit(1);
            //这行代码设置了TextView是否可以被选中。在这里,设置为true表示TextView可以被选中,从而启用跑马灯效果。
            marqueeText.setSelected(true);
            //设置了TextView是否可以水平滚动。在这里,设置为true表示TextView可以水平滚动,以展示整个文本内容。
            marqueeText.setHorizontallyScrolling(true);
            //这行代码设置了TextView是否只显示一行文本。在这里,设置为true表示TextView只会显示一行文本,多余的文本将被省略
            marqueeText.setSingleLine(true);
        }else {
    
    
            Log.i(TAG, "runText text is: " + marqueeText.getText());
            addTime = 1000;
        }

        // 设置跑马灯滚动速度
        float density = getResources().getDisplayMetrics().density;
        // 在设置新的Runnable时保存它的引用
        scrollRunnable = new Runnable() {
    
    
            @Override
            public void run() {
    
    
                marqueeText.scrollBy((int) (5 * density), 0); // 每次滚动的像素值
                handler.postDelayed(this, 80); // 延迟时间,控制滚动速度
            }
        };
        // 在合适的时机开始滚动
        handler.postDelayed(scrollRunnable, 1500); // 延迟1秒后开始滚动
        
        // 在设置新的Runnable时保存它的引用
        hideRunnable = new Runnable() {
    
    
            @Override
            public void run() {
    
    
         //滚动完毕后隐藏
                marqueeText.setVisibility(View.GONE);
            }
        };
        marqueeText.postDelayed(hideRunnable, getScrollingDuration(text) + addTime);
    }
    // 滚动条展示的时间设置
    private long getScrollingDuration(String text) {
    
    
        if(text.length() < 1){
    
    
            return 500;
        }
        return text.length() / 4 * 1000L;
    }

1.5 调用方式,仅仅需要在想展示的地方调用即可:

runText(text);

猜你喜欢

转载自blog.csdn.net/qq_48424581/article/details/131831450