huanghaibin-dev / CalendarView

Android上一个优雅、万能自定义UI、仿iOS、自定义动画,支持垂直、水平方向切换、支持周视图、自定义周起始、性能高效的日历控件,支持热插拔实现的UI定制!支持标记、自定义颜色、农历、自定义月视图各种显示模式等。Canvas绘制,速度快、占用内存低,你真的想不到日历居然还可以如此优雅!An elegant, highly customized and high-performance Calendar Widget on Android.
Apache License 2.0
9.11k stars 1.79k forks source link

可否指点如何修改,如何把 CalendarView 更好的与 ViewPager2 结合? #800

Open yccheok opened 2 years ago

yccheok commented 2 years ago

您好。多年来,我用的 ViewPager 能和 CalendarView 无缝结合。请参阅影片。如果我把 CalendarView 推上一半,然后要左右滑动 ViewPager,ViewPager 并不会滑动(这是我想要的效果,防止用户手滑)

https://www.youtube.com/watch?v=4DBLBTxyjMA

可是,当我采用 ViewPager2。如果我把 CalendarView 往上推一般,然后不小心手滑左右移动,ViewPager2 左右滑动。

https://www.youtube.com/watch?v=B11WFX5Ivns

请问,我要如何在 CalendarView 下手,已在上下滑动的动作还未完成,防止把左右滑动 event 传给 ViewPager2?

我尝试了一个纯 RecyclerView 和 CalendarView 结合。如果我把 RecyclerView 向上下滑动到一半(手指不要提起),然后左右滑动,ViewPager2 是不会滑动的。

谢谢

yccheok commented 2 years ago

我的猜想应该是可以从这里下手。

https://github.com/yccheok/CalendarView/blob/2.2/calendarview/src/main/java/com/haibin/calendarview/CalendarLayout.java#L328

可是,我还不知道如何直接把 CalendarView import as source ,好让我可以一边修改,一边调试。我先试试看,再给回馈。

有任何宝贵意见,欢迎提出。谢谢。

yccheok commented 2 years ago

我做了个简陋的解决方案。

就是在滚动 CalendarLayout 时,我确保 ViewPager2 不能被滚动。

class NoteFragment implements CalendarLayoutListener
    @Override
    public void action(int action) {
        if (viewPager2 == null) {
            return;
        }

        if (action == ACTION_MOVE) {
            viewPager2.setUserInputEnabled(false);
        } else {
            viewPager2.setUserInputEnabled(true);
        }
    }

class CalendarLayout {

    @SuppressLint("ClickableViewAccessibility")
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        ...
        mVelocityTracker.addMovement(event);

        if (calendarLayoutListener != null) {
            calendarLayoutListener.action(action);
        }
yccheok commented 2 years ago

这是我快速解决方案。欢迎指教。至于为何 ViewPager 和 ViewPager2 会有不同的行为,还是未知数。

https://github.com/yccheok/CalendarView/commit/7400b844ce99ffa36b9f35b2b7976c24decc13c6