Хорошо, так что соберите это из целого ряда различных решений:
Создание двух пользовательских компонентов, один расширяющий ScrollView, а другой расширяющий горизонтальный вид прокрутки:
public class VScroll extends ScrollView {
public VScroll(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public VScroll(Context context, AttributeSet attrs) {
super(context, attrs);
}
public VScroll(Context context) {
super(context);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return false;
}
}
И
public class HScroll extends HorizontalScrollView {
public HScroll(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public HScroll(Context context, AttributeSet attrs) {
super(context, attrs);
}
public HScroll(Context context) {
super(context);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return false;
}
}
в упражнении, в котором вам нужен «2d скроллер», используйте следующее:
в OnCreate ():
vScroll = findViewById(R.id.vScroll);
hScroll = findViewById(R.id.hScroll);
, а затем
private VelocityTracker mVelocityTracker;
private float mx, my;
private float curX, curY;
private boolean started;
@Override
public boolean onTouchEvent(MotionEvent event) {
if (mVelocityTracker == null) {
mVelocityTracker = VelocityTracker.obtain();
}
mVelocityTracker.addMovement(event);
curX = event.getX();
curY = event.getY();
int dx = (int) (mx - curX);
int dy = (int) (my - curY);
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
if (started) {
vScroll.smoothScrollBy(0, dy);
hScroll.smoothScrollBy(dx, 0);
} else {
started = true;
}
mx = curX;
my = curY;
break;
case MotionEvent.ACTION_UP:
final VelocityTracker velocityTracker = mVelocityTracker;
velocityTracker.computeCurrentVelocity(1000);
int initialXVelocity = (int) velocityTracker.getXVelocity();
int initialYVelocity = (int) velocityTracker.getYVelocity();
vScroll.fling(-initialYVelocity);
hScroll.fling(-initialXVelocity);
if (mVelocityTracker != null) {
mVelocityTracker.recycle();
mVelocityTracker = null;
}
break;
}
return true;
}
Это допускает двунаправленную прокрутку (да, даже диагональ), а также некоторую скорость, чтобы учесть эффект «броска». Лучше всего, он прекрасно работает с макетами RTL и LTR! Надеюсь, это будет полезно и для кого-то еще ...
РЕДАКТИРОВАТЬ: Забыли добавить XML часть:
<pack.customcomponents.VScroll android:layout_height="fill_parent"
android:layout_width="fill_parent" android:id="@+id/vScroll">
<pack.customcomponents.HScroll android:id="@+id/hScroll"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/white"
android:id="@+id/view_to_scroll"/>
</pack.customcomponents.HScroll>
</pack.customcomponents.VScroll>