/*
* Copyright 2016 "Henry Tao <hi@henrytao.me>"
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package me.henrytao.smoothappbarlayout.base;
import android.support.annotation.NonNull;
import android.support.v4.widget.NestedScrollView;
import android.view.View;
import android.view.ViewTreeObserver;
import me.henrytao.smoothappbarlayout.R;
/**
* Created by henrytao on 2/3/16.
*/
public class ObservableNestedScrollView implements Observer, NestedScrollView.OnScrollChangeListener {
public static ObservableNestedScrollView newInstance(@NonNull NestedScrollView nestedScrollView, boolean overrideOnScrollListener,
OnScrollListener onScrollListener) {
ObservableNestedScrollView observable = new ObservableNestedScrollView(nestedScrollView, overrideOnScrollListener);
observable.setOnScrollListener(onScrollListener);
return observable;
}
private NestedScrollView mNestedScrollView;
private OnScrollListener mOnScrollListener;
private boolean mOverrideOnScrollListener;
public ObservableNestedScrollView(@NonNull NestedScrollView nestedScrollView, boolean overrideOnScrollListener) {
mNestedScrollView = nestedScrollView;
mOverrideOnScrollListener = overrideOnScrollListener;
if (mNestedScrollView.getTag(R.id.tag_observable_view) == null) {
mNestedScrollView.setTag(R.id.tag_observable_view, true);
init();
}
}
@Override
public View getView() {
return mNestedScrollView;
}
@Override
public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
if (mOnScrollListener != null) {
mOnScrollListener.onScrollChanged(mNestedScrollView,
scrollX,
scrollY,
scrollX - oldScrollX,
scrollY - oldScrollY,
true);
}
}
@Override
public void setOnScrollListener(OnScrollListener onScrollListener) {
mOnScrollListener = onScrollListener;
}
private void init() {
if (mNestedScrollView instanceof me.henrytao.smoothappbarlayout.widget.NestedScrollView) {
((me.henrytao.smoothappbarlayout.widget.NestedScrollView) mNestedScrollView).addOnScrollListener(this);
} else {
if (mOverrideOnScrollListener) {
mNestedScrollView.setOnScrollChangeListener(this);
} else {
mNestedScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
if (mOnScrollListener != null) {
int currentScrollX = mNestedScrollView.getScrollX();
int currentScrollY = mNestedScrollView.getScrollY();
mOnScrollListener.onScrollChanged(mNestedScrollView,
currentScrollX,
currentScrollY,
currentScrollX - Utils.parseInt(mNestedScrollView.getTag(R.id.tag_observable_view_last_scroll_x)),
currentScrollY - Utils.parseInt(mNestedScrollView.getTag(R.id.tag_observable_view_last_scroll_y)),
true);
mNestedScrollView.setTag(R.id.tag_observable_view_last_scroll_x, currentScrollX);
mNestedScrollView.setTag(R.id.tag_observable_view_last_scroll_y, currentScrollY);
}
}
});
}
}
}
}