G+ Androidアプリのプロフィール画面を再現してみました。この画面では、タブを含む horizontalScrollView が画面の上部に固定されていることがわかります。
画面は、HeaderView (ImageBackground、アバター、情報、タブ) とリスト (カード) を含むリストで構成されます。
タブを上部に貼り付けてタッチ イベントをキャプチャすることはできますが、ヘッダーが上部から完全に消えると、フリング効果が機能しなくなります (<=> の firstVisible アイテムが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);
}
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);
}
この方法でできると確信しているので、タブビューを複製しないようにしています。私が十分に明確だったことを願っています。
編集:小さなビデオを作りました
ご覧のとおり、ヘッダー ビューが完全に消えるまでは完全に機能します。