使用ViewDragHelp实现ImageView拖动超过屏幕1/2回到屏幕左边,否则到右边,还有一个就是还能实现点击的效果

来源:互联网 发布:太原java培训机构 编辑:程序博客网 时间:2024/06/05 06:50

首先,来看看效果图


完成如上效果主要需要一个类

public class DragView extends LinearLayout {    private ViewDragHelper mViewDragHelper;    private Point initPoint;    private View autoTextView;    public DragView(Context context, AttributeSet attrs) {        super(context, attrs);        initDragHelper();    }    private void initDragHelper() {        mViewDragHelper = ViewDragHelper.create(DragView.this, 1.0f, mDragCallback);        initPoint = new Point();    }    /**     * ViewDragHelper回调接口     */    private ViewDragHelper.Callback mDragCallback = new ViewDragHelper.Callback() {        @Override        public boolean tryCaptureView(View child, int pointerId) {            return true;        }        @Override        public int clampViewPositionHorizontal(View child, int left, int dx) {// 水平拖动            final int leftPadding = getPaddingLeft();            final int rightPadding = getWidth() - child.getWidth() - leftPadding;            final int newLeft = Math.min(Math.max(left, leftPadding), rightPadding);            return newLeft;        }        @Override        public int clampViewPositionVertical(View child, int top, int dy) {//竖直拖动            final int topPadding = getPaddingTop();            final int bottomPadding = getHeight() - child.getHeight() - topPadding;            final int newTop = Math.min(Math.max(top, topPadding), bottomPadding);            return newTop;        }        @Override        public void onViewReleased(View releasedChild, float xvel, float yvel) {//拖动结束后            super.onViewReleased(releasedChild, xvel, yvel);            if (releasedChild == autoTextView && releasedChild.getLeft()  < (getWidth()/2)){                mViewDragHelper.smoothSlideViewTo(releasedChild,initPoint.x,initPoint.y);//平滑移动                ViewCompat.postInvalidateOnAnimation(DragView.this);            }        }    };    @Override    public boolean onInterceptHoverEvent(MotionEvent event) {//拦截事件        return mViewDragHelper.shouldInterceptTouchEvent(event);    }    @Override    public boolean onTouchEvent(MotionEvent event) {//消费事件        mViewDragHelper.processTouchEvent(event);        return true;    }    @Override    public void computeScroll() {        super.computeScroll();        if (mViewDragHelper.continueSettling(true)) {//不停计算位置后,自动移动            ViewCompat.postInvalidateOnAnimation(DragView.this);//重新绘制        }    }    /**     * 完成解析布局xml文件     */    @Override    protected void onFinishInflate() {        super.onFinishInflate();        autoTextView =  getChildAt(0);    }    /**     * 布局     */    @Override    protected void onLayout(boolean changed, int l, int t, int r, int b) {        super.onLayout(changed, l, t, r, b);        initPoint.x = autoTextView.getLeft();        initPoint.y = autoTextView.getTop();    }}


然后就可以拿来使用了

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ImageView iv=(ImageView)findViewById(R.id.iv);        iv.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Toast.makeText(MainActivity.this, "点击了该图标", Toast.LENGTH_SHORT).show();            }        });    }


需要注意的是需要在布局文件中换成自定义的

<?xml version="1.0" encoding="utf-8"?><com.jhy.test4.DragView xmlns:android="http://schemas.android.com/apk/res/android"                android:layout_width="match_parent"                android:layout_height="match_parent">    <ImageView        android:id="@+id/iv"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentRight="true"        android:src="@mipmap/ic_launcher_round"        android:layout_marginRight="5dp"        android:layout_marginTop="250dp"        android:padding="1dp"/></com.jhy.test4.DragView>

然后就大功告成了


源码下载地址:http://download.csdn.net/detail/k2514091675/9900149


阅读全文
0 0
原创粉丝点击