由於設置ScrollManager
的通知andig對於這樣一個偉大的synching scrollview solution。
但是在兩個滾動瀏覽器之間有一點點滯後。
所以我寫這裏擴展的解決方案,以消除這兩個scrollview之間的滯後。
我剛剛使用了OverScroller類,並在SyncedScrollView中手動處理了拋擲事件。
您必須用下面的代碼替換SyncedScrollView。 使用來自andig's solution
import android.content.Context;
import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.OverScroller;
import android.widget.ScrollView;
/**
* Created by mitul.varmora on 11/7/2016.
* SyncedScrollView
* https://stackoverflow.com/questions/3527119/sync-two-scrollview
*/
public class SyncedScrollView extends ScrollView implements ScrollNotifier {
private ScrollListener scrollListener = null;
private OverScroller scroller;
private Runnable scrollerTaskRunnable;
public SyncedScrollView(Context context) {
super(context);
init();
}
public SyncedScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public SyncedScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
scroller = new OverScroller(getContext());
scrollerTaskRunnable = new Runnable() {
@Override
public void run() {
scroller.computeScrollOffset();
smoothScrollTo(0, scroller.getCurrY());
if (!scroller.isFinished()) {
SyncedScrollView.this.post(this);
} else {
//deceleration ends here, do your code
ViewCompat.postInvalidateOnAnimation(SyncedScrollView.this);
}
}
};
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (scrollListener != null)
scrollListener.onScrollChanged(this, l, t, oldl, oldt);
}
@Override
public ScrollListener getScrollListener() {
return scrollListener;
}
@Override
public void setScrollListener(ScrollListener scrollListener) {
this.scrollListener = scrollListener;
}
@Override
public void fling(int velocityY) {
scroller.forceFinished(true);
scroller.fling(getScrollX(), getScrollY(), 0, velocityY, 0, 0, 0, getChildAt(0).getHeight());
post(scrollerTaskRunnable);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
// return super.onTouchEvent(ev);
boolean eventConsumed = super.onTouchEvent(ev);
if (eventConsumed && ev.getAction() == MotionEvent.ACTION_UP) {
if (scroller.isFinished()) {
//do your code
}
}
return eventConsumed;
}
}
其他類你試圖滾動型延伸到可以覆蓋的onTouchEvent方法,並用它來調用您的其他滾動型的onTouchEvent,並將它傳遞相同的事件? – schwiz 2010-11-02 21:52:40