Я знаю, что это было неактивно в течение года, но это все еще проблема в 2013 году. Создайте новый класс, расширяющий HorizontalScrollView, и скопируйте / вставьте приведенный ниже код.
@Override
public boolean onTouchEvent(MotionEvent ev) {
autoScrolling = false;
return super.onTouchEvent(ev);
}
private int getScrollRange() {
int scrollRange = 0;
if(getChildCount() > 0) {
View child = getChildAt(0);
scrollRange = Math.max(0, child.getWidth() - (getWidth() - getPaddingLeft() - getPaddingRight()));
}
return scrollRange;
}
private boolean gravityRight = false;
private boolean autoScrolling = false;
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
// HorizontalScrollView is broken for Gravity.RIGHT. So we're fixing it.
if(getChildCount() == 0) return super.onLayout(changed, left, top, right, bottom);
int childWidth = getChildAt(0).getWidth();
super.onLayout(changed, left, top, right, bottom);
int delta = getChildAt(0).getWidth() - childWidth;
AdvancedDisplay view = getView();
ScrollableDisplay.LayoutParams p = (LayoutParams) view.getLayoutParams();
int horizontalGravity = p.gravity & Gravity.HORIZONTAL_GRAVITY_MASK;
int verticalGravity = p.gravity & Gravity.VERTICAL_GRAVITY_MASK;
if(horizontalGravity == Gravity.RIGHT) {
if(getScrollRange() > 0) {
gravityRight = true;
p.gravity = Gravity.LEFT | verticalGravity;
view.setLayoutParams(p);
super.onLayout(changed, left, top, right, bottom);
}
}
else if(gravityRight) {
if(getScrollRange() == 0) {
gravityRight = false;
p.gravity = Gravity.RIGHT | verticalGravity;
view.setLayoutParams(p);
super.onLayout(changed, left, top, right, bottom);
}
}
if(gravityRight && delta > 0) {
autoScrolling = false;
scrollBy(delta, 0);
autoScrolling = true;
}
}
@Override
public void computeScroll() {
if(autoScrolling) return;
super.computeScroll();
}
@Override
public void scrollTo(int x, int y) {
if(autoScrolling) return;
super.scrollTo(x, y);
}