自定义scrollview 回弹效果

前言

自定义scrollview 下拉回弹效果

效果图

这里写图片描述

获取内部控件

    //获取初始控件
    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        //由于是scrollview 内部只能有一个控件
        convertView = getChildAt(0);
    }

记录初始位置


    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        //用rect记录 scrollview的子控件的上下左右
        originalRect.set(convertView.getLeft(), convertView.getTop(), convertView.getRight(), convertView.getBottom());

    }

事件分发

//
@Override
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                startY = (int) ev.getY();
                startX = (int) ev.getX();
                break;

            case MotionEvent.ACTION_UP:
                //还原位置,回弹动画, 可以自己定于需要的动画
                TranslateAnimation animation = new TranslateAnimation(0, 0, convertView.getTop(), originalRect.top);
                animation.setDuration(200);
                convertView.setAnimation(animation);
                convertView.layout(originalRect.left, originalRect.top, originalRect.right, originalRect.bottom);

                break;

            case MotionEvent.ACTION_MOVE:

                int detalY = (int) (ev.getY() - startY);
                int detalX = (int) (ev.getX() - startX);

                if (Math.abs(detalX) < Math.abs(detalY)) {
                    //detalY 乘以0.2 使得很难的效果
                    convertView.layout(originalRect.left, (int) (originalRect.top + detalY * 0.2),
                            originalRect.right, (int) (originalRect.bottom + detalY * 0.2));
                }
                break;

        }

        return super.dispatchTouchEvent(ev);
    }

end

整体代码量挺少,主要是记录了控件的初始位置,和事件分发dispatchTouchEvent的重写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值