首页 > 其他分享 >Android多行横向来回自动滚动

Android多行横向来回自动滚动

时间:2024-01-04 16:33:22浏览次数:20  
标签:多行 滚动 binding private override running fun Android recyclerView

使用自定义RecyclerView实现,先看效果,能用得上的再继续往下看……

Android多行横向来回自动滚动_android

上代码~

自定义AutoRollRecyclerView,继承RecyclerView,重点只有这一个类

class AutoRollRecyclerView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null
) : RecyclerView(context, attrs) {

    companion object {
        private const val TIME_AUTO_ROLL: Long = 16L //隔多长时间移动一次
    }

    private val autoPollTask by lazy { AutoRollTask() }
    private var running: Boolean = false //是否正在自动轮询
    private var canRun: Boolean = false//是否可以自动轮询

    inner class AutoRollTask : Runnable {

        private val distanceOnce = 1 //每次滚动距离设置
        private var isScrollToEnd = false //是否滚动到了最右边

        override fun run() {
            val recyclerView = this@AutoRollRecyclerView
            if (recyclerView.running && recyclerView.canRun) {

                //当前显示区域的宽度(屏幕从左到右可见区域) + 横向滚动偏移量 >= recyclerView的整体横向宽度(包含屏幕外的)
                if (recyclerView.computeHorizontalScrollExtent() + recyclerView.computeHorizontalScrollOffset() >= recyclerView.computeHorizontalScrollRange()) {
                    isScrollToEnd = true
                } else if (recyclerView.computeHorizontalScrollOffset() == 0) {
                    isScrollToEnd = false
                }
                //横向滚动,只修改x即可
                recyclerView.scrollBy(if (isScrollToEnd) -distanceOnce else distanceOnce, 0)
                //每隔TIME_AUTO_ROLL滚动一次
                recyclerView.postDelayed(recyclerView.autoPollTask, TIME_AUTO_ROLL)
            }
        }
    }

    /**
     * 开始
     */
    fun start() {
        if (running)
            stop()
        canRun = true
        running = true
        postDelayed(autoPollTask, TIME_AUTO_ROLL)
    }

    /**
     * 停止
     */
    fun stop() {
        running = false
        removeCallbacks(autoPollTask)
    }

    override fun onTouchEvent(e: MotionEvent): Boolean {
        when (e.action) {
            MotionEvent.ACTION_DOWN -> { //当点击按下时,停止滚动
                if (running)
                    stop()
            }
            MotionEvent.ACTION_UP,
            MotionEvent.ACTION_CANCEL,
            MotionEvent.ACTION_OUTSIDE -> { //松开时,继续滚动
                if (canRun)
                    start()
            }
        }
        return super.onTouchEvent(e)
    }
}

下面是Demo示例代码

布局文件:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <!-- com.demo.application.widget 是AutoRollRecyclerView所在包-->
    <com.demo.application.widget.AutoRollRecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</androidx.appcompat.widget.LinearLayoutCompat>

每个item布局:item_topic.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.AppCompatTextView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/tvName"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginHorizontal="5dp"
    android:layout_marginVertical="3dp"
    android:background="@drawable/shape_bg_topic"
    android:paddingHorizontal="10dp"
    android:paddingVertical="4dp"
    android:textColor="#00A89C"
    android:textSize="12sp"
    tools:text="# 书中自有浓情意浓情意" />

适配器TopicAdapter

/**
 * BaseQuickAdapter是第三方库BRVAH里的类(https://github.com/CymChad/BaseRecyclerViewAdapterHelper)
 * 可以在主module的build.gradle里引入
 * implementation 'io.github.cymchad:BaseRecyclerViewAdapterHelper:4.0.1'
 */
class TopicAdapter : BaseQuickAdapter<String, QuickViewHolder>() {

    override fun onBindViewHolder(holder: QuickViewHolder, position: Int, item: String?) {
        holder.setText(R.id.tvName, item)
    }

    override fun onCreateViewHolder(
        context: Context,
        parent: ViewGroup,
        viewType: Int
    ): QuickViewHolder {
        return QuickViewHolder(R.layout.item_topic, parent)
    }
}

MainActivity

class MainActivity : AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    private val adapter by lazy { TopicAdapter() }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        //横向Staggered布局
        binding.recyclerView.layoutManager =
            StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.HORIZONTAL)
        //设置adapter
        binding.recyclerView.adapter = adapter
        //填装数据
        adapter.submitList(
            arrayListOf(
                "# 书中自有颜如玉",
                "# 举头望明月",
                "# 贴贴",
                "# 哈哈哈哈哈哈",
                "# 极限运动",
                "# 请回答1988",
                "# 健身达人",
                "# LOL",
                "# 德玛西亚",
                "# 我的地盘听我的",
                "# 哼哼哈嘿"
            )
        )
    }

    override fun onResume() {
        super.onResume()
        binding.recyclerView.start()
    }

    override fun onPause() {
        super.onPause()
        binding.recyclerView.stop()
    }
}

▲新手小备注:Activity里使用了viewBinding,记得在模块build.gradle里开启支持

android {
    
    ……
    
    viewBinding {
        enabled = true
    }
}

结束~


标签:多行,滚动,binding,private,override,running,fun,Android,recyclerView
From: https://blog.51cto.com/u_16465992/9102455

相关文章

  • iOS苹果和Android安卓测试APP应用程序的差异
    Hello大家好呀,我是咕噜铁蛋!我们经常需要关注移动应用程序的测试和优化,以提供更好的用户体验。在移动应用开发领域,iOS和Android是两个主要的操作系统平台。本文铁蛋讲给各位小伙伴们详细介绍在App测试中iOS和Android的差异,帮助你更好地理解并应对这些差异,以提高你的应用程序的质量和......
  • 寻路迷宫,Android休闲益智小游戏开发
    使用AndroidStudio开发了一款休闲益智小游戏——《寻路迷宫》。A.项目描述《寻路迷宫》是一款非常有趣的小游戏app,玩家需要寻找到迷宫的出口,挑战自己的智力和反应能力。在游戏中,玩家需要操作角色前进、转向等动作,避免被障碍物(迷宫墙)阻挡,玩家需要思考解决方案,如何才能在最短的时......
  • Windows Subsystem for Android (WSA) 下载:在 Windows 11 上运行 Android 应用
    作者主页:www.sysin.org在Beta频道中为Windows预览体验成员宣布Windows11Preview上的Android™应用程序今天我们宣布的Android™应用程序适用于Windows11的第一个预览版现已在Beta频道在美国的WindowsInsiders可用,如果您还没有读过thisblogpostfromGiorgio......
  • 一行或者多行超出部分显示省略号
    注意:在写多行省略的时候最好不要写总高度,因为你也不确定会显示一行还是两行,如果一行会出现一段空白区域,与下面内容的间距就会很大,可以写line-height//单行overflow:hidden;text-overflow:ellipsis;white-space:nowrap;//多行overflow:hidden;text-overflow:ell......
  • Android大图监测的这三种实现方式,你最喜欢哪种?
    在Android应用中,大图的加载和显示可能导致内存占用过高,进而引发OOM(OutOfMemory)异常,影响应用的稳定性和用户体验。为了更好地管理大图资源,我们需要建立起一套可靠的大图监测系统。原理解析内存占用计算首先,我们需要了解如何计算一张图片在内存中的占用大小。Android中,图片占用的内......
  • Android GB28181-2022 图像抓拍
     GB28181-2022新增图像抓拍功能,这个功能很有用,无需在设备实时点播的情况下,就可以抓图上传到指定的图像存储服务器上。如果配置合适的抓拍间隔,JPEG也选择适当的压缩参数,相比实时音视频回传更省流量,设备功耗也低。 GB28181图像抓拍分为三步,一是下发图像抓拍配置命令给设备,......
  • Windows Subsystem for Android (WSA) 下载:在 Windows 11 上运行 Android 应用 (July
    WindowsSubsystemforAndroid(WSA)下载:在Windows11上运行Android应用(July2023)适用于Android™️的Windows子系统,2023年7月更新:2306.40000.4.0作者主页:sysin.org适用于Android™️的Windows子系统使你的Windows11设备能够运行AmazonAppstore中提供的Andr......
  • [Android] 如何把自定义的 可执行文件/库文件/apk 放到系统目录下
    找到源码目录device/......./<devicename>/<devicename>.mk,以waydroid为例:/device/waydroid/waydroid/waydroid_arm64打开如下文件: lineage_waydroid_arm64.mk添加PRODUCT_PACKAGES变量到上述文件中,比如:PRODUCT_PACKAGES+=可执行文件名/动态库名字/静态库文件名字/apk文件名......
  • Android头像列表重叠最简实现
    手把手教程,针对初学者(老家伙请跳过),先看效果,能用得上的再继续往下看……针对上图重叠头像的展示实现方式,最简单的就是使用RecyclerView,利用其装饰器。平常使用RecyclerView都是每个item之间有间距,而这里不仅没间距还重叠了一部分,其实本质上也可以看成是有间距,只不过间距是负值。直接......
  • ThreadLocal:你不知道的优化技巧,Android开发者都在用
    引言在Android开发中,多线程是一个常见的话题。为了有效地处理多线程的并发问题,Android提供了一些工具和机制。其中,ThreadLocal是一个强大的工具,它可以使得每个线程都拥有自己独立的变量副本,从而避免了线程安全问题。本文将深入探讨Android中的ThreadLocal原理及其使用技巧,帮助你更......