小视频app源码自定义跑马灯,可控制速度与方向

小视频app源码自定义跑马灯,可控制速度与方向的相关代码

主要是通过继承自TextView实现自定义View,使用drawText方法不断重绘文字。

XML布局:

 

1
<com.ycq.myview.MarqueeText<br>    android:id="@+id/test"<br>    android:layout_width="match_parent"<br>    android:layout_height="50dp"<br>    android:background="#339320"<br>    android:maxLines="1"<br>    android:textColor="#FF00FF"<br>    android:textSize="21sp"/>

 

注意:需要设置为1行。可在XML中设置颜色,字号,不要设置文字内容。

Activity调用:

 

1
test = (MarqueeText) this.findViewById(R.id.test);<br>test.setMyContext("11111112225555");<br>test.setL2r(true);<br>test.setMySpeed(10);<br>test.setOnClickListener(new OnClickListener() {    @Override    public void onClick(View view) {        start();    }});<br>setL2r设置方向,默认为从左向右;<br>setMySpeed设置速度,默认为5,说明:若速度设置<0,则默认为1,若>15,则默认15.<br>@Override<br>protected void onPause() {<br>    super.onPause();<br>    stop();<br>}<br>@Override<br>protected void onResume() {<br>    super.onResume();<br>    start();<br>}<br>@Override<br>protected void onDestroy() {<br>    super.onDestroy();<br>    stop();<br>}<br>public void start() {<br>    test.startScroll();<br>}<br>public void stop() {<br>    test.stopScroll();<br>}

 

销毁Activity,则不在执行。

具体实现:

 

1
package com.ycq.myview;<br>import android.content.Context;<br>import android.graphics.Canvas;<br>import android.util.AttributeSet;<br>import android.widget.TextView;<br>/**<br> * Created by yi on 2017/2/6.<br> */<br>public class MarqueeText extends TextView implements Runnable {<br>    private int currentScrollX = 0;// 当前滚动的位置<br>    private boolean isStop = false;<br>    private int textWidth;<br>    private boolean isMeasure = false;<br>    private String myContext = "";<br>    private int vWidth;<br>    private int mySpeed = 5;<br>    private Boolean l2r = true;<br>    //getPaint()获取系统画笔<br>    public MarqueeText(Context context) {<br>        super(context);<br>    }<br>    public MarqueeText(Context context, AttributeSet attrs) {<br>        super(context, attrs);<br>    }<br>    public MarqueeText(Context context, AttributeSet attrs, int defStyle) {<br>        super(context, attrs, defStyle);<br>    }<br>    @Override<br>    protected void onDraw(Canvas canvas) {<br>        super.onDraw(canvas);<br>        if (!isMeasure) {// 文字宽度只需获取一次就可以了<br>            textWidth = (int) getPaint().measureText(myContext);<br>            vWidth = getWidth();<br>            isMeasure = true;<br>        }<br>        float baseline = getHeight() / 2 + getPaint().getTextSize() / 2 - getPaint().getFontMetrics().descent;<br>        canvas.drawText(myContext, currentScrollX, baseline, getPaint());<br>    }<br>    @Override<br>    public void run() {<br>        if (!l2r) {//向左运动<br>            currentScrollX -= mySpeed;// 滚动速度<br>            if (currentScrollX < 0) {<br>                if (Math.abs(currentScrollX) >= textWidth) {<br>                    currentScrollX = vWidth;<br>                }<br>            }<br>        }<br>        if (l2r) {//由左向右运动<br>            currentScrollX += mySpeed;// 滚动速度<br>            if (currentScrollX >= vWidth) {<br>                currentScrollX = -textWidth;<br>            }<br>        }<br>        invalidate();<br>        postDelayed(this, 5);<br>        if (isStop) {<br>            return;<br>        }<br>    }<br>    // 开始滚动<br>    public void startScroll() {<br>        isStop = false;<br>        this.removeCallbacks(this);<br>        post(this);<br>    }<br>    // 停止滚动<br>    public void stopScroll() {<br>        isStop = true;<br>    }<br>    public String getMyContext() {<br>        return myContext;<br>    }<br>    public void setMyContext(String myContext) {<br>        this.myContext = myContext;<br>        textWidth = (int) getPaint().measureText(myContext);<br>    }<br>    public int getMySpeed() {<br>        return mySpeed;<br>    }<br>    public void setMySpeed(int mySpeed) {<br>        this.mySpeed = mySpeed;<br>        if (mySpeed <= 0) {<br>            this.mySpeed = 1;<br>        }<br>        if (mySpeed >= 15) {<br>            this.mySpeed = 15;<br>        }<br>    }<br>    public Boolean getL2r() {<br>        return l2r;<br>    }<br>    public void setL2r(Boolean l2r) {<br>        this.l2r = l2r;<br>    }<br>}<br>float baseline = getHeight() / 2 + getPaint().getTextSize() / 2 - getPaint().getFontMetrics().descent;<br>        canvas.drawText(myContext, currentScrollX, baseline, getPaint());

 

 

保证绘制的文字在控件的竖直中线位置。

以上就是 小视频app源码自定义跑马灯,可控制速度与方向的相关代码,更多内容欢迎关注之后的文章

 

posted @   云豹科技-苏凌霄  阅读(90)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示