Android scrollviewスライド状態をどうやって監督しますか?
4601 ワード
ScrllView
ビューのスクロール処理は、原点座標を常に変更しています。指が触れたら、スコープビューはタッチイベントを一時的にブロックして、タイマーを使います。もしタイマーが点に到達した後に指の移動イベントが発生しなかったら、ScrelViewはtrocing eventsをクリックされたsubViewに送信します。もしタイムアウト後にモバイルイベントが発生したら、ScrelViewはtrocingをキャンセルして自分で起動してスクロールします。
まず言ってください NestedScrrollViewのスライドイベントのモニター、
使うなら
しかし、今は「スライドする時は、端にある浮遊枠を隠して、スライドしないと浮遊枠で表示されます」というニーズがあります。このようにすると、スライド状態を監視する必要があります。scrollviewはrecyclerviewのように滑り状態を監視することができません。
以下は私の一つの実現案です。Count DownTimerを通じて実現します。
先のオンスクリーンで インターフェースに追加する方法
以下はこのカスタムのscrollerviewを使います。
以上述べたように、皆さんに紹介したAndroid scrollviewはどうやってスライド状態を監督し、皆さんの助けを期待しています。もし何か質問があれば、メッセージをください。ここでも私たちのサイトを応援してくれてありがとうございます。
本文があなたのためになると思ったら、転載を歓迎します。出所を明記してください。ありがとうございます。
ビューのスクロール処理は、原点座標を常に変更しています。指が触れたら、スコープビューはタッチイベントを一時的にブロックして、タイマーを使います。もしタイマーが点に到達した後に指の移動イベントが発生しなかったら、ScrelViewはtrocing eventsをクリックされたsubViewに送信します。もしタイムアウト後にモバイルイベントが発生したら、ScrelViewはtrocingをキャンセルして自分で起動してスクロールします。
まず言ってください NestedScrrollViewのスライドイベントのモニター、
使うなら
nestedScrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() {
@Override
public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
}
});
この方法はAPI>=23にある。 時にしか使えませんが、どうやって解決しますか?私たちは自分でSrollViewを定義できます。
public class MyScrollView extends NestedScrollView {
private OnScrollChanged mOnScrollChanged;
public MyScrollView(Context context) {
this(context, null);
}
public MyScrollView(Context context, AttributeSet attributeSet) {
this(context, attributeSet, 0);
}
public MyScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (mOnScrollChanged != null) {
mOnScrollChanged.onScroll(l, t, oldl, oldt);
}
}
public void setOnScrollChanged(OnScrollChanged onScrollChanged) {
this.mOnScrollChanged = onScrollChanged;
}
public interface OnScrollChanged {
void onScroll(int l, int t, int oldl, int oldt);
}
}
このように、私たちはオンスクリーンChanged()スライドイベントをモニターすることによって、スライド距離を監視できます。これで多くのことができます。しかし、今は「スライドする時は、端にある浮遊枠を隠して、スライドしないと浮遊枠で表示されます」というニーズがあります。このようにすると、スライド状態を監視する必要があります。scrollviewはrecyclerviewのように滑り状態を監視することができません。
以下は私の一つの実現案です。Count DownTimerを通じて実現します。
先のオンスクリーンで インターフェースに追加する方法
public interface OnScrollChanged {
void onScroll(int l, int t, int oldl, int oldt);
void onTouch(boolean isDown);
}
そしてontouchEventの書き方を書き直します。
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
if (mOnScrollChanged != null) {
mOnScrollChanged.onTouch(false);
}
break;
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
if (mOnScrollChanged != null) {
mOnScrollChanged.onTouch(true);
}
break;
}
return super.onTouchEvent(ev);
}
ここのisDown=trueは押したりスライドしたりした状態を表しており、ACT ION_に対応しています。DOWNとACTION_MOVE、fale代表ACT ION_UPとACT ION_CANCEL以下はこのカスタムのscrollerviewを使います。
//
private final static int SCROLL_STATE_IDLE = 1;
//
private final static int SCROLL_STATE_SCROLL = 2;
//
boolean isDragState = false;
int currentState = SCROLL_STATE_IDLE;
// 100ms ,100ms
private CountDownTimer scrollCountTimer = new CountDownTimer(100, 1) {
@Override
public void onTick(long millisUntilFinished) {
}
@Override
public void onFinish() {
setScrollState(SCROLL_STATE_IDLE);
}
};
private void initScrollView() {
scrollView.setOnScrollChanged(new MyScrollView.OnScrollChanged() {
@Override
public void onScroll(int l, int t, int oldl, int oldt) {
if (isDragState) {//
return;
}
// ,
scrollCountTimer.cancel();
if(currentState != SCROLL_STATE_SCROLL) {
setScrollState(SCROLL_STATE_SCROLL);
}
scrollCountTimer.start();
}
@Override
public void onTouch(boolean isDown) {
isDragState = isDown;
// ,
if (isDown) {
scrollCountTimer.cancel();
setScrollState(SCROLL_STATE_SCROLL);
} else {
scrollCountTimer.start();
}
}
});
// ,cancel timer
締め括りをつける以上述べたように、皆さんに紹介したAndroid scrollviewはどうやってスライド状態を監督し、皆さんの助けを期待しています。もし何か質問があれば、メッセージをください。ここでも私たちのサイトを応援してくれてありがとうございます。
本文があなたのためになると思ったら、転載を歓迎します。出所を明記してください。ありがとうございます。