1

我已经扩展了这个HorizontalScrollView类来实现某种行为。在我里面的 LinearLayout 下,CustomHorizontalScrollView我只有 2 个子视图(可以说ImageView)。当用户向一个方向滚动超过 50% 时,我希望我CustomHorizontalScrollView自动滚动到同一方向的末尾。这就是我实现它的方式:
CustomHorizontalScrollView类:

    public class CustomHorizontalScrollView extends HorizontalScrollView {

    private static float downCoordinates = -1;
    private static float upCoordinates = -1;
    private static int currentPosition = 0;

    public CustomHorizontalScrollView(Context ctx) {
        super(ctx);
    }

    public CustomHorizontalScrollView(Context ctx, AttributeSet attrs) {
        super(ctx, attrs);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN && downCoordinates == -1) {
            downCoordinates = ev.getX();
        }
        else if (ev.getAction() == MotionEvent.ACTION_UP && upCoordinates == -1) {
            upCoordinates = ev.getX();
            int scrollViewWidth = this.getMeasuredWidth();
            double dist = downCoordinates - upCoordinates; 
            if (Math.abs(dist) > scrollViewWidth / 2) {
                //this.setSmoothScrollingEnabled(true);
                // Going forwards
                if (dist > 0) {
                    int max = ((LinearLayout)this.getChildAt(0)).getChildAt(1).getMeasuredWidth();
                    currentPosition = max;
                    this.scrollTo(max, 0);
                }
                // Going backwards
                else {
                    currentPosition = 0;
                    this.scrollTo(0, 0);
                }
            }
            // reseting the saved Coordinates
            downCoordinates = -1;
            upCoordinates = -1;
        }
        return super.onTouchEvent(ev);
    }
}

直到这里 - 一切正常。问题是我希望自动滚动顺利完成,所以我尝试使用该smoothScrollTo函数而不是该scrollTo函数,但随后没有任何反应(因为没有自动滚动)。我试着声明这个:

this.setSmoothScrollingEnabled(true);

但也没有成功。

4

2 回答 2

12

你试过这个吗?

    this.post(new Runnable() { 
        public void run() { 
             this.smoothScrollTo(0, this.getBottom());
        } 
});
于 2013-05-30T10:52:17.673 回答
1

这仍然对我不起作用,所以我发现我需要在这条线之后

this.smoothScrollTo(0, this.getBottom());

添加这个

this.invalidate();
于 2013-11-13T12:20:01.543 回答