首页 技术 正文
技术 2022年11月17日
0 收藏 921 点赞 2,540 浏览 6725 个字

先看效果:

主要处理:

使用PullToRefreshScrollView修改内部的scrollView源码,更换成可以固定顶部的自定义scrollView

@Override    protected ScrollView createRefreshableView(Context context, AttributeSet attrs) {        ScrollView scrollView;        if (VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD) {            //TODO  修改代码 添加滑动固定顶部标题sv            scrollView = new InternalScrollViewSDK9(context, attrs);//          scrollView = new FloatScrollView(context, attrs);        } else {            scrollView = new ScrollView(context, attrs);        }        scrollView.setId(R.id.scrollview);        return scrollView;    }

下面是scrollview的代码:

        public static final String FLOAT = "float";        private ArrayList<View> stickyViews;        private View currentlyStickingView;        private float stickyViewTopOffset;        private int stickyViewLeftOffset;        private boolean redirectTouchesToStickyView;        private boolean clippingToPadding;        private boolean clipToPaddingHasBeenSet;        private final Runnable invalidateRunnable = new Runnable() {            @Override            public void run() {                if (currentlyStickingView != null) {                    int l = getLeftForViewRelativeOnlyChild(currentlyStickingView);                    int t = getBottomForViewRelativeOnlyChild(currentlyStickingView);                    int r = getRightForViewRelativeOnlyChild(currentlyStickingView);                    int b = (int) (getScrollY() + (currentlyStickingView.getHeight() + stickyViewTopOffset));                    invalidate(l, t, r, b);                }                postDelayed(this, 16);            }        };        public void setup() {            stickyViews = new ArrayList<View>();        }        private int getLeftForViewRelativeOnlyChild(View v) {            int left = v.getLeft();            while (v.getParent() != getChildAt(0)) {                v = (View) v.getParent();                left += v.getLeft();            }            return left;        }        private int getTopForViewRelativeOnlyChild(View v) {            int top = v.getTop();            while (v.getParent() != getChildAt(0)) {                v = (View) v.getParent();                top += v.getTop();            }            return top;        }        private int getRightForViewRelativeOnlyChild(View v) {            int right = v.getRight();            while (v.getParent() != getChildAt(0)) {                v = (View) v.getParent();                right += v.getRight();            }            return right;        }        private int getBottomForViewRelativeOnlyChild(View v) {            int bottom = v.getBottom();            while (v.getParent() != getChildAt(0)) {                v = (View) v.getParent();                bottom += v.getBottom();            }            return bottom;        }        @Override        protected void onLayout(boolean changed, int l, int t, int r, int b) {            super.onLayout(changed, l, t, r, b);            if (!clipToPaddingHasBeenSet) {                clippingToPadding = true;            }            notifyHierarchyChanged();        }        @Override        public void setClipToPadding(boolean clipToPadding) {            super.setClipToPadding(clipToPadding);            clippingToPadding = clipToPadding;            clipToPaddingHasBeenSet = true;        }        @Override        public void addView(View child) {            super.addView(child);            findStickyViews(child);        }        @Override        public void addView(View child, int index) {            super.addView(child, index);            findStickyViews(child);        }        @Override        public void addView(View child, int index, android.view.ViewGroup.LayoutParams params) {            super.addView(child, index, params);            findStickyViews(child);        }        @Override        public void addView(View child, int width, int height) {            super.addView(child, width, height);            findStickyViews(child);        }        @Override        public void addView(View child, android.view.ViewGroup.LayoutParams params) {            super.addView(child, params);            findStickyViews(child);        }        @Override        protected void dispatchDraw(Canvas canvas) {            super.dispatchDraw(canvas);            if (currentlyStickingView != null) {                canvas.save();                canvas.translate(getPaddingLeft() + stickyViewLeftOffset, getScrollY() + stickyViewTopOffset + (clippingToPadding ? getPaddingTop() : 0));                canvas.clipRect(0, (clippingToPadding ? -stickyViewTopOffset : 0), getWidth(), currentlyStickingView.getHeight());                currentlyStickingView.draw(canvas);                canvas.restore();            }        }        @Override        public boolean dispatchTouchEvent(MotionEvent ev) {            if (ev.getAction() == MotionEvent.ACTION_DOWN) {                redirectTouchesToStickyView = true;            }            if (redirectTouchesToStickyView) {                redirectTouchesToStickyView = currentlyStickingView != null;                if (redirectTouchesToStickyView) {                    redirectTouchesToStickyView =                            ev.getY() <= (currentlyStickingView.getHeight() + stickyViewTopOffset) &&                                    ev.getX() >= getLeftForViewRelativeOnlyChild(currentlyStickingView) &&                                    ev.getX() <= getRightForViewRelativeOnlyChild(currentlyStickingView);                }            } else if (currentlyStickingView == null) {                redirectTouchesToStickyView = false;            }            if (redirectTouchesToStickyView) {                topForViewRelativeOnlyChild = getTopForViewRelativeOnlyChild(currentlyStickingView);                ev.offsetLocation(0, -1 * ((getScrollY() + stickyViewTopOffset) - topForViewRelativeOnlyChild));            }            return super.dispatchTouchEvent(ev);        }        private boolean hasNotDoneActionDown = true;        @Override        public boolean onTouchEvent(MotionEvent ev) {            if (redirectTouchesToStickyView) {                ev.offsetLocation(0, ((getScrollY() + stickyViewTopOffset) - getTopForViewRelativeOnlyChild(currentlyStickingView)));            }            if (ev.getAction() == MotionEvent.ACTION_DOWN || ev.getAction() == MotionEvent.ACTION_MOVE) {                hasNotDoneActionDown = false;            }            if (hasNotDoneActionDown) {                MotionEvent down = MotionEvent.obtain(ev);                down.setAction(MotionEvent.ACTION_DOWN);                super.onTouchEvent(down);                hasNotDoneActionDown = false;            }            if (ev.getAction() == MotionEvent.ACTION_UP || ev.getAction() == MotionEvent.ACTION_CANCEL) {                hasNotDoneActionDown = true;            }            return super.onTouchEvent(ev);        }        @Override        protected void onScrollChanged(int l, int t, int oldl, int oldt) {            super.onScrollChanged(l, t, oldl, oldt);            doTheStickyThing();        }        private void doTheStickyThing() {            View viewThatShouldStick = null;            View approachingView = null;            for (View v : stickyViews) {                int viewTop = getTopForViewRelativeOnlyChild(v) - getScrollY() + (clippingToPadding ? 0 : getPaddingTop());                if (viewTop <= 0) {                    if (viewThatShouldStick == null || viewTop > (getTopForViewRelativeOnlyChild(viewThatShouldStick) - getScrollY() + (clippingToPadding ? 0 : getPaddingTop()))) {                        viewThatShouldStick = v;                    }                } else {                    if (approachingView == null || viewTop < (getTopForViewRelativeOnlyChild(approachingView) - getScrollY() + (clippingToPadding ? 0 : getPaddingTop()))) {                        approachingView = v;                    }                }            }            if (viewThatShouldStick != null) {                stickyViewTopOffset = approachingView == null ? 0 : Math.min(0, getTopForViewRelativeOnlyChild(approachingView) - getScrollY() + (clippingToPadding ? 0 : getPaddingTop()) - viewThatShouldStick.getHeight());                if (viewThatShouldStick != currentlyStickingView) {                    if (currentlyStickingView != null) {                        stopStickingCurrentlyStickingView();                    }                    stickyViewLeftOffset = getLeftForViewRelativeOnlyChild(viewThatShouldStick);                    startStickingView(viewThatShouldStick);                }            } else if (currentlyStickingView != null) {                stopStickingCurrentlyStickingView();            }        }        private void startStickingView(View viewThatShouldStick) {            currentlyStickingView = viewThatShouldStick;        }        private void stopStickingCurrentlyStickingView() {            currentlyStickingView = null;            removeCallbacks(invalidateRunnable);        }        private void notifyHierarchyChanged() {            if (currentlyStickingView != null) {                stopStickingCurrentlyStickingView();            }            stickyViews.clear();            findStickyViews(getChildAt(0));            doTheStickyThing();            invalidate();        }        private void findStickyViews(View v) {            if (v instanceof ViewGroup) {                ViewGroup vg = (ViewGroup) v;                for (int i = 0; i < vg.getChildCount(); i++) {                    String tag = getStringTagForView(vg.getChildAt(i));                    if (tag != null && tag.contains(FLOAT)) {                        stickyViews.add(vg.getChildAt(i));                    } else if (vg.getChildAt(i) instanceof ViewGroup) {                        findStickyViews(vg.getChildAt(i));                    }                }            } else {                String tag = (String) v.getTag();                if (tag != null && tag.contains(FLOAT)) {                    stickyViews.add(v);                }            }        }        private String getStringTagForView(View v) {            Object tagObject = v.getTag();            return String.valueOf(tagObject);        }    }
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,983
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,500
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,344
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,127
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,761
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,838