直播系统源码,图片一直滚动,循环滚动,竖向和横向
直播系统源码,图片一直滚动,循环滚动,竖向和横向实现的相关代码
竖向:
1 | public class LoopScrollView extends View {<br> private final int speed;<br> private final Bitmap bitmap;<br> <br> private Rect clipBounds = new Rect();<br> private float offset = 0 ;<br> <br> private boolean isStarted;<br> <br> public LoopScrollView(Context context, AttributeSet attrs) {<br> super (context, attrs);<br> TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.ParallaxView, 0 , 0 );<br> try {<br> speed = ta.getDimensionPixelSize(R.styleable.ParallaxView_speed, 10 );<br> bitmap = BitmapFactory.decodeResource(getResources(), ta.getResourceId(R.styleable.ParallaxView_src, 0 ));<br> } finally {<br> ta.recycle();<br> }<br> // start();<br> }<br> <br> @Override<br> protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {<br> super.onMeasure(widthMeasureSpec, heightMeasureSpec);<br> setMeasuredDimension(bitmap.getWidth(), MeasureSpec.getSize(heightMeasureSpec));<br> }<br> <br> @Override<br> public void onDraw(Canvas canvas) {<br> super.onDraw(canvas);<br> if (canvas == null) {<br> return;<br> }<br> <br> canvas.getClipBounds(clipBounds);<br> <br> float normalizedOffset = offset;<br> float layerHeight = bitmap.getHeight();<br> <br> if (offset <= -layerHeight) {<br> offset += (floor(abs(normalizedOffset) / layerHeight) * layerHeight);<br> }<br> <br> float top = offset;<br> while (top < clipBounds.height()) {<br> canvas.drawBitmap(bitmap, 0, getBitmapTop(layerHeight, top), null);<br> top += layerHeight;<br> }<br> <br> if (isStarted) {<br> offset -= speed;<br> postInvalidateOnAnimation();<br> }<br> }<br> <br> private float getBitmapTop(float layerHeight, float top) {<br> float bitmapTop = top;<br> if (speed < 0) {<br> bitmapTop = clipBounds.height() - layerHeight - top;<br> }<br> return bitmapTop;<br> }<br> <br> /**<br> * Start the animation<br> */<br> public void start() {<br> if (!isStarted) {<br> isStarted = true;<br> postInvalidateOnAnimation();<br> }<br> }<br> <br> /**<br> * Stop the animation<br> */<br> public void stop() {<br> if (isStarted) {<br> isStarted = false;<br> invalidate();<br> }<br> }<br>} |
横向:
1 | public class LoopScrollView extends View {<br> private final int speed;<br> private final Bitmap bitmap;<br> <br> private Rect clipBounds = new Rect();<br> private int offset = 0 ;<br> <br> private boolean isStarted;<br> <br> public LoopScrollView(Context context, AttributeSet attrs) {<br> super (context, attrs);<br> TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.ParallaxView, 0 , 0 );<br> try {<br> speed = ta.getDimensionPixelSize(R.styleable.ParallaxView_speed, 10 );<br> bitmap = BitmapFactory.decodeResource(getResources(), ta.getResourceId(R.styleable.ParallaxView_src, 0 ));<br> } finally {<br> ta.recycle();<br> }<br> start();<br> }<br> <br> @Override <br> protected void onMeasure( int widthMeasureSpec, int heightMeasureSpec) {<br> super .onMeasure(widthMeasureSpec, heightMeasureSpec);<br> setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), bitmap.getHeight());<br> }<br> <br> @Override <br> public void onDraw(Canvas canvas) {<br> super .onDraw(canvas);<br> if (canvas == null ) {<br> return ;<br> }<br> <br> canvas.getClipBounds(clipBounds);<br> <br> int normalizedOffset = offset;<br> int layerWidth = bitmap.getWidth();<br> if (offset < -layerWidth) {<br> offset += ( int ) (floor(abs(normalizedOffset) / ( float ) layerWidth) * layerWidth);<br> }<br> <br> int left = offset;<br> while (left < clipBounds.width()) {<br> canvas.drawBitmap(bitmap, getBitmapLeft(layerWidth, left), 0 , null );<br> left += layerWidth;<br> }<br> <br> if (isStarted) {<br> offset -= speed;<br> postInvalidateOnAnimation();<br> }<br> }<br> <br> private float getBitmapLeft( int layerWidth, int left) {<br> float bitmapLeft = left;<br> if (speed < 0 ) {<br> bitmapLeft = clipBounds.width() - layerWidth - left;<br> }<br> return bitmapLeft;<br> }<br> <br> /**<br> * Start the animation<br> */ <br> public void start() {<br> if (!isStarted) {<br> isStarted = true ;<br> postInvalidateOnAnimation();<br> }<br> }<br> <br> /**<br> * Stop the animation<br> */ <br> public void stop() {<br> if (isStarted) {<br> isStarted = false ;<br> invalidate();<br> }<br> }<br>} |
以上就是直播系统源码,图片一直滚动,循环滚动,竖向和横向实现的相关代码, 更多内容欢迎关注之后的文章
【推荐】国内首个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岁的心里话
· 按钮权限的设计及实现