Android Wear:GridViewPager中的WearableListView?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (129)

我正在构建一个Android Wear应用程序,我想把它呈现为几个页面,可以水平地浏览。

为此,我使用的是GridViewPager和相关的FragmentGridPagerAdapter,它是硬连接来使用单个行的。这对于在tiles之间水平滑动很好,但是在我的一个片段中,我想使用一个WearableListView来允许用户在几个操作之间进行选择。可这不起作用,因为GridViewPager似乎阻止任何滑动到WearableListView。有人知道是否有办法可以使用所描述的组件来完成这一任务吗?

我也尝试过使用标准的ViewPager,这允许WearableListView滚动,但是水平滑动会变得不稳定。

提问于
用户回答回答于

设置

    wearableListView.setGreedyTouchMode( true )

通过像这样扩展GridViewPager,可以更简洁地实现与已接受的答案大致相同的内容:

public class HorizontalListPager extends GridViewPager {

    private final GestureDetector mGestureDetector;

    public HorizontalListPager( Context context, AttributeSet attrs ) {
        super( context, attrs );
        mGestureDetector = new GestureDetector( context, new HScrollDetector() );
    }

    @Override
    public boolean onInterceptTouchEvent( MotionEvent ev ) {
        // If we have more horizontal than vertical scrolling, intercept the event,
        // otherwise let the child handle it
        return super.onInterceptTouchEvent( ev ) && mGestureDetector.onTouchEvent( ev );
    }

    class HScrollDetector extends GestureDetector.SimpleOnGestureListener {

        @Override
        public boolean onScroll( MotionEvent e1, MotionEvent e2, float distanceX, float distanceY ) {
            // Returns true if scrolling horizontally
            return ( Math.abs( distanceX ) > Math.abs( distanceY ) );
        }
    }
}
用户回答回答于

我遇到了同样的事情。仅仅设置一行或覆盖canscroll垂直()是行不通的。我发现的唯一选择是覆盖触控事件,如Neevek在这里的回答:滚动视图触摸处理中的HorizontalScrollView

这是我的代码:

private float xDistance, yDistance, lastX, lastY;

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            setDownPosition(ev);
            break;
        case MotionEvent.ACTION_MOVE:
            if (isVerticalScroll(ev))
                return false;
    }

    return super.onInterceptTouchEvent(ev);
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            setDownPosition(ev);
            break;
        case MotionEvent.ACTION_MOVE:
            if (isVerticalScroll(ev))
                return false;
    }

    return super.onTouchEvent(ev);
}

private void setDownPosition(MotionEvent ev){
    xDistance = yDistance = 0f;
    lastX = ev.getX();
    lastY = ev.getY();
}

private boolean isVerticalScroll(MotionEvent ev){
    final float curX = ev.getX();
    final float curY = ev.getY();
    xDistance += Math.abs(curX - lastX);
    yDistance += Math.abs(curY - lastY);
    lastX = curX;
    lastY = curY;
    if(xDistance < yDistance) {
        return true;
    }
    return false;
}

扫码关注云+社区

领取腾讯云代金券