仿京东首页摇红包

java代码

public class DragLayout extends RelativeLayout {

    private ViewDragHelper mDragger;

    private ViewDragHelper.Callback callback;

    private ImageView iv_drag;


    private Point oldLocation = new Point();
    private int measuredWidth;

    @Override
    protected void onFinishInflate() {
        iv_drag = (ImageView) this.findViewById(R.id.iv_drag);

        super.onFinishInflate();

    }

    public DragLayout(Context context) {
        super(context);

    }

    public DragLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        callback = new DraggerCallBack();
        //第二个参数就是滑动灵敏度的意思 可以随意设置
        mDragger = ViewDragHelper.create(this, 1.0f, callback);
    }

    private int x, y;

    class DraggerCallBack extends ViewDragHelper.Callback {

        //这个地方实际上函数返回值为true就代表可以滑动 为false 则不能滑动
        @Override
        public boolean tryCaptureView(View child, int pointerId) {
            if (child != iv_drag) {
                return false;
            }
            return true;
        }


        //这个地方实际上left就代表 你将要移动到的位置的坐标。返回值就是最终确定的移动的位置。
        // 我们要让view滑动的范围在我们的layout之内
        //实际上就是判断如果这个坐标在layout之内 那我们就返回这个坐标值。
        //如果这个坐标在layout的边界处 那我们就只能返回边界的坐标给他。不能让他超出这个范围
        //除此之外就是如果你的layout设置了padding的话,也可以让子view的活动范围在padding之内的.

        @Override
        public int clampViewPositionHorizontal(View child, int left, int dx) {
            //取得左边界的坐标
            final int leftBound = getPaddingLeft();
            //取得右边界的坐标
            final int rightBound = getWidth() - child.getWidth() - leftBound;
            //System.out.println("0803-->dx:"+dx+" left:"+left);
            //这个地方的含义就是 如果left的值 在leftbound和rightBound之间 那么就返回left
            //如果left的值 比 leftbound还要小 那么就说明 超过了左边界 那我们只能返回给他左边界的值
            //如果left的值 比rightbound还要大 那么就说明 超过了右边界,那我们只能返回给他右边界的值
            return Math.min(Math.max(left, leftBound), rightBound);
        }

        //纵向的注释就不写了 自己体会
        @Override
        public int clampViewPositionVertical(View child, int top, int dy) {
            final int topBound = getPaddingTop();
            final int bottomBound = getHeight() - child.getHeight() - topBound;
            return Math.min(Math.max(top, topBound), bottomBound);
        }

        @Override
        public void onViewReleased(View releasedChild, float xvel, float yvel) {
            //松手的时候 判断如果是这个view 就让他回到起始位置

            if (releasedChild == iv_drag) {
                if (iv_drag.getTop() - y >= -2 && iv_drag.getTop() - y <= 2 && iv_drag.getLeft() - x >= -2 && iv_drag.getLeft() - x <= 2) {
                    if (onClickImage != null) {
                        onClickImage.click();
                    }
                }
                if (iv_drag.getLeft() + oldLocation.x / 2 >= measuredWidth / 2) {
                    x = measuredWidth - oldLocation.x;
                    y = iv_drag.getTop();
                } else {
                    x = 0;
                    y = iv_drag.getTop();
                }
                mDragger.settleCapturedViewAt(x, y);
                invalidate();

            }
        }
    }

    @Override
    public void computeScroll() {
        if (mDragger.continueSettling(true)) {
            invalidate();
        }
    }

    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        //布局完成的时候就记录一下位置
        oldLocation.x = iv_drag.getWidth();
        oldLocation.y = iv_drag.getHeight();
        x = iv_drag.getLeft();
        y = iv_drag.getTop();
        measuredWidth = this.getMeasuredWidth();
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        //决定是否拦截当前事件
        return mDragger.shouldInterceptTouchEvent(ev);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //处理事件
        mDragger.processTouchEvent(event);
        //如果点击的是图片区域,就拦截点击事件,否则不拦截
        if (event.getY() > iv_drag.getTop() && event.getY() < iv_drag.getTop() + oldLocation.y && event.getX() > iv_drag.getLeft() && event.getX() < iv_drag.getLeft() + oldLocation.x)
            return true;
        return false;
    }
    private OnClickImage onClickImage;

    public void setOnClickImage(OnClickImage onClickImage) {
        this.onClickImage = onClickImage;
    }

    public interface OnClickImage {
        void click();
    }
}

xml中的使用

<com.jootun.hudongba.view.DragLayout
            android:id="@+id/layout_drag"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="3dp">

            <ImageView
                android:id="@+id/iv_drag"
                android:layout_width="86dip"
                android:layout_height="86dip"
                android:layout_alignParentRight="true"
                android:layout_marginTop="20dp"
                android:visibility="gone" />
 </com.jootun.hudongba.view.DragLayout>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值