android 上下轮播,广播 BulletinView

上下滚动组件比较少,而且使用方面也不是很灵活,这边就自己写了个,这边取了个巧 简单使用了一个动画就实现了上下滚动,仿照recyclerView 支持每个条目自定义

1.首先准备一个容器 LinearLayout

2. 容器内准备2个View 从adapter 创建并绑定

3.将view 添加到容器 并根据容器设置 layoutParams

4.给view 添加上下移动的平移动画

5.启动线程进行定时轮播 轮播前移除所有View 加入新View,在执行动画,就完美实现了上下无线轮播效果


class BulletinView(
    context: Context,
    attrs: AttributeSet?,
    defStyleAttr: Int,
    defStyleRes: Int
) : LinearLayout(context, attrs, defStyleAttr, defStyleRes) {
   
    constructor(context: Context) : this(context, null, 0, 0)
    constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0, 0)
    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : this(
        context,
        attrs,
        defStyleAttr,
        0
    )
    //适配器
    var adapter: Adapter<ViewHolder>? = null
        set(value) {
   
            field = value
            if (onPause==2){
   
                onPause = 0
                handler.post(run)
            }
            onPause = 0
        }
    //当前位置
    private var position = 0

    /**
     * 0 未暂停 1标识要暂停 2 已暂停
     */
    private var onPause = 2
    private val handler = Handler(Looper.getMainLooper())
    private val run = Runnable {
   
        initView()
        next()
    }

    init {
    //设置排版 方向
        orientation = VERTICAL
    }
    //下一条
    private fun next() {
   
        if (onPause == 1) onPause = 2
        if (onPause == 0) {
   
            handler.postDelayed(run, 3000)
        }
    }

    //设置View
    private fun initView() {
   
        if (getPosition(++position) == 0) {
   
            position = 0
        }
        adapter?.let {
   
            val holder1 = it.bindingViewHolder(
                it.getViewType(getPosition(position)),
                this,
                getPosition(position)
            )
            val holder2 = it.bindingViewHolder(
                it.getViewType(getPosition(position + 1)),
                this,
                getPosition(position + 1)
            )
            it.bindingView(holder1, it.getViewType(getPosition(position)), getPosition(position))
            it.bindingView(
                holder2,
                it.getViewType(getPosition(position + 1)),
                getPosition(position + 1)
            )
            removeAllViews()
            addView(holder1.itemView)
            addView(holder2.itemView)
            holder1.itemView.layoutParams = LayoutParams(layoutParams)
            holder2.itemView.layoutParams = LayoutParams(layoutParams)
            setAnimate(holder1.itemView)
            setAnimate(holder2.itemView)
        }
    }
    //获取下标 防止越界
    private fun getPosition(position: Int): Int {
   
        return if (position >= (adapter?.getCount() ?: 0)) {
   
            0
        } else {
   
            position
        }
    }

    //适配器
    interface Adapter<T : ViewHolder> {
   
        fun bindingViewHolder(viewType: Int, group: ViewGroup, position: Int): T
        fun getViewType(viewType: Int): Int
        fun bindingView(holder: T, viewType: Int, position: Int)
        fun getCount(): Int
    }

    /**
     * 属性动画
     * 平移
     * 从下往上
     */
    private fun setAnimate(view: View): TranslateAnimation {
   
//      imageView中凡是有get,set方法的属性,都可以通过属性动画操作
//      创建属性动画对象,并设置移动的方向和偏移量
//      translationX是imageview的平移属性
        val objectAnimator = TranslateAnimation(0f, 0f, 0f, -height.toFloat())
//      设置移动时间
        objectAnimator.duration = 500
//      开始动画
        objectAnimator.fillAfter = true
        view.animation = objectAnimator
        objectAnimator.start()
        return objectAnimator
    }
    //暂停
    fun onPause(){
   
        onPause = 1
    }
    //启动
    fun onStart(){
   
        if (onPause==2){
   
            onPause = 0
            handler.post(run)
        }
        onPause = 0
    }

}

使用方法


 fun setBulletin(){
   
        val list = mutableListOf("https://lmg.jj20.com/up/allimg/1114/0406210Z024/2104060Z024-5-1200.jpg","https://lmg.jj20.com/up/allimg/1114/0406210Z024/2104060Z024-5-1200.jpg")
        binding.bulletinView.adapter = object : Adapter<ViewHolder> {
   
            override fun bindingViewHolder(
                viewType: Int,
                group: ViewGroup,
                position: Int
            ): ViewHolder {
    //这边绑定ViewHolder
               return ViewHolder (
                   BaseBannerBinding.inflate(
                       LayoutInflater.from(
                           this@MainActivity
                       ), group, false
                   )
               )
            }

            override fun getViewType(viewType: Int): Int {
   
               return 0
            }

            override fun getCount(): Int {
   
                return list.size
            }

            override fun bindingView(holder: ViewHolder, viewType: Int, position: Int) {
   
                val binding: BaseBannerBinding = BaseBannerBinding.bind(holder.itemView)
                binding.ivIcon.load(list[position])
            }


        }
    }

相关推荐

  1. android 广播 BulletinView

    2023-12-14 18:20:02       46 阅读
  2. android 图片

    2023-12-14 18:20:02       23 阅读
  3. 微信小程序文字无缝(滚动效果)

    2023-12-14 18:20:02       39 阅读
  4. android图入门2——触摸停止与指示器

    2023-12-14 18:20:02       25 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-14 18:20:02       75 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-14 18:20:02       80 阅读
  3. 在Django里面运行非项目文件

    2023-12-14 18:20:02       64 阅读
  4. Python语言-面向对象

    2023-12-14 18:20:02       75 阅读

热门阅读

  1. android项目实战之选择图片并上传服务器

    2023-12-14 18:20:02       54 阅读
  2. 工作招聘

    2023-12-14 18:20:02       58 阅读
  3. 用php语言写一个自适应新闻单页面

    2023-12-14 18:20:02       62 阅读
  4. SVN优缺点详解及版本控制系统选型建议

    2023-12-14 18:20:02       67 阅读
  5. 安装ingress-nginx

    2023-12-14 18:20:02       65 阅读
  6. 超详细校园网络系统规划设计方案

    2023-12-14 18:20:02       51 阅读
  7. 浅谈时间序列预测中的时间步

    2023-12-14 18:20:02       94 阅读