《群英传》中的
布局为一个linearlayout中放一个自定义的view
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.sks.scrolllayout.MainActivity"> <com.example.sks.scrolllayout.view.LayoutScrollView android:background="#56fa0a" android:layout_width="100dp" android:layout_height="100dp" /> </LinearLayout>主要写这个自定义view的OnTouchEvent
public class LayoutScrollView extends View { private int lastX; private int lastY; public LayoutScrollView(Context context) { super(context); } public LayoutScrollView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onTouchEvent(MotionEvent event) { int rawX = (int) event.getRawX(); int rawY = (int) event.getRawY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //记录触摸点的坐标 lastX = rawX; lastY = rawY; break; case MotionEvent.ACTION_MOVE: //计算偏移量 int offsetX = rawX - lastX; int offsetY = rawY - lastY; //1.在当前上下左右的基础上加上偏移量 // layout(getLeft() + offsetX, // getTop() + offsetY, // getRight() + offsetX, // getBottom() + offsetY); //2.还可以用此方法,与上面相似 // offsetLeftAndRight(offsetX);//同时对左右进行偏移 // offsetTopAndBottom(offsetY);//同时对上下进行偏移 //3.layoutParams设置要注意父布局是什么 // LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) getLayoutParams(); // layoutParams.leftMargin = getLeft() + offsetX; // layoutParams.topMargin = getTop() + offsetY; // setLayoutParams(layoutParams); //4.用ViewGroup的MarginLayoutParams,不需要考虑父布局类型 // ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams(); // layoutParams.leftMargin = getLeft() + offsetX; // layoutParams.topMargin = getTop() + offsetY; // setLayoutParams(layoutParams); //5.用scrollBy ((View)getParent()).scrollBy(-offsetX,-offsetY); //重新设置初始坐标 lastX = rawX; lastY = rawY; break; } return true; } }