前言

在平常的开发中,有时会碰到这样的场景,规划上布局的内容会比较紧凑,导致部分机型上某些布局中的内容显现不完全,或许在数据内容多的状况下,单行无法显现一切内容。这时假如要进行处理,无非就那几种方法:换行、折叠、缩小、截取内容、布局主动翻滚等。而这儿能够简略介绍下布局主动翻滚的一种完成方法。

1. 布局主动翻滚的思路

要完成翻滚的作用,在Android中无非两种,吸附式的翻滚或许顺滑式的翻滚,吸附式便是类似viewpager换页的作用,假如需求上是要完成这样的作用,能够运用viewpager进行完成,这个类型比较简略,这儿就不过多介绍。另一种是顺滑的,十分丝滑的缓慢移动的那种,要完成这种作用,能够运用RecyclerView或许ScrollView来完成。我这儿首要运用ScrollView会简略点。

滑动的控件找到了,那要怎么完成丝滑的主动翻滚呢?咱们都知道ScrollView能用scrollTo和scrollBy去让它翻滚到某个方位,但怎么去完成丝滑的作用?

这儿就用到了特点动画 我之前的文章也提到过特点动画的强大 juejin.cn/post/714419…

所以我这边会运用ScrollView和特点动画来完成这个作用

2. 终究作用

能够写个Demo来看看终究的作用

这便是一个横向主动翻滚的作用。

3. 代码完成

先写个接口定义主动翻滚的行为

interface Autoscroll {
    // 开端主动翻滚
    fun autoStart()
    // 中止主动翻滚
    fun autoStop()
}

然后自定义一个View承继ScrollView,便利阅读,在代码中加了注释

// 自定义View承继HorizontalScrollView,我这儿演示横向翻滚的,纵向能够运用ScrollView
class HorizontalAutoscrollLayout @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : HorizontalScrollView(context, attrs, defStyleAttr), Autoscroll {
    // 一些流程上的变量,能够自己去定义,变量多的状况也能够运用builder形式
    var isLoop = true        // 翻滚到底后,是否循环翻滚
    var loopDelay = 1000L    // 翻滚的时刻
    var duration = 1000L     // 每一次翻滚的间隔时刻
    private var offset: Int = 0
    val loopHandler = Handler(Looper.getMainLooper())
    var isAutoStart = false
    private var animator: ValueAnimator? = null
    override fun autoStart() {
        // 需要计算翻滚距离所以要把计算得代码写在post里面,等制作完才拿得到宽度
        post {
            var childView = getChildAt(0)
            childView?.let {
                offset = it.measuredWidth - width
            }
            // 判别能否滑动,这儿只判别了一个方向,假如想做两个方向的话,多加一个变量就行
            if (canScrollHorizontally(1)) {
                animator = ValueAnimator.ofInt(0, offset)
                    .setDuration(duration)
                // 特点动画去缓慢改动scrollview的翻滚方位,笼统上也能够说改动scrollview的特点
                animator?.addUpdateListener {
                    val currentValue = it.animatedValue as Int
                    scrollTo(currentValue, 0)
                }
                animator?.addListener(object : Animator.AnimatorListener {
                    override fun onAnimationStart(animation: Animator) {
                    }
                    override fun onAnimationEnd(animation: Animator) {
                        // 动画完毕后判别是否要重复播映
                        if (isLoop) {
                            loopHandler?.postDelayed({
                                if (isAutoStart) {
                                    scrollTo(0, 0)
                                    autoStart()
                                }
                            }, loopDelay)
                        }
                    }
                    override fun onAnimationCancel(animation: Animator) {
                    }
                    override fun onAnimationRepeat(animation: Animator) {
                    }
                })
                animator?.start()
                isAutoStart = true
            }
        }
    }
    // 动画取消
    override fun autoStop() {
        animator?.cancel()
        isAutoStart = false
        loopHandler.removeCallbacksAndMessages(null)
    }
}

能看到完成这个功用,写的代码不会很多。其中首要需要留意一些点:
(1)特点动画要熟,我这儿仅仅简略的作用,但假如你对特点动画能娴熟运用的话,你还能够做到加快、减速等作用
(2)页面封闭的时分要调用autoStop去封闭动画
(3)这儿是用scrollTo去完成翻滚的作用,scrollBy也能够,但是写法就不是这样了

从代码能够看出没什么难点,都是比较基础的常识,比较重要的常识便是特点动画,娴熟的话做这种作用的上限就很高。其他的像这儿为什么用post,为什么用scrollTo,这些便是比较基础的常识,就不扩展讲了。

最终看看运用的地方,先是Demo的布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:gravity="center_vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.kylin.testproject.HorizontalAutoscrollLayout
        android:id="@+id/auto_scroll"
        android:layout_width="150dp"
        android:layout_height="wrap_content">
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:gravity="center_vertical"
            >
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="20sp"
                android:text="小日本"
                />
            <ImageView
                android:layout_width="36dp"
                android:layout_height="36dp"
                android:scaleType="fitXY"
                android:src="@drawable/a"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="20sp"
                android:text="排放核废水污染海洋"
                />
            <ImageView
                android:layout_width="36dp"
                android:layout_height="36dp"
                android:scaleType="fitXY"
                android:src="@drawable/b"
                />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textSize="20sp"
                android:text=",必遭天谴!!"
                />
        </LinearLayout>
    </com.kylin.testproject.HorizontalAutoscrollLayout>
</LinearLayout>

然后在开端播映主动翻滚(留意页面封闭的时分要手动中止)

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main)
    val autoScroll: HorizontalAutoscrollLayout = findViewById(R.id.auto_scroll)
    autoScroll.duration = 3000
    autoScroll.loopDelay = 2000
    autoScroll.autoStart()
}

4. 总结

代码比较简略,而且都加上了注释,所以没有其他要说明的。
前段时刻太忙,所以这几个月都没时刻写文章。想了一下,这个还是要坚持,假如有时刻的话抽出点时刻一天写一点,得保持一个常更新的状况。