3

G+ Androidアプリのプロフィール画面を再現してみました。この画面では、タブを含む horizo​​ntalScrollView が画面の上部に固定されていることがわかります。

画面は、HeaderView (ImageBackground、アバター、情報、タブ) とリスト (カード) を含むリストで構成されます。

タブを上部に貼り付けてタッチ イベントをキャプチャすることはできますが、ヘッダーが上部から完全に消えると、フリング効果が機能しなくなります (<=> の firstVisible アイテムがlistviewヘッダーでない場合)。に触れて動かすことができHorizontalScrollViewます。飛ばそうとするまでは機能します。

Fling OK:

フリング 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);
}

2 番目のステップ:

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);
}

この方法でできると確信しているので、タブビューを複製しないようにしています。私が十分に明確だったことを願っています。

編集小さなビデオを作りました

ご覧のとおり、ヘッダー ビューが完全に消えるまでは完全に機能します。

4

2 に答える 2

1

このスムーズな UI (スティッキー ヘッダー ビュー) を数か月前に開発しました。Horizo​​ntalScrollView であるスティッキーヘッダーを飛ばしても問題はありません

私のgithubでこれを確認してください:https://github.com/flavienlaurent/sandbox/blob/master/src/com/fourmob/sandbox/activities/StickyHeaderViewActivity.java

于 2013-10-08T13:10:08.583 に答える