仿京东首页摇红包
来源:互联网 发布: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