将滚动视图放置在上下按钮下方。

4
我希望能够在上下箭头下方显示scrollView,如图片所示。点击向上和向下箭头后,滚动条应该滚动,在向上和向下按钮上长按后,它应该一直滚动到终点。
请告诉我如何实现此功能。
提前感谢您的帮助。 enter image description here
2个回答

3

在按钮的点击事件中执行ScrollView.pageScroll()ScrollView.smoothScrollBy()

当长按事件发生时,使用Runnable来持续调用ScrollView.scrollBy()。我为您编写了一个演示。

public class TestAndroidActivity extends Activity implements OnTouchListener,
        OnGestureListener {
    private static final String TAG = "TestAndroid";
    private Handler mHandler = new Handler();
    private ScrollView mScrollView;
    private Button mBtnUp;
    private Button mBtnDown;
    private View mCurBtn;
    private GestureDetector mDetecor;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mScrollView = (ScrollView) findViewById(R.id.scroll);
        mBtnUp = (Button) findViewById(R.id.btn_up);
        mBtnDown = (Button) findViewById(R.id.btn_down);
        mBtnUp.setOnTouchListener(this);
        mBtnDown.setOnTouchListener(this);
        mDetecor = new GestureDetector(this, this);
    }

    private long mStartTime = 0;
    private float mSpeed = 0.5f;
    private Runnable mScrollRunnable = new Runnable() {

        @Override
        public void run() {
            int dy = (int) ((SystemClock.uptimeMillis() - mStartTime) * mSpeed);
            mStartTime = SystemClock.uptimeMillis();
            int direction = getCurrentBtnDirection();
            if (direction == View.FOCUS_UP)
                dy *= -1;
            mScrollView.scrollBy(0, dy);
            mHandler.post(this);
        }
    };

    private int getCurrentBtnDirection() {
        if (mCurBtn == mBtnUp) {
            return View.FOCUS_UP;
        } else if (mCurBtn == mBtnDown) {
            return View.FOCUS_DOWN;
        } else
            return 0;
    }

    private void perfromPageScroll() {
        int direction = getCurrentBtnDirection();
        mScrollView.pageScroll(direction);
    }

    private void stopContinuousScroll() {
        mStartTime = 0;
        mHandler.removeCallbacks(mScrollRunnable);
    }

    private void startContinuousScroll() {
        mStartTime = SystemClock.uptimeMillis();
        mHandler.post(mScrollRunnable);
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        mCurBtn = v;
        mDetecor.onTouchEvent(event);
        if (event.getAction() == MotionEvent.ACTION_UP) {
            stopContinuousScroll();
        }
        return true;
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        perfromPageScroll();
        return true;
    }

    @Override
    public void onLongPress(MotionEvent e) {
        startContinuousScroll();
    }

    @Override
    public boolean onDown(MotionEvent e) {
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
            float distanceY) {
        return false;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        return false;
    }

}

如果您想检测ScrollView的滚动状态以启用或禁用按钮,则必须编写CustomView以扩展ScrollView并覆盖OnScrollChanged()方法。

编辑:添加布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ScrollView
        android:id="@+id/scroll"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="1\n\n\n\n\n\n2\n\n\n\n\n\n3\n\n\n\n\n4\n\n\n\n5\n\n"
            android:textSize="32sp" />
    </ScrollView>

    <Button
        android:id="@+id/btn_up"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:text="up" />

    <Button
        android:id="@+id/btn_down"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:text="down" />

</RelativeLayout>

编辑2: 如果您正在使用ListView,可以使用ListView.smoothScrollBy()来替换ScrollView.scrollBy()。在ListView中没有pageScroll()方法,您需要自己编写,这并不是很难。

编辑3: ListView的pageScroll

private void pageScroll(ListView l) {
    l.smoothScrollBy(l.getHeight(), 300);
}

1
我无法相信这样详细的示例没有得到任何反馈。 - faylon
1
你怎么知道我没有实现你所有的需求,即使没有尝试演示版。 - faylon
我在listview中实现了滚动条,位于向上和向下箭头按钮之间。这是你的代码没有实现的。 - A K Jha
你说“在上下显示scrollView”,其实只需要一个RelativeLayout,里面包含一个ScrollView和两个按钮。我以为你已经写好了这个布局。 - faylon
但是ScrollView与ListView有关。 - A K Jha
显示剩余8条评论

0

要回到顶部,您可以使用该方法

ScrollView.fullScroll(ScrollView.FOCUS_UP)

对于可滚动部分...基本上可以使用函数

ScrollView.smoothScrollTo (int x, int y)

您可以通过getScrollX()getScrollY()获取当前的X,Y位置,然后再添加一些量来滚动更远。


但这并不是一个完整的答案。 - A K Jha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接