解决TextView多行滑动与NestedScrollView等,滑动冲突,我的解决方案

1.首先要明白,什么时候回TextView处理滑动,什么时候不处理滑动

1.1往上滑动,到达文本底部就不要再处理了,如果往上滑动不在底部则继续TextView滑动

1.2往下滑动,到达文本顶部就不要再处理了,如果往下滑动不在顶部则继续TextView滑动

关键计算地方:

      1.当前是上滑动还是下滑动(相对于屏幕) ,使用ev.getRawY()获得当前滑动位置在屏幕哪个地方

      2.  计算文本客滑动到哪里即可停止, (行高*总文本行数)- (行高 * 最多显示行数)   int sum = getLineHeight() * getLineCount() - getLineHeight() * getMaxLines();

废话不说了,上代码,欢迎参考使用,转载请说明出处,原创不易且行且珍惜,谢谢支持

import android.content.Context;
import android.text.method.ScrollingMovementMethod;
import android.util.AttributeSet;
import android.view.MotionEvent;

import com.suxuantech.erpsys.utils.L;

/**
 * ......................我佛慈悲....................
 * ......................_oo0oo_.....................
 * .....................o8888888o....................
 * .....................88" . "88....................
 * .....................(| -_- |)....................
 * .....................0\  =  /0....................
 * ...................___/`---‘\___..................
 * ..................‘ \\|     |// ‘.................
 * ................./ \\|||  :  |||// \..............
 * .............../ _||||| -卍-|||||- \..............
 * ..............|   | \\\  -  /// |   |.............
 * ..............| \_|  ‘‘\---/‘‘  |_/ |.............
 * ..............\  .-\__  ‘-‘  ___/-. /.............
 * ............___‘. .‘  /--.--\  `. .‘___...........
 * .........."" ‘<  `.___\_<|>_/___.‘ >‘ ""..........
 * ........| | :  `- \`.;`\ _ /`;.`/ - ` : | |.......
 * ........\  \ `_.   \_ __\ /__ _/   .-` /  /.......
 * ....=====`-.____`.___ \_____/___.-`___.-‘=====....
 * ......................`=---=‘.....................
 * ..................佛祖开光 ,永无BUG................
 *
 * @author Created by 李站旗 on 2018/3/3 0003 15:25 .
 *         QQ:1032992210
 *         E-mail:[email protected]
 * @Description: 可滑动的TextView, 并且解决了与 ScrollView等的滑动冲突
 */
public class ScrollTextView extends android.support.v7.widget.AppCompatTextView {
    public ScrollTextView(Context context) {
        super(context);
        setMovementMethod(ScrollingMovementMethod.getInstance());
    }

    public ScrollTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setMovementMethod(ScrollingMovementMethod.getInstance());
    }

    public ScrollTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setMovementMethod(ScrollingMovementMethod.getInstance());
    }
    float lastScrollY = 0;
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (getLineCount() > getMaxLines()) {
            if (ev.getAction() == MotionEvent.ACTION_DOWN) {
                lastScrollY = ev.getRawY();
                L.d("lldd","down:"+lastScrollY);
            } else if (ev.getAction() == MotionEvent.ACTION_MOVE) {
                //滑动到头并且还在继续上滑动,或者滑动到底部就不要再拦截了(有误差)
                int sum = getLineHeight() * getLineCount() - getLineHeight() * getMaxLines();
                //计算上次与本次差
                float diff = lastScrollY - ev.getRawY();
                if (diff>0){//下滑动并且到达了底部也不要处理了
                    //底部这里用abs的原因是,因为计算sum的时候有些误差
                    if (Math.abs(sum - getScrollY())<5) {
                        getParent().requestDisallowInterceptTouchEvent(false);
                    } else {
                        getParent().requestDisallowInterceptTouchEvent(true);
                    }
                }else if (diff<0){//上滑动
                    if (getScrollY() == 0) {//上滑动并且已经到达了顶部就不要在处理了
                        getParent().requestDisallowInterceptTouchEvent(false);
                    } else {
                        getParent().requestDisallowInterceptTouchEvent(true);
                    }
                }
                lastScrollY = ev.getRawY();
            } else {
                getParent().requestDisallowInterceptTouchEvent(false);
            }
        }
        return super.onTouchEvent(ev);
    }
}

原文地址:https://www.cnblogs.com/lizhanqi/p/8520836.html

时间: 2024-11-06 18:40:24

解决TextView多行滑动与NestedScrollView等,滑动冲突,我的解决方案的相关文章

android获取textview的行数

最近项目需求,需要获取Textview的行数,通过行数与TextView的maxLines进行比较来确定是否显示TextView下方的展开按钮是否显示,废话少说直接上代码,mTextView.getLineCount() ,似乎很美好,安卓有提供这个方法,但是总是返回0,这是为啥呢?官方注释如下: /** * Return the number of lines of text, or 0 if the internal Layout has not * been built. */ 也就是说只

JustifyTextView 解决TextView中英文混排自动换行的问题

最近在做着一个项目,里边会显示很长的一段文字,但是这些文字并不会整齐地排列,遇到文字中带有中英文时,果断给我换行了,好无语..接着就是不断地百度百度,找到了一堆一两年前的东西,不是叫你半角转全角,就是中文符号转英文符号,还有一些自定义TextView的试过了效果也不满意,最后在一个Android开发群中才得知JustifyTextView GitHub地址:https://github.com/ufo22940268/android-justifiedtextview 最后是自定义TextVie

解决ViewPage中嵌套有ListView或者滑动手势等造成滑动的冲突

public class ViewPagerCompat extends ViewPager { //mViewTouchMode表示ViewPager是否全权控制滑动事件,默认为false,即不控制 private boolean mViewTouchMode = false; public ViewPagerCompat(Context context, AttributeSet attrs) { super(context, attrs); } public void setViewTou

TextView 获取行数,某一行的内容,某行的宽度

获取行数 ViewTreeObserver vto = textView.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { ViewTreeObserver obs = textView.getViewTreeObserver(); obs.removeGlobalOnLayoutListener(

解决TextView错位的问题

错位,大多数是全角半角的问题 转化成全角 public String ToFull(String input){ char[] c=input.toCharArray(); for(int i=0;i if(c[i]==32){ c[i]=(char)12288; continue; } if(c[i]<127 && c[i]>32){ c[i]=(char)(c[i]+65248); } } return new String(c); } 转化成半角 public stati

解决ScrollView嵌套ViewPager,导致ViewPager不能滑动的问题

import java.lang.reflect.Field; import java.lang.reflect.Method; /** * 解决ScrollView嵌套ViewPager,导致ViewPager不能滑动的问题 */ public class CustomScrollView extends ScrollView { private GestureDetector mGestureDetector; private int Scroll_height = 0; private i

解决cordova命令行方式下build或者run的时候报错问题

phonegap3.0之后就将项目的生成方式做了很大的更改,原来是在eclipse里面修改生成并编译运行,但是3.0之后它的目录结构发生了很大变化,只修改主目录下面的index.html如果不build的话有时候是不起作用的,因为它的platform文件夹中还有各个平台的目录.比如安卓和IOS,在主目录www下面修改index.html之后必须要build才能生效,否则很多时候你会发现修改了不起作用,这是因为在assets目录下还有个www文件夹,真正运行的是这个文件夹下面的index.html

Android 结合滑动控件ListView滑动删除

一转眼就15年了,希望大家15年升职加薪走上人生巅峰 这篇博客是结合上一篇ListView滑动删除之Viewgroup打造滑动控件(修正版)博客所完成的,先上个效果图吧. 其实实现起来并不复杂 1,解决滑动冲突 因为我们的自定义滑动控件和ListView本身的滑动事件会产生各种冲突,所以我们可以自定义ListView并重写onInterceptTouchEvent方法. 我们先来了解一下android事件的分发,当用户触摸屏幕时会先去调用ViewGroup的dispatchTouchEvent方

如何解决IOS 动画中 Autolayout 与View Transforms的冲突

IOS 的动画放大与缩小,并非按照找它的中心点放大和缩小,而是左上角 .我分析了下原来是Autolayout 与View Transforms的冲突造成的. - (void) addSubviewWithZoomInAnimation:(UIView*)view duration:(float)secs option:(UIViewAnimationOptions)option { // first reduce the view to 1/100th of its original dimen