From ce71e386e6a8fa94f8e4511ff44a5ce2bbeba9ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=97=AB=E5=BD=AC=E5=BD=AC?= <619008099@qq.com> Date: Thu, 8 Nov 2018 18:48:06 +0800 Subject: [PATCH] miui9 --- .idea/misc.xml | 2 +- .../ncalendardemo/activity/TestActivity.java | 2 + .../activity/TestMiui9Activity.java | 8 + app/src/main/res/layout/activity_miui9.xml | 14 +- .../java/com/necer/calendar/BaseCalendar.java | 59 ++-- .../com/necer/calendar/Miui9Calendar.java | 259 +++++++++++++++++- .../com/necer/calendar/MonthCalendar.java | 26 +- .../java/com/necer/calendar/WeekCalendar.java | 2 +- .../necer/listener/OnDateChangedListener.java | 2 +- .../java/com/necer/view/BaseCalendarView.java | 30 +- 10 files changed, 355 insertions(+), 49 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index c0f68edd..99202cc2 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -25,7 +25,7 @@ - + diff --git a/app/src/main/java/necer/ncalendardemo/activity/TestActivity.java b/app/src/main/java/necer/ncalendardemo/activity/TestActivity.java index ebe607eb..f47c06b4 100644 --- a/app/src/main/java/necer/ncalendardemo/activity/TestActivity.java +++ b/app/src/main/java/necer/ncalendardemo/activity/TestActivity.java @@ -94,6 +94,7 @@ public void onYearMonthChanged(BaseCalendar baseCalendar,int year, int month) { } }); +/* monthcalendar.setOnDateChangedListener(new OnDateChangedListener() { @Override @@ -112,6 +113,7 @@ public void onDateChanged(BaseCalendar baseCalendar, LocalDate localDate) { }); +*/ diff --git a/app/src/main/java/necer/ncalendardemo/activity/TestMiui9Activity.java b/app/src/main/java/necer/ncalendardemo/activity/TestMiui9Activity.java index aef41cca..5d0b3383 100644 --- a/app/src/main/java/necer/ncalendardemo/activity/TestMiui9Activity.java +++ b/app/src/main/java/necer/ncalendardemo/activity/TestMiui9Activity.java @@ -4,11 +4,14 @@ import android.support.annotation.Nullable; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; import org.joda.time.DateTime; import necer.ncalendardemo.R; +import necer.ncalendardemo.adapter.AAAdapter; /** * Created by necer on 2018/11/7. @@ -27,6 +30,11 @@ protected void onCreate(@Nullable Bundle savedInstanceState) { supportActionBar.hide(); } + RecyclerView recyclerView = findViewById(R.id.recyclerView); + + recyclerView.setLayoutManager(new LinearLayoutManager(this)); + AAAdapter aaAdapter = new AAAdapter(this); + recyclerView.setAdapter(aaAdapter); diff --git a/app/src/main/res/layout/activity_miui9.xml b/app/src/main/res/layout/activity_miui9.xml index 82a7f623..9cd127f0 100644 --- a/app/src/main/res/layout/activity_miui9.xml +++ b/app/src/main/res/layout/activity_miui9.xml @@ -14,9 +14,17 @@ + android:layout_marginTop="50dp" + android:layout_height="match_parent"> + + + + + + \ No newline at end of file diff --git a/calendar/src/main/java/com/necer/calendar/BaseCalendar.java b/calendar/src/main/java/com/necer/calendar/BaseCalendar.java index 2317ec37..41bfa1a2 100644 --- a/calendar/src/main/java/com/necer/calendar/BaseCalendar.java +++ b/calendar/src/main/java/com/necer/calendar/BaseCalendar.java @@ -6,6 +6,7 @@ import android.support.annotation.Nullable; import android.support.v4.view.ViewPager; import android.util.AttributeSet; + import com.necer.R; import com.necer.adapter.BaseCalendarAdapter; import com.necer.listener.OnDateChangedListener; @@ -13,7 +14,9 @@ import com.necer.utils.Attrs; import com.necer.utils.Util; import com.necer.view.BaseCalendarView; + import org.joda.time.LocalDate; + import java.util.ArrayList; import java.util.List; @@ -26,9 +29,9 @@ public abstract class BaseCalendar extends ViewPager { protected int mCalendarSize; private BaseCalendarAdapter calendarAdapter; private Attrs attrs; - private BaseCalendarView mCurrView;//当前显示的页面 - private BaseCalendarView mLastView;//当前显示的页面的上一个页面 - private BaseCalendarView mNextView;//当前显示的页面的下一个页面 + protected BaseCalendarView mCurrView;//当前显示的页面 + protected BaseCalendarView mLastView;//当前显示的页面的上一个页面 + protected BaseCalendarView mNextView;//当前显示的页面的下一个页面 protected LocalDate mSelectDate;//日历上面点击选中的日期,包含点击选中和翻页选中 protected LocalDate mOnClickDate;//专值点击选中的日期 @@ -73,8 +76,8 @@ public BaseCalendar(@NonNull Context context, @Nullable AttributeSet attributeSe attrs.holidayColor = ta.getColor(R.styleable.NCalendar_holidayColor, getResources().getColor(R.color.holidayColor)); attrs.workdayColor = ta.getColor(R.styleable.NCalendar_workdayColor, getResources().getColor(R.color.workdayColor)); attrs.backgroundColor = ta.getColor(R.styleable.NCalendar_backgroundColor, getResources().getColor(R.color.white)); - attrs.firstDayOfWeek = ta.getInt(R.styleable.NCalendar_firstDayOfWeek,Attrs.SUNDAY); - attrs.pointLocation = ta.getInt(R.styleable.NCalendar_pointLocation,Attrs.UP); + attrs.firstDayOfWeek = ta.getInt(R.styleable.NCalendar_firstDayOfWeek, Attrs.SUNDAY); + attrs.pointLocation = ta.getInt(R.styleable.NCalendar_pointLocation, Attrs.UP); attrs.defaultCalendar = ta.getInt(R.styleable.NCalendar_defaultCalendar, Attrs.MONTH); attrs.holidayLocation = ta.getInt(R.styleable.NCalendar_holidayLocation, Attrs.TOP_RIGHT); @@ -99,10 +102,12 @@ public BaseCalendar(@NonNull Context context, @Nullable AttributeSet attributeSe addOnPageChangeListener(new OnPageChangeListener() { @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + } @Override - public void onPageScrollStateChanged(int state) {} + public void onPageScrollStateChanged(int state) { + } @Override public void onPageSelected(final int position) { @@ -147,7 +152,7 @@ private void reDraw(int position) { //年月回调 onYearMonthChanged(mSelectDate.getYear(), mSelectDate.getMonthOfYear()); //日期回调 - onDateChanged(mSelectDate); + onDateChanged(mSelectDate, isDraw); } public void setPointList(List list) { @@ -167,15 +172,17 @@ public void setPointList(List list) { } //刷新页面 - protected void notifyView(LocalDate currectSelectDate,boolean isDraw) { + protected void notifyView(LocalDate currectSelectDate, boolean isDraw) { this.mSelectDate = currectSelectDate; - mCurrView.setSelectDate(currectSelectDate, mPointList,isDraw); + if (mCurrView != null) { + mCurrView.setSelectDate(currectSelectDate, mPointList, isDraw); + } if (mLastView != null) { - mLastView.setSelectDate(getLastSelectDate(currectSelectDate), mPointList,isDraw); + mLastView.setSelectDate(getLastSelectDate(currectSelectDate), mPointList, isDraw); } if (mNextView != null) { - mNextView.setSelectDate(getNextSelectDate(currectSelectDate), mPointList,isDraw); + mNextView.setSelectDate(getNextSelectDate(currectSelectDate), mPointList, isDraw); } } @@ -207,6 +214,7 @@ protected void notifyView(LocalDate currectSelectDate,boolean isDraw) { /** * 重绘当前页面时,获取上个月选中的日期 + * * @return */ protected abstract LocalDate getLastSelectDate(LocalDate currectSelectDate); @@ -222,36 +230,41 @@ protected void notifyView(LocalDate currectSelectDate,boolean isDraw) { /** * 日历上面选中的日期,有选中圈的才会回调 + * * @param localDate */ protected abstract void onSelcetDate(LocalDate localDate); /** * 年份和月份变化回调,点击和翻页都会回调,不管有没有日期选中 + * * @param year * @param month */ - public void onYearMonthChanged(int year, int month){ + public void onYearMonthChanged(int year, int month) { if (onYearMonthChangedListener != null && (year != mLaseYear || month != mLastMonth)) { mLaseYear = year; mLastMonth = month; - onYearMonthChangedListener.onYearMonthChanged(this,year, month); + onYearMonthChangedListener.onYearMonthChanged(this, year, month); } } /** * 任何操作都会回调 + * * @param localDate + * @param isDraw 页面是否选中 */ - public void onDateChanged(LocalDate localDate) { + public void onDateChanged(LocalDate localDate, boolean isDraw) { if (onDateChangedListener != null) { - onDateChangedListener.onDateChanged(this,localDate); + onDateChangedListener.onDateChanged(this, localDate, isDraw); } } public void setOnYearMonthChangeListener(OnYearMonthChangedListener onYearMonthChangedListener) { this.onYearMonthChangedListener = onYearMonthChangedListener; } + public void setOnDateChangedListener(OnDateChangedListener onDateChangedListener) { this.onDateChangedListener = onDateChangedListener; } @@ -259,17 +272,27 @@ public void setOnDateChangedListener(OnDateChangedListener onDateChangedListener /** * 跳转日期 + * * @param formatDate */ public void jumpDate(String formatDate) { LocalDate jumpDate = new LocalDate(formatDate); mOnClickDate = jumpDate; - int num = getTwoDateNum(mSelectDate,jumpDate , attrs.firstDayOfWeek); + int num = getTwoDateNum(mSelectDate, jumpDate, attrs.firstDayOfWeek); setCurrentItem(getCurrentItem() + num, Math.abs(num) == 1); - notifyView(jumpDate,true); + notifyView(jumpDate, true); } + // + protected void jumpDate(LocalDate localDate, boolean isDraw) { + if (mSelectDate != null) { + int num = getTwoDateNum(mSelectDate, localDate, attrs.firstDayOfWeek); + setCurrentItem(getCurrentItem() + num, Math.abs(num) == 1); + notifyView(localDate, isDraw); + } + } + protected Attrs getAttrs() { return attrs; diff --git a/calendar/src/main/java/com/necer/calendar/Miui9Calendar.java b/calendar/src/main/java/com/necer/calendar/Miui9Calendar.java index 94deefcb..a5e02000 100644 --- a/calendar/src/main/java/com/necer/calendar/Miui9Calendar.java +++ b/calendar/src/main/java/com/necer/calendar/Miui9Calendar.java @@ -1,18 +1,28 @@ package com.necer.calendar; +import android.animation.ValueAnimator; import android.content.Context; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v4.view.NestedScrollingChild; +import android.support.v4.view.NestedScrollingParent; +import android.support.v4.view.ViewCompat; import android.util.AttributeSet; +import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; +import com.necer.MyLog; +import com.necer.listener.OnDateChangedListener; import com.necer.utils.Attrs; +import com.necer.view.MonthView; + +import org.joda.time.LocalDate; /** * Created by necer on 2018/11/7. */ -public class Miui9Calendar extends FrameLayout { +public class Miui9Calendar extends FrameLayout implements NestedScrollingParent, ValueAnimator.AnimatorUpdateListener, OnDateChangedListener { protected WeekCalendar weekCalendar; @@ -24,6 +34,17 @@ public class Miui9Calendar extends FrameLayout { protected int STATE;//默认月 + protected View childView;//NCalendar内部包含的直接子view,直接子view并不一定是NestScrillChild + protected View targetView;//嵌套滑动的目标view,即RecyclerView等 + + + protected int monthCalendarTop; //月日历的getTop 距离父view顶部的距离 + protected int childViewTop; // childView的getTop 距离父view顶部的距离 + + + protected ValueAnimator monthValueAnimator;//月日历动画 + protected ValueAnimator childViewValueAnimator;//childView动画 + public Miui9Calendar(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); @@ -44,16 +65,248 @@ public Miui9Calendar(@NonNull Context context, @Nullable AttributeSet attrs) { ViewGroup.LayoutParams monthLayoutParams = monthCalendar.getLayoutParams(); ViewGroup.LayoutParams weekLayoutParams = weekCalendar.getLayoutParams(); - - monthLayoutParams.height = monthHeigh; weekLayoutParams.height = weekHeigh; monthCalendar.setLayoutParams(monthLayoutParams); weekCalendar.setLayoutParams(weekLayoutParams); + monthCalendar.setOnDateChangedListener(this); + weekCalendar.setOnDateChangedListener(this); + weekCalendar.setVisibility(STATE == Attrs.MONTH ? INVISIBLE : VISIBLE); + monthValueAnimator = new ValueAnimator(); + childViewValueAnimator = new ValueAnimator(); + monthValueAnimator.addUpdateListener(this); + childViewValueAnimator.addUpdateListener(this); + + } + + + + @Override + public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) { + return true; + } + + + @Override + public void onNestedPreScroll(View target, int dx, int dy, int[] consumed) { + //跟随手势滑动 + move(dy, true, consumed); + } + + @Override + public void onStopNestedScroll(View target) { + //嵌套滑动结束,自动滑动 + scroll(); + + + + MyLog.d("onStopNestedScroll"); + + } + + private void scroll() { + //停止滑动的时候,距顶部的距离 + monthCalendarTop = monthCalendar.getTop(); + childViewTop = childView.getTop(); + + /* if (monthCalendarTop == 0 && childViewTop == monthHeigh) { + return; + } + if (monthCalendarTop == -monthCalendar.getMonthCalendarOffset() && childViewTop == weekHeigh) { + return; + }*/ + + if (STATE == Attrs.MONTH) { + if (monthHeigh - childViewTop < weekHeigh) { + autoScroll(monthCalendarTop, 0, childViewTop, monthHeigh); + } else { + autoScroll(monthCalendarTop, -monthCalendar.getMonthCalendarOffset(), childViewTop, weekHeigh); + } + + } else { + if (childViewTop < weekHeigh * 2) { + autoScroll(monthCalendarTop, -monthCalendar.getMonthCalendarOffset(), childViewTop, weekHeigh); + } else { + autoScroll(monthCalendarTop, 0, childViewTop, monthHeigh); + } + } + } + + + //自动滑动 + protected void autoScroll(int startMonth, int endMonth, int startChild, int endChild) { + monthValueAnimator.setIntValues(startMonth, endMonth); + monthValueAnimator.setDuration(duration); + monthValueAnimator.start(); + + childViewValueAnimator.setIntValues(startChild, endChild); + childViewValueAnimator.setDuration(duration); + childViewValueAnimator.start(); + } + + + /** + * 手势滑动的主要逻辑 + * + * @param dy y方向上的偏移量 + * @param isNest 是否是NestedScrollingChild的滑动 + * @param consumed + */ + private void move(int dy, boolean isNest, int[] consumed) { + + monthCalendarTop = monthCalendar.getTop(); + childViewTop = childView.getTop(); + + //4种情况 + if (dy > 0 && Math.abs(monthCalendarTop) < monthCalendar.getMonthCalendarOffset()) { + //月日历和childView同时上滑 + int offset = getOffset(dy, monthCalendar.getMonthCalendarOffset() - Math.abs(monthCalendarTop)); + monthCalendar.offsetTopAndBottom(-offset); + childView.offsetTopAndBottom(-offset); + if (isNest) consumed[1] = dy; + } else if (dy > 0 && childViewTop > weekHeigh) { + //月日历滑动到位置后,childView继续上滑,覆盖一部分月日历 + int offset = getOffset(dy, childViewTop - weekHeigh); + childView.offsetTopAndBottom(-offset); + if (isNest) consumed[1] = dy; + } else if (dy < 0 && monthCalendarTop != 0 && !ViewCompat.canScrollVertically(targetView, -1)) { + //月日历和childView下滑 + int offset = getOffset(Math.abs(dy), Math.abs(monthCalendarTop)); + monthCalendar.offsetTopAndBottom(offset); + childView.offsetTopAndBottom(offset); + if (isNest) consumed[1] = dy; + } else if (dy < 0 && monthCalendarTop == 0 && childViewTop != monthHeigh && !ViewCompat.canScrollVertically(targetView, -1)) { + //月日历滑动到位置后,childView继续下滑 + int offset = getOffset(Math.abs(dy), monthHeigh - childViewTop); + childView.offsetTopAndBottom(offset); + if (isNest) consumed[1] = dy; + } + + //childView滑动到周位置后,标记状态,同时周日显示 + if (childViewTop == weekHeigh ) { + STATE = Attrs.WEEK; + weekCalendar.setVisibility(VISIBLE); + } + + //周状态,下滑显示月日历,把周日历隐掉 + if (STATE == Attrs.WEEK && dy < 0 && !ViewCompat.canScrollVertically(targetView, -1)) { + weekCalendar.setVisibility(INVISIBLE); + } + + //彻底滑到月日历,标记状态 + if (childViewTop == monthHeigh) { + STATE = Attrs.MONTH; + } + } + + + //防止滑动过快越界 + protected int getOffset(int offset, int maxOffset) { + if (offset > maxOffset) { + return maxOffset; + } + return offset; + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + ViewGroup.LayoutParams layoutParams = childView.getLayoutParams(); + layoutParams.height = getMeasuredHeight() - weekHeigh; + } + + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + //总共有三个view,0,1,2 + childView = getChildAt(2); + if (childView instanceof NestedScrollingChild) { + targetView = childView; + } else { + targetView = getNestedScrollingChild(childView); + } + if (targetView == null) { + throw new RuntimeException("NCalendar中的子类中必须要有NestedScrollingChild的实现类!"); + } + } + + private View getNestedScrollingChild(View view) { + if (view instanceof ViewGroup) { + int childCount = ((ViewGroup) view).getChildCount(); + for (int i = 0; i < childCount; i++) { + View childAt = ((ViewGroup) view).getChildAt(i); + if (childAt instanceof NestedScrollingChild) { + return childAt; + } else { + getNestedScrollingChild(((ViewGroup) view).getChildAt(i)); + } + } + } + return null; + } + + + @Override + protected void onLayout(boolean changed, int l, int t, int r, int b) { + + if (STATE == Attrs.MONTH ) { + monthCalendarTop = monthCalendar.getTop(); + childViewTop = childView.getTop() == 0 ? monthHeigh : childView.getTop(); + } else { + monthCalendarTop = -monthCalendar.getMonthCalendarOffset(); + childViewTop = childView.getTop() == 0 ? weekHeigh : childView.getTop(); + } + + monthCalendar.layout(0, monthCalendarTop, r, monthHeigh + monthCalendarTop); + ViewGroup.LayoutParams layoutParams = childView.getLayoutParams(); + childView.layout(0, childViewTop, r, layoutParams.height + childViewTop); + + weekCalendar.layout(0, 0, r, weekHeigh); + + } + + + @Override + public void onAnimationUpdate(ValueAnimator animation) { + if (animation == monthValueAnimator) { + int animatedValue = (int) animation.getAnimatedValue(); + int top = monthCalendar.getTop(); + int i = animatedValue - top; + monthCalendar.offsetTopAndBottom(i); + } else { + int animatedValue = (int) animation.getAnimatedValue(); + int top = childView.getTop(); + int i = animatedValue - top; + childView.offsetTopAndBottom(i); + } + } + + @Override + public void onDateChanged(BaseCalendar baseCalendar, LocalDate localDate,boolean isDraw) { + if (baseCalendar instanceof MonthCalendar) { + //月日历 变化 + if (STATE == Attrs.MONTH) { + + + weekCalendar.jumpDate(localDate, isDraw); + /*if (onCalendarChangedListener != null) { + onCalendarChangedListener.onCalendarChanged(date); + }*/ + } + } else { + if (STATE == Attrs.WEEK) { + monthCalendar.jumpDate(localDate, isDraw); + requestLayout(); + /* if (onCalendarChangedListener != null) { + onCalendarChangedListener.onCalendarChanged(date); + }*/ + } + } } } diff --git a/calendar/src/main/java/com/necer/calendar/MonthCalendar.java b/calendar/src/main/java/com/necer/calendar/MonthCalendar.java index 5e059814..3d8a3c21 100644 --- a/calendar/src/main/java/com/necer/calendar/MonthCalendar.java +++ b/calendar/src/main/java/com/necer/calendar/MonthCalendar.java @@ -13,6 +13,7 @@ import com.necer.utils.Attrs; import com.necer.utils.Util; import com.necer.view.BaseCalendarView; +import com.necer.view.MonthView; import org.joda.time.LocalDate; @@ -31,16 +32,16 @@ public MonthCalendar(@NonNull Context context, @Nullable AttributeSet attributeS @Override protected BaseCalendarAdapter getCalendarAdapter(Context context, Attrs attrs, int calendarSize, int currNum) { - return new MonthCalendarAdapter(context,attrs,calendarSize,currNum,this); + return new MonthCalendarAdapter(context, attrs, calendarSize, currNum, this); } @Override - protected int getCalendarSize(LocalDate startDate, LocalDate endDate,int type) { + protected int getCalendarSize(LocalDate startDate, LocalDate endDate, int type) { return Util.getIntervalMonths(startDate, endDate) + 1; } @Override - protected int getTwoDateNum(LocalDate startDate,LocalDate endDate, int type) { + protected int getTwoDateNum(LocalDate startDate, LocalDate endDate, int type) { return Util.getIntervalMonths(startDate, endDate); } @@ -73,7 +74,7 @@ protected void onSelcetDate(LocalDate localDate) { @Override public void onClickCurrentMonth(LocalDate date) { onSelcetDate(date); - onDateChanged(date); + onDateChanged(date,true); onYearMonthChanged(date.getYear(), date.getMonthOfYear()); Toast.makeText(getContext(), date.toString(), Toast.LENGTH_SHORT).show(); notifyView(date, true); @@ -82,26 +83,29 @@ public void onClickCurrentMonth(LocalDate date) { @Override public void onClickLastMonth(LocalDate date) { onSelcetDate(date); - onDateChanged(date); + onDateChanged(date,true); onYearMonthChanged(date.getYear(), date.getMonthOfYear()); setCurrentItem(getCurrentItem() - 1, true); - notifyView(date,true); + notifyView(date, true); } @Override public void onClickNextMonth(LocalDate date) { onSelcetDate(date); - onDateChanged(date); + onDateChanged(date,true); onYearMonthChanged(date.getYear(), date.getMonthOfYear()); setCurrentItem(getCurrentItem() + 1, true); - notifyView(date,true); + notifyView(date, true); } - - - public void setOnMonthSelectListener(OnMonthSelectListener onMonthSelectListener) { this.onMonthSelectListener = onMonthSelectListener; } + + public int getMonthCalendarOffset() { + return mCurrView.getMonthCalendarOffset(); + } + + } diff --git a/calendar/src/main/java/com/necer/calendar/WeekCalendar.java b/calendar/src/main/java/com/necer/calendar/WeekCalendar.java index c63f0450..ff595363 100644 --- a/calendar/src/main/java/com/necer/calendar/WeekCalendar.java +++ b/calendar/src/main/java/com/necer/calendar/WeekCalendar.java @@ -69,7 +69,7 @@ protected void onSelcetDate(LocalDate localDate) { @Override public void onClickCurrentWeek(LocalDate date) { onSelcetDate(date); - onDateChanged(date); + onDateChanged(date,true); onYearMonthChanged(date.getYear(),date.getMonthOfYear()); notifyView(date,true); Toast.makeText(getContext(), date.toString(), Toast.LENGTH_SHORT).show(); diff --git a/calendar/src/main/java/com/necer/listener/OnDateChangedListener.java b/calendar/src/main/java/com/necer/listener/OnDateChangedListener.java index 808e2431..28a0e634 100644 --- a/calendar/src/main/java/com/necer/listener/OnDateChangedListener.java +++ b/calendar/src/main/java/com/necer/listener/OnDateChangedListener.java @@ -8,5 +8,5 @@ * Created by necer on 2018/11/7. */ public interface OnDateChangedListener { - void onDateChanged(BaseCalendar baseCalendar,LocalDate localDate); + void onDateChanged(BaseCalendar baseCalendar,LocalDate localDate,boolean isDraw); } diff --git a/calendar/src/main/java/com/necer/view/BaseCalendarView.java b/calendar/src/main/java/com/necer/view/BaseCalendarView.java index b98bcfcf..e35e3ade 100644 --- a/calendar/src/main/java/com/necer/view/BaseCalendarView.java +++ b/calendar/src/main/java/com/necer/view/BaseCalendarView.java @@ -65,14 +65,11 @@ public BaseCalendarView(Context context, Attrs attrs, LocalDate localDate) { @Override protected void onDraw(Canvas canvas) { - int width = getWidth(); - int height = getHeight(); mRectList.clear(); for (int i = 0; i < mLineNum; i++) { for (int j = 0; j < 7; j++) { - - Rect rect = getRect(width, height, i, j); + Rect rect = getRect(i, j); mRectList.add(rect); LocalDate date = mLocalDateList.get(i * 7 + j); @@ -133,7 +130,9 @@ protected void onDraw(Canvas canvas) { } //获取每个元素矩形 - private Rect getRect(int width, int height, int i, int j) { + private Rect getRect(int i, int j) { + int width = getMeasuredWidth(); + int height = getMeasuredHeight(); Rect rect; //5行的月份,5行矩形平分view的高度 mLineNum==1是周的情况 if (mLineNum == 5 || mLineNum == 1) { @@ -337,14 +336,23 @@ public void setSelectDate(LocalDate localDate, List pointList, boolea } -/* - //原点日期,规则:如果默认选中就返回选中的日期,如默认不选中,就选择当月1号 - public LocalDate getOriginDate() { - if (isDraw) { - return mSelectDate; + //选中的日期到顶部的距离 + public int getMonthCalendarOffset() { + int monthCalendarOffset; + //选中的是第几行 + int selectIndex = mLocalDateList.indexOf(mSelectDate) / 7; + if (mLineNum == 5) { + //5行的月份 + monthCalendarOffset = getMeasuredHeight() / 5 * selectIndex; + } else{ + // int rectHeight5 = getMeasuredHeight() / 5; + int rectHeight6 = (getMeasuredHeight() / 5) * 4 / 5; + monthCalendarOffset = rectHeight6 * selectIndex; } + return monthCalendarOffset; } -*/ + + }