含scrollview公告对话框

领导让写一个公告弹窗,要求如果是长公告,必须滑到最底部,才可点击消失,如果没到最底部,点击要内容自动滚动。对开发过程中遇到一些问题,特总结记录。
1、监听scrollview滑动是否到底部

private void setScrollviewListener() {
        scrollview.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent event) {
                int height = view.getHeight();
                int scrollY = view.getScrollY();
                int scrollViewMeasuredHeight = scrollview.getChildAt(0).getMeasuredHeight();
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        break;
                    case MotionEvent.ACTION_MOVE:
                    case MotionEvent.ACTION_UP:
//                        if(scrollY==0){//滑动到了顶部
//                        }
                        if ((scrollY + height) >= scrollViewMeasuredHeight) {//滑动到了底部
//                            listener.onBottom();
                            onBottom();
                        }
                        break;
                    default:
                        break;
                }
                return false;
            }
        });
    }

2、按钮监听

 btn_next.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!canScroll) {
                    dismiss();
                } else {
                    scrollNext();
                }
            }
        });

3、scrollview内容滚动

    public void scrollNext() {
        if (!scrollview.pageScroll(View.FOCUS_DOWN)) {
            onBottom();
        }
    }

4、测量内容是否会超出屏幕
scrollview中有个canScroll()方法,但是是private,无法使用。只能主动测量scrollview高度及子View高度。

 ViewTreeObserver vto = scrollview.getViewTreeObserver();
        vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                scrollview.getViewTreeObserver().removeOnPreDrawListener(this);//不需要一直频繁调用,移除
                int height = scrollview.getMeasuredHeight();
                int height2 = tv_content.getMeasuredHeight();              
                if (height2 <= height) {
                    canScroll = false;
                } else
                    canScroll = true;

                return true;
            }
        });

后来有用到一个更为方便的测量方法,不用设监听。

  view.post(new Runnable() {
            @Override
            public void run() {
                int width = et_name.getWidth(); // 获取宽度
                spinner.setDropDownWidth(width);
                spinner.setPadding(-width, 0, 0, 0);
            }
        });

5、然后就是按钮文字显示,最初文字一直显示错误,让我都以为是Button有问题,后来发现是上面addOnPreDrawListener()中一直在调用监听,才发现还有移除监听的方法。还是要多了解原理和多看源码,才能更多发现之前不曾用到的功能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值