
TextView处理滑动冲突复盘
发布日期:2021-05-18 09:00:21
浏览次数:14
分类:精选文章
本文共 3116 字,大约阅读时间需要 10 分钟。
Android应用开发中,TextView的内容常常会过多,导致滑动冲突问题。为了解决这个问题,通常会使用ScrollView来避免滑动冲突,但直接使用ScrollView可能并不能完全解决问题,特别是在控制文本内容滚动的细节上。毕竟,ScrollView的滑动判断是基于View的高度,而不是文本行数的。为了更精确地控制滚动行为,我们可以通过扩展系统的滚动方法来实现。
首先,我们需要了解如何判断TextView是否已经滚动到底部。我们可以通过扩展ScrollingMovementMethod类来实现这一点。具体来说,我们会创建一个自定义的MovementMethod类,继承自ScrollingMovementMethod,并提供判断是否滚动到底部的逻辑。
import android.text.Layout;import android.text.method.MovementMethod;import android.text.method.ScrollingMovementMethod;import android.widget.TextView;public class SimpleScrollingMoveMethod extends ScrollingMovementMethod { public boolean isBottom(TextView widget) { final Layout layout = widget.getLayout(); final int lineCount = layout.getLineCount(); return getBottomLine(widget) >= lineCount - 1; } public boolean isTop(TextView widget) { return getTopLine(widget) == 0; } private int getTopLine(TextView widget) { return widget.getLayout().getLineForVertical(widget.getScrollY()); } private int getBottomLine(TextView widget) { return widget.getLayout().getLineForVertical(widget.getScrollY() + getInnerHeight(widget)); } private int getInnerHeight(TextView widget) { return widget.getHeight() - widget.getTotalPaddingTop() - widget.getTotalPaddingBottom(); } public static MovementMethod getInstance() { if (sInstance == null) { sInstance = new SimpleScrollingMoveMethod(); } return sInstance; } private static SimpleScrollingMoveMethod sInstance;}
接下来,我们可以创建一个自定义的TextView类,来处理滑动冲突问题。我们可以在其触摸事件中,根据手指的移动方向和滚动状态来决定是否禁止рії estimator 的触摸事件拦截。这种方法可以更精确地控制TextView的滚动行为。
import android.content.Context;import android.util.AttributeSet;import android.view.MotionEvent;public class ScrollTextView extends android.support.v7.widget.AppCompatTextView { private float mLastY; private SimpleScrollingMoveMethod movementMethod; public ScrollTextView(Context context) { super(context); } public ScrollTextView(Context context, AttributeSet attrs) { super(context, attrs); setMovementMethod(SimpleScrollingMoveMethod.getInstance()); } @Override public boolean dispatchTouchEvent(MotionEvent event) { final int action = event.getAction(); if (action == MotionEvent.ACTION_DOWN) { mLastY = event.getY(); requestDisallowInterceptTouchEvent(true); } else if (action == MotionEvent.ACTION_MOVE) { final float scrollY = event.getY() - mLastY; movementMethod = (SimpleScrollingMoveMethod) getMovementMethod(); if (scrollY < 0 && movementMethod.isBottom(this)) { requestDisallowInterceptTouchEvent(false); } else if (scrollY > 0 && movementMethod.isTop(this)) { requestDisallowInterceptTouchEvent(false); } else { requestDisallowInterceptTouchEvent(true); } } return super.dispatchTouchEvent(event); }}
通过以上方法,我们可以更精确地控制TextView的滚动行为,避免滑动冲突问题。需要注意的是,ScrollView和TextView在判断滚动状态时的逻辑并不相同,ScrollView主要是基于View的高度来判断,而TextView则是基于文本的行数来判断。因此,在具体实现中,我们需要根据实际需求选择合适的判断方式。
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月29日 10时36分50秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Remove Extra one 维护前缀最大最小值
2019-03-11
Linux操作系统的安装与使用
2019-03-12
C++ 继承 详解
2019-03-12
OSPF多区域
2019-03-12
Docker入门之-镜像(二)
2019-03-12
重置UAG Application admin密码
2019-03-12
嵌入式系统试题库(CSU)
2019-03-12
setup facatory9.0打包详细教程(含静默安装和卸载)
2019-03-12
Linux kernel pwn --- CSAW2015 StringIPC
2019-03-12
IDEA 找不到 Persistence窗口解决办法
2019-03-12
Form窗体属性
2019-03-12
vue 错误收集
2019-03-12
00010.02最基础客户信息管理软件(意义类的小项目,练习基础,不涉及数据库)
2019-03-12
00013.05 字符串比较
2019-03-12
Effective Java 读书笔记
2019-03-12
SpringBoot使用@Email报错误
2019-03-13
访问servlet时弹出文件下载框解决方法
2019-03-13
IDEA-@Slf4j和log标签&@Data(Lombok)无效
2019-03-13