Viewpager のネストされたスライディング競合解決

 

プロジェクトではビューページャーのネストが使用されており、カスタム ビューとスライド コントロール間の競合に対するさまざまな解決策があります。

1.第一の加工方法

       ViewPager を継承して canScroll メソッドをオーバーライドし、canScroll メソッドで ViewPager と競合するビューをフィルターします。

 

public class ViewPager1 extends ViewPager {

    @Override
    protected boolean canScroll(View v, boolean checkV, int dx, int x, int y) {
        if (v.getClass().getName().equals("com.zzcy.*****.utils.ColorPickerView")) {
            return true;
        }
        if (v.getClass().getName().equals("com.zzcy*****.view.ArcSeekBar")) {
            return true;
        }
        return super.canScroll(v, checkV, dx, x, y);

    }

    /**
     * 解决内部多个滑动控件同时滑动 崩溃的问题 建议加上
     * @param ev
     * @return
     */
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        try {
            return super.onTouchEvent(ev);
        } catch (IllegalArgumentException ex) {
            ex.printStackTrace();
        }
        return false;
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        try {
            return super.onInterceptTouchEvent(ev);
        } catch (IllegalArgumentException ex) {
            ex.printStackTrace();
        }
        return false;
    }

   /* private int preX = 0;
    @Override
    public boolean onInterceptTouchEvent(MotionEvent even) {

        if (even.getAction() == MotionEvent.ACTION_DOWN) {
            preX = (int) even.getX();
        } else {
            if (Math.abs((int) even.getX() - preX) > 10) {
                return true;
            } else {
                preX = (int) even.getX();
            }
        }
        return super.onInterceptTouchEvent(even);
    }*/

}

 

2. 第二の加工方法 

これは簡単で、サブコントロールのスライドの開始と終了時にビューページャーを制御します 。ViewPager のネストされた SeekBar を例に取ると、 onTouch() のスライドに似ています。

    //滑动的开始与结束 进行判断 以ViewPager嵌套SeekBar为例 
    /**
     * 滑块监听
     *
     * @param seekBar
     * @param progress 具体值
     * @param fromUser
     */
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        switch (seekBar.getId()) {
            case R.id.kbs_red://红色
            //滑动中的操作
                break;
          
        }
    }

    /**
     * 滑块开始
     *
     * @param seekBar
     */
    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        switch (seekBar.getId()) {
            case R.id.kbs_red:
               kbsRed.getParent().requestDisallowInterceptTouchEvent(true);//告诉ViewPager子控件滑动
               break;
        }
    }

    /**
     * 滑块结束 发送指令
     *
     * @param seekBar
     */
    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        switch (seekBar.getId()) {
            case R.id.kbs_red://红色
                kbsRed.getParent().requestDisallowInterceptTouchEvent(false);//
                break;
          
        }
    }

 

 

おすすめ

転載: blog.csdn.net/qq_28845393/article/details/109724090