Android RecyclerView左スライドメニュー編集削除[2]SlidingPaneLayoutジェスチャーとの競合解決
12594 ワード
Android RecyclerView左スライドメニュー編集削除[2]SlidingPaneLayoutジェスチャーとの競合解決前言 説明文 ソースコード SlidingPaneLayoutジェスチャーとの衝突を解決 完了 前言
リストの左スライドメニューについて、私は何度も悩んだことがあります.私の最初の左スライドメニューの文章はここにあります.android RecyclerView左スライドメニュー/削除、編集ですが、使うといつもインタラクティブで滑らかではありません.その後、公式のDrawerLayoutコントロールがこの効果を行うことができることを発見しました.DrawerLayoutと改称しました.文章はここにあります:AndroidはDrawerLayoutを簡単に使ってリストの左滑りメニュー-Kotlinを作りますが、これもトリガしにくく、使用体験が悪いです.
最近探して探して、ついに比較的に良いRecyclerViewがあることを見て、記録を分かち合います
文章を説明する
@夢の猿L----Android RecyclerView----サイドスライドメニューを実現
ソースコード
@jm17/SlideRecyclerView
SlidingPaneLayoutジェスチャーとの競合の解決
まずSlidingPaneLayoutを書き直します.ポイントはサイドスライドスイッチです.
次にジェスチャーが衝突したページでタッチイベントをブロックし、リストメニューが開いたらSlidingPaneLayout側滑りを禁止します.
仕事を終える
リストの左スライドメニューについて、私は何度も悩んだことがあります.私の最初の左スライドメニューの文章はここにあります.android RecyclerView左スライドメニュー/削除、編集ですが、使うといつもインタラクティブで滑らかではありません.その後、公式のDrawerLayoutコントロールがこの効果を行うことができることを発見しました.DrawerLayoutと改称しました.文章はここにあります:AndroidはDrawerLayoutを簡単に使ってリストの左滑りメニュー-Kotlinを作りますが、これもトリガしにくく、使用体験が悪いです.
最近探して探して、ついに比較的に良いRecyclerViewがあることを見て、記録を分かち合います
文章を説明する
@夢の猿L----Android RecyclerView----サイドスライドメニューを実現
ソースコード
@jm17/SlideRecyclerView
SlidingPaneLayoutジェスチャーとの競合の解決
まずSlidingPaneLayoutを書き直します.ポイントはサイドスライドスイッチです.
/**
*
*
* @author D10NG
* @date on 2019-05-04 14:36
*/
public class PageEnabledSlidingPaneLayout extends SlidingPaneLayout {
/** x */
private float mInitialMotionX;
/** y */
private float mInitialMotionY;
/** */
private float mEdgeSlop;
/** */
private boolean isEnableSlip = true;
public PageEnabledSlidingPaneLayout(Context context) {
this(context, null);
}
public PageEnabledSlidingPaneLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public PageEnabledSlidingPaneLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
//-------- ViewConfiguration --------//
ViewConfiguration config = ViewConfiguration.get(context);
//-------- , --------//
mEdgeSlop = config.getScaledEdgeSlop();
}
public boolean getEnableSlip() {
return isEnableSlip;
}
public void setEnableSlip(boolean enable) {
isEnableSlip = enable;
}
/**
*
* @param ev
* @return
*/
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (MotionEventCompat.getActionMasked(ev)) {
case MotionEvent.ACTION_DOWN: {
//
mInitialMotionX = ev.getX();
mInitialMotionY = ev.getY();
break;
}
case MotionEvent.ACTION_MOVE: {
//
if (!isEnableSlip) {
return false;
}
final float x = ev.getX();
final float y = ev.getY();
// The user should always be able to "close" the pane, so we only check
// for child scrollability if the pane is currently closed.
if (mInitialMotionX > mEdgeSlop && !isOpen() && canScroll(this, true,
Math.round(x - mInitialMotionX), Math.round(x), Math.round(y))) {
// How do we set super.mIsUnableToDrag = true?
// send the parent a cancel event
MotionEvent cancelEvent = MotionEvent.obtain(ev);
cancelEvent.setAction(MotionEvent.ACTION_CANCEL);
return super.onInterceptTouchEvent(cancelEvent);
}
}
}
return super.onInterceptTouchEvent(ev);
}
}
次にジェスチャーが衝突したページでタッチイベントをブロックし、リストメニューが開いたらSlidingPaneLayout側滑りを禁止します.
/**
*
* # , menu , menu
*/
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
binding.spLayout.enableSlip = !binding.rcvDevice.isOpenMenu
return super.dispatchTouchEvent(ev)
}
仕事を終える