ユーザーがサブクラス化された NestedScrollView のビューに到達したときに、タブ ( TabLayout )を更新する必要があります。
私のレイアウト:
<android.support.design.widget.CoordinatorLayout>
<!-- My Subclassed NestedScrollView. This is due to parallax image on top .-->
<com.company.recipes.ObservableScrollView>
<!-- Container for parallax image -->
<FrameLayout>
<ImageView/>
</FrameLayout>
<!-- Some Content -->
<View
android:id="@+id/divider"/>
<!-- More Content -->
<View
android:id="@+id/divider2"/>
</com.company.recipes.ObservableScrollView>
<android.support.design.widget.AppBarLayout>
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar_detail"
app:layout_scrollFlags="scroll|enterAlways"/>
<android.support.design.widget.TabLayout
android:id="@+id/tab_layout"/>
</android.support.design.widget.AppBarLayout>
</android.support.design.widget.CoordinatorLayout>
私の言いたいことをより明確にするために、実際のデータを含む画像を次に示します。
TabLayout には 3 つの固定タブがあります。TabLayout は常に画面に表示されます。ユーザーが上下にスクロールするときに、TabIndicator を更新したい。これは、Divider を通過するときに発生するはずです。
では、ビューが表示領域の外にスクロールされたかどうかを確認するオン スクロール リスナーを作成するにはどうすればよいでしょうか。
これが私のサブクラス化された NestedScrollView です: ObservableScrollView.java
public class ObservableScrollView extends NestedScrollView {
public interface OnScrollChangedListener {
void onScrollChanged(int deltaX, int deltaY);
}
private OnScrollChangedListener mOnScrollChangedListener;
public ObservableScrollView(Context context) {
super(context);
}
public ObservableScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ObservableScrollView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if(mOnScrollChangedListener != null) {
mOnScrollChangedListener.onScrollChanged(l - oldl, t - oldt);
}
}
public void setOnScrollChangedListener(OnScrollChangedListener listener) {
mOnScrollChangedListener = listener;
}
}
そして、視差画像のスクロールを処理する onScrollChangedListener:
final ObservableScrollView scrollView = (ObservableScrollView) findViewById(R.id.myscrollView);
scrollView.setOnScrollChangedListener(new ObservableScrollView.OnScrollChangedListener() {
@Override
public void onScrollChanged(int deltaX, int deltaY) {
int scrollY = scrollView.getScrollY();
// Add parallax effect
findViewById(R.id.frame_photo).setTranslationY(scrollY * 0.5f);
}
});
これはSOの質問です。