适用于Android的双向滚动视图

时间:2014-11-10 08:41:16

标签: android android-layout

我需要一个双向滚动视图,其中添加了捏合和缩放手势。是否建议将滚动视图与水平滚动视图作为其子视图或自定义实现是唯一的解决方案?

1 个答案:

答案 0 :(得分:6)

严。尤尔金回答了类似的问题。您不需要自定义视图,但必须处理触摸事件。 Yan的这个解决方案是在水平方向内的垂直滚动视图:

  

比创建自定义视图有更简单的解决方案:

布局:

<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/scrollHorizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

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

        <WateverViewYouWant/>

    </ScrollView>
</HorizontalScrollView>

代码(onCreate / onCreateView):

final HorizontalScrollView hScroll = (HorizontalScrollView) value.findViewById(R.id.scrollHorizontal);
final ScrollView vScroll = (ScrollView) value.findViewById(R.id.scrollVertical);
vScroll.setOnTouchListener(new View.OnTouchListener() { //inner scroll listener         
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return false;
    }
});
hScroll.setOnTouchListener(new View.OnTouchListener() { //outer scroll listener         
    private float mx, my, curX, curY;
    private boolean started = false;

    @Override
    public boolean onTouch(View v, MotionEvent 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.scrollBy(0, dy);
                    hScroll.scrollBy(dx, 0);
                } else {
                    started = true;
                }
                mx = curX;
                my = curY;
                break;
            case MotionEvent.ACTION_UP: 
                vScroll.scrollBy(0, dy);
                hScroll.scrollBy(dx, 0);
                started = false;
                break;
        }
        return true;
    }
});

&GT;