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则是基于文本的行数来判断。因此,在具体实现中,我们需要根据实际需求选择合适的判断方式。

上一篇:android View扩大触摸选区
下一篇:ViewPager禁止滑动

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月29日 10时36分50秒