仿京东首页摇红包

来源:互联网 发布:sql注入用什么工具 编辑:程序博客网 时间:2024/04/28 19:54

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>
0 0