<com.xxx.ui.SmartScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:focusable="true"
android:overScrollMode="never"
android:scrollbars="vertical">
<!--简介-->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</com.xxx.ui.SmartScrollView>
大概示例代码如此,发现用按键滚动到底部时,回发生回弹,导致最后一行文字显示不全。
ScrollView 添加如下代码解决:
android:overScrollMode="never"
android:overScrollMode="never"
是用于 ScrollView 的属性,用来控制 ScrollView 在滚动到边界时是否显示过度滚动效果。具体作用如下:
- android:overScrollMode="never":当设置为 "never" 时,表示禁止 ScrollView 在滚动到内容的边界时产生过度滚动效果。也就是说,用户在滚动到内容的顶部或底部时,不会看到内容继续拉伸的效果。
这个属性在一些情况下可以帮助减少 UI 的视觉冲突和增加用户体验,特别是在某些设计中不希望出现过度拉伸效果时很有用。
同时记录下 smartScrollView,用于监听ScrollView滚动到顶部或者底部
当然这个并不是我写的,只是有用,备份一下。 scrollview 基本都要用到这个监听
import android.content.Context
import android.util.AttributeSet
import android.widget.ScrollView
/** 监听ScrollView滚动到顶部或者底部做相关事件拦截 */
class SmartScrollView : ScrollView {
constructor(context: Context) : super(context) {}
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {}
// 初始化的时候设置一下值
private var isScrolledToTop = true
// 初始化的时候设置一下值
private var isScrolledToBottom = false
private var mSmartScrollChangedListener: ISmartScrollChangedListener? = null
/** 定义监听接口 */
interface ISmartScrollChangedListener {
fun onScrolledToBottom()
fun onScrolledToTop()
fun onScrolled()
}
fun setScanScrollChangedListener(smartScrollChangedListener: ISmartScrollChangedListener?) {
mSmartScrollChangedListener = smartScrollChangedListener
}
override fun onScrollChanged(l: Int, t: Int, oldl: Int, oldt: Int) {
super.onScrollChanged(l, t, oldl, oldt)
// 实际滚动展示的距离
val scrollDistance = scrollY + height - paddingTop - paddingBottom
if (scrollY === 0) { // 小心踩坑1: 这里不能是getScrollY() <= 0
isScrolledToTop = true
isScrolledToBottom = false
} else if (scrollDistance == getChildAt(0).height) {
// 完全滚动到底部
isScrolledToBottom = true
isScrolledToTop = false
} else {
isScrolledToTop = false
isScrolledToBottom = false
}
notifyScrollChangedListeners()
}
private fun notifyScrollChangedListeners() {
if (isScrolledToTop) {
mSmartScrollChangedListener?.onScrolledToTop()
} else if (isScrolledToBottom) {
mSmartScrollChangedListener?.onScrolledToBottom()
} else {
mSmartScrollChangedListener?.onScrolled()
}
}
fun isScrolledToTop(): Boolean {
return isScrolledToTop
}
fun isScrolledToBottom(): Boolean {
return isScrolledToBottom
}
}