以下是个人封装控件进行可拖动的一个函数,直接调用就可以,代码如下: private static int screenWidth; private static int screenHeight; private static int lastX; private static int lastY; /** * view 的拖动事件 * */ public static void moveView(Context mContext,View moveView){ try { if(mContext==null||moveView==null){ return; } screenWidth=UtilsUI.getMetric(mContext).widthPixels; screenHeight=UtilsUI .getMetric(mContext).heightPixels; moveView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { int action=event.getAction(); switch(action){ case MotionEvent.ACTION_DOWN: lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); break; /** * layout(l,t,r,b) * l Left position, relative to parent t Top position, relative to parent r Right position, relative to parent b Bottom position, relative to parent * */ case MotionEvent.ACTION_MOVE: int x=(int)event.getRawX(); int y=(int)event.getRawY(); int dx =x- lastX; int dy =y- lastY; int left = v.getLeft() + dx; int top = v.getTop() + dy; int right = left+v.getWidth(); int bottom = top + v.getHeight(); if(left < 0){ left = 0; right = left + v.getWidth(); } if(right > screenWidth){ right = screenWidth; left = right - v.getWidth(); } if(top < 0){ top = 0; bottom = top + v.getHeight(); } if(bottom > screenHeight){ bottom = screenHeight; top = bottom - v.getHeight(); } v.layout(left, top, right, bottom); lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); setParentLayout(v,left, top); break; case MotionEvent.ACTION_UP: break; } return true; } }); } catch (Exception e) { e.printStackTrace(); } } /** * 改变父布局位置以防止重绘后回到原点的问题 * */ private static void setParentLayout(View v,int left, int top) { // 每次移动都要设置其layout,不然由于父布局可能嵌套listview,当父布局发生改变冲毁(如下拉刷新时)则移动的view会回到原来的位置 RelativeLayout.LayoutParams lpFeedback = new RelativeLayout.LayoutParams( RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); int curRight = screenWidth - left - v.getWidth(); int curBottom = screenHeight - top - v.getHeight(); lpFeedback.setMargins(left, top, curRight, curBottom); v.setLayoutParams(lpFeedback); }
代码调用:
moveView(myContext,myView)