小视频源码,可控的跑马灯,无需焦点

简介: 小视频源码,可控的跑马灯,无需焦点

小视频源码,可控的跑马灯,无需焦点实现的相关代码

package com.android.view;

import android.content.Context;
import android.graphics.Canvas;
import android.os.Handler;
import android.os.Message;
import android.text.Layout;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.widget.TextView;

public class MarqueeTextView extends TextView {
    /** 是否停止滚动 */
    private boolean mStopMarquee;
    private String mText;//文本内容
    private float mCoordinateX = 1280;//当前滚动位置
    private float mTextWidth;//文本宽度
    private int mScrollWidth = 1280;//滚动区域宽度
    private int speed = 1;//滚动速度
    private float currentPosition = 0.0f;
    public float getCurrentPosition() {
        return mCoordinateX;
    }

    public boolean ismStopMarquee() {
        return mStopMarquee;
    }

    public void setmStopMarquee(boolean mStopMarquee) {
        this.mStopMarquee = mStopMarquee;
    }

    public void setCurrentPosition(float mCoordinateX) {
        this.mCoordinateX = mCoordinateX;
    }

    public int getScrollWidth() {
        return mScrollWidth;
    }

    public void setScrollWidth(int mScrollWidth) {
        this.mScrollWidth = mScrollWidth;
        currentPosition = mScrollWidth;
    }

    public int getSpeed() {
        return speed;
    }

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

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

    public void setText(String text) {
        this.mText = text;
        mTextWidth = getPaint().measureText(mText);
        //mTextWidth = 1280;
        if (mHandler.hasMessages(0))
            mHandler.removeMessages(0);
        mHandler.sendEmptyMessageDelayed(0, 10);
    }

    @Override
    protected void onAttachedToWindow() {
        //mStopMarquee = false;
        if (!isEmpty(mText))
            mHandler.sendEmptyMessageDelayed(0, 500);
        super.onAttachedToWindow();
    }

    public static boolean isEmpty(String str) {
        return str == null || str.length() == 0;
    }

    @Override
    protected void onDetachedFromWindow() {
        //mStopMarquee = true;
        if (mHandler.hasMessages(0))
            mHandler.removeMessages(0);
        super.onDetachedFromWindow();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        TextPaint paint = getPaint();
        int width = (int) Layout.getDesiredWidth(mText, 0,
                mText.length(), paint);
        if(width < getWidth()){
            canvas.drawText(mText, 10, 40, getPaint());
            return;
        }
        if (!isEmpty(mText)) {
            //System.err.println("zzx===>mCoordinateX: "+mCoordinateX);
            canvas.drawText(mText, mCoordinateX+10, 40, getPaint());
            currentPosition = width+mCoordinateX+200;
            canvas.drawText(mText, currentPosition, 40, getPaint());
        }
    }

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 0:
                    if (mCoordinateX < (-mTextWidth)) {//文字滚动完了,从滚动区域的右边出来
                        mCoordinateX = currentPosition-10;
                        if (!mStopMarquee) {
                            sendEmptyMessageDelayed(0, 500);
                        }else{
                            mCoordinateX = 0;
                        }
                        invalidate();
                    } else {
                        mCoordinateX -= speed;
                        if (!mStopMarquee) {
                            sendEmptyMessageDelayed(0, 30);
                        }else{
                            mCoordinateX = 0;
                        }
                        invalidate();
                    }

                    break;
            }
            super.handleMessage(msg);
        }
    };

}

以上就是 小视频源码,可控的跑马灯,无需焦点实现的相关代码,更多内容欢迎关注之后的文章

目录
相关文章
Temporary email邮箱API发送邮件的步骤
使用Temporary email API发送邮件可保护隐私。步骤包括:了解API原理,注册获取API密钥,调用API并传入密钥,生成临时邮箱地址,编写邮件内容,然后发送。此方法确保真实邮箱不被泄露,适用于避免垃圾邮件。记得遵守使用规定和法规。
|
关系型数据库 MySQL 数据库
百度搜索:蓝易云【【Docker】Docker部署Mysql并设置数据持久化教程】
通过以上步骤,您已经成功地在Docker中部署了MySQL,并设置了数据持久化,确保数据在容器重新启动或迁移时得以保留。
272 0
|
传感器 物联网 5G
物联网的通信技术以及Wi-Fi、一键配网技术、BLE、GPRS(2G)、LTE-Cat1 、NB-IoT简介
物联网的一个重要的特点是接入了网络,因此这些设备才能将传感器采集的数据上传到云平台,然后根据平台对数据的分析做出反应。而这种接入网络的技术,就是通信技术,是物联网的基础之一。通信的方式可以分为有线和无线两种方式,因为有线通信的成本较高,无线通信技术在物联网中应用比较广泛。
673 1
|
安全 关系型数据库 API
深入理解后端技术:构建高效、可靠的服务器端应用
本文将深入探讨后端技术的核心概念和最佳实践,包括服务器端编程、数据库管理、API设计与开发等方面。我们将从基础开始,逐步深入,帮助读者建立起对后端开发的全面理解,从而能够独立构建高效、可靠的服务器端应用。
403 31
|
Kubernetes Dubbo Cloud Native
如何将Dubbo应用接入服务网格
介绍使用传统Dubbo微服务体系的客户要如何将自己的服务接入到服务网格这一新一代云原生基础设施。
|
存储 JavaScript 小程序
微信小程序可以进行dom操作吗?
微信小程序可以进行dom操作吗?
|
开发工具 git
Git push大文件失败解决
Git push大文件失败解决
|
机器学习/深度学习 Python
独家 | 教你使用简单神经网络和LSTM进行时间序列预测(附代码)
作者基于波动性标准普尔500数据集和Keras深度学习网络框架,利用python代码演示RNN和LSTM RNN的构建过程,便于你快速搭建时间序列的预测模型。
6447 0
|
JSON IDE 数据可视化
版本升级 | 兼容VSCode及全系IDE,代码风险一键查询
插件更新啦~可以在vscode里使用OpenSCA了,IDE插件也升级了一波
294 0
|
域名解析 网络协议 分布式数据库
IP、域名和DNS的关系与区别是什么?
IP、域名和DNS的关系相辅相成
762 0
IP、域名和DNS的关系与区别是什么?