标签:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <com.scu.lly.dragviewtest.view.DragView android:layout_width="100dp" android:layout_height="100dp" /> </LinearLayout>
public class DragView extends View{ private int mLastX; private int mLastY; public DragView(Context context) { super(context); init(); } public DragView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public DragView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init(){ setBackgroundColor(Color.BLUE); } @Override public boolean onTouchEvent(MotionEvent ev) { int x = (int) ev.getX(); int y = (int) ev.getY(); switch (ev.getAction()){ case MotionEvent.ACTION_DOWN: mLastX = x; mLastY = y; break; case MotionEvent.ACTION_MOVE: int offsetX = x - mLastX; int offsetY = y - mLastY; //调整layout的四个坐标 layout(getLeft() + offsetX, getTop() + offsetY, getRight() + offsetX, getBottom() + offsetY); break; } return true; } }
<span style="white-space:pre"> </span>case MotionEvent.ACTION_MOVE: int offsetX = x - mLastX; int offsetY = y - mLastY; //调整layout的四个坐标 //layout(getLeft() + offsetX, getTop() + offsetY, getRight() + offsetX, getBottom() + offsetY); //使用简写形式 offsetLeftAndRight(offsetX); offsetTopAndBottom(offsetY); break;
case MotionEvent.ACTION_MOVE: int offsetX = x - mLastX; int offsetY = y - mLastY; LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) getLayoutParams(); lp.leftMargin = getLeft() + offsetX; lp.topMargin = getTop() + offsetY; setLayoutParams(lp); break;
case MotionEvent.ACTION_MOVE: int offsetX = x - mLastX; int offsetY = y - mLastY; //LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) getLayoutParams(); ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) getLayoutParams(); lp.leftMargin = getLeft() + offsetX; lp.topMargin = getTop() + offsetY; setLayoutParams(lp); break;
case MotionEvent.ACTION_MOVE: //int offsetX = x - mLastX; //int offsetY = y - mLastY; //此时,计算坐标是相反的 int offsetX = mLastX - x; int offsetY = mLastY - y; //让View所在的ViewGroup进行移动 ((View)getParent()).scrollBy(offsetX,offsetY); break;
public class DragView extends View{ private int mLastX; private int mLastY; private Scroller mScroller; public DragView(Context context) { super(context); init(context); } public DragView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public DragView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); } private void init(Context context){ setBackgroundColor(Color.BLUE); mScroller = new Scroller(context); } @Override public boolean onTouchEvent(MotionEvent ev) { int x = (int) ev.getX(); int y = (int) ev.getY(); switch (ev.getAction()){ case MotionEvent.ACTION_DOWN: mLastX = x; mLastY = y; break; case MotionEvent.ACTION_MOVE: //int offsetX = x - mLastX; //int offsetY = y - mLastY; //此时,计算坐标是相反的 int offsetX = mLastX - x; int offsetY = mLastY - y; //让View所在的ViewGroup进行移动 ((View)getParent()).scrollBy(offsetX,offsetY); break; case MotionEvent.ACTION_UP: View viewGroup = (View) getParent(); mScroller.startScroll(viewGroup.getScrollX(),viewGroup.getScrollY(),-viewGroup.getScrollX(),-viewGroup.getScrollY()); //记住需要invalidate invalidate(); break; } return true; } @Override public void computeScroll() { super.computeScroll(); if(mScroller.computeScrollOffset()){ ((View)getParent()).scrollTo(mScroller.getCurrX(),mScroller.getCurrY()); //记住,需要不断调用invalidate进行重绘 invalidate(); } } }
标签:
原文地址:http://blog.csdn.net/shakespeare001/article/details/51657795