小视频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源码自定义跑马灯,可控制速度与方向的相关代码,更多内容欢迎关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现