原理是使用定时器定时让Scrollview每一段时间滚动一段距离,产生平滑滚动的效果。通过触摸和滚动监听实现手动定位内容展示位置,直到滑动到最底部。布局可根据个人需求更改。
实现效果:
布局文件主要控件
<ScrollView
android:id="@+id/scrollView"
android:layout_width="200dp"
android:layout_height="100dp">
<TextView
android:id="@+id/tvMsg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="11111112231234564879fdafs逻辑了复读机啊饭啊31234564879fdafs逻辑了复读机啊饭啊31234564879fdafs逻辑了复读机啊饭啊31234564879fdafs逻辑了复读机啊饭啊31234564879fdafs逻辑了复读机啊饭啊31234564879fdafs逻辑了复读机啊饭啊31234564879fdafs逻辑了复读机啊饭啊31234564879fdafs逻辑了复读机啊饭啊福IEIowa 福娃房间安静放假啦发了阿里"
android:textSize="18sp"/>
</ScrollView>
主要功能方法
fun setSvScroll(){
var currentY = 0//记录当前滚动位置
var scrollHeight = 1//每次滚动距离
var preTime = 5L//滚动间隔,毫秒
var observable:Disposable? = null//rxjava定时器,不会自己停止,需要自己调用observable.dispose()释放资源
var canAutoScorll = true//是否可以自动滑动
//手动滚动后设置位置
scrollView?.setOnScrollChangeListener { v, scrollX, scrollY, oldScrollX, oldScrollY ->
currentY = scrollY
}
//定时自动滚动一段距离,可替换其他定时器
observable = Observable.interval(preTime, TimeUnit.MILLISECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Consumer<Long> {
override fun accept(t: Long) {
//判断自动滚动一定距离
if (canAutoScorll){
currentY+=scrollHeight
scrollView?.scrollTo(0, currentY)
}
}
})
//触摸监听控制可否自动滚动
scrollView?.setOnTouchListener { v, event ->
when (event.action) {
MotionEvent.ACTION_DOWN -> {
canAutoScorll = false
}
MotionEvent.ACTION_UP -> {
canAutoScorll = true
}
else -> {
}
}
false
}
}