1. 程式人生 > >自定義scrollview 回彈效果

自定義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