【问题标题】:Stick a horizontalScrollView and capture touch events粘贴一个水平滚动视图并捕获触摸事件
【发布时间】:2013-10-07 20:33:26
【问题描述】:

我正在尝试重现 G+ Android 应用的个人资料屏幕。在此屏幕中,您可以注意到一个包含选项卡的 Horizo​​ntalScrollView,它位于屏幕顶部。

屏幕由一个列表组成,包含一个 HeaderView(ImageBackground、头像、信息和选项卡)和列表(卡片)。

我可以让标签贴在顶部并捕获触摸事件,但是当标题从顶部完全消失时,投掷效果不再起作用(如果listview 的第一个可见项是不是标题)。我可以触摸和移动HorizontalScrollView,它可以工作,直到我尝试投掷。

Fling OK:

Fling KO:

这是我所做的:

第一步:子类HorizontalScrollView添加ScrollChangedListener

@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
    super.onScrollChanged(l, t, oldl, oldt);
    if(mOnScrollChangedListener != null) mOnScrollChangedListener.onScrollChanged(l, t, oldl, oldt);
}

第二步:

mViewToDraw.setOnScrollChangedListener(new MyHorizontalScrollView.OnScrollChangedListener() {
    @Override
    public void onScrollChanged(int l, int t, int oldl, int oldt) {
        mCurrentScrollX = l;
        invalidate(0, 0, getWidth(), mViewToDraw.getMeasuredHeight());
    }
});

第 3 步:抽奖

@Override
protected void dispatchDraw(Canvas canvas) {
    super.dispatchDraw(canvas);
    if (mViewToDraw == null) {
      return;
    }

    canvas.translate(-mCurrentScrollX, 0);
    mViewToDraw.draw(canvas);
}

第 4 步:捕获触摸事件

private enum TouchState {NONE, TOUCHING_HEADER}

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
  if (mViewToDraw == null) {
    return super.dispatchTouchEvent(ev);
  }

  int bottom = mViewToDraw.getMeasuredHeight();
  boolean captured = false;
  boolean invalidate = false;
  switch (ev.getAction()) {
    case MotionEvent.ACTION_DOWN:
      if (ev.getY() <= bottom) {
        mTouchState = TouchState.TOUCHING_HEADER;
        invalidate = true;
        captured = mViewToDraw.dispatchTouchEvent(ev);
      }
      break;
    case MotionEvent.ACTION_CANCEL:
    case MotionEvent.ACTION_UP:
      if (mTouchState == TouchState.TOUCHING_HEADER) {
        mTouchState = TouchState.NONE;
        invalidate = true;
        captured = mViewToDraw.dispatchTouchEvent(ev);
      }
      break;
    default:
      if (mTouchState == TouchState.TOUCHING_HEADER) {
        invalidate = true;
        captured = mViewToDraw.dispatchTouchEvent(ev);
      }
  }

  if (invalidate) {
    mViewToDraw.invalidate();
    invalidate(0, 0, getWidth(), bottom);
  }

  if (captured) {
    return true;
  }

  return super.dispatchTouchEvent(ev);
}

我试图不复制标签视图,因为我很确定我可以这样做。希望我已经足够清楚了。

编辑:我做了一个small video

如您所见,它可以完美运行,直到标题视图完全消失。

【问题讨论】:

    标签: android listview horizontalscrollview


    【解决方案1】:

    几个月前,我开发了这个流畅的 UI(粘性标题视图)。 我没有任何问题抛出粘性标题,它是一个 Horizo​​ntalScrollView

    在我的 github 上查看这个:https://github.com/flavienlaurent/sandbox/blob/master/src/com/fourmob/sandbox/activities/StickyHeaderViewActivity.java

    【讨论】:

      【解决方案2】:

      我写了一篇关于 HERE 的博文

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-02
        • 2012-11-27
        • 1970-01-01
        相关资源
        最近更新 更多