Java tutorial
/* * Copyright (C) 2016 huanghaibin_dev <huanghaibin_dev@163.com> * WebSite https://github.com/MiracleTimes-Dev * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.gitstudy.rili.liarbry; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.content.Context; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.animation.LinearInterpolator; import android.widget.FrameLayout; import com.gitstudy.R; import java.lang.reflect.Constructor; import java.util.List; import java.util.Map; /** * * ???????public */ @SuppressWarnings({ "unused" }) public class CalendarView extends FrameLayout { /** * ? */ private final CalendarViewDelegate mDelegate; /** * ViewPager */ private MonthViewPager mMonthPager; /** * */ private WeekViewPager mWeekPager; /** * ? */ private View mWeekLine; /** * ? */ private YearViewSelectLayout mSelectLayout; /** * ? */ private WeekBar mWeekBar; /** * */ CalendarLayout mParentLayout; public CalendarView(@NonNull Context context) { this(context, null); } public CalendarView(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); mDelegate = new CalendarViewDelegate(context, attrs); init(context); } /** * ? * * @param context context */ private void init(Context context) { LayoutInflater.from(context).inflate(R.layout.cv_layout_calendar_view, this, true); FrameLayout frameContent = (FrameLayout) findViewById(R.id.frameContent); this.mWeekPager = (WeekViewPager) findViewById(R.id.vp_week); this.mWeekPager.setup(mDelegate); try { Constructor constructor = mDelegate.getWeekBarClass().getConstructor(Context.class); mWeekBar = (WeekBar) constructor.newInstance(getContext()); } catch (Exception e) { e.printStackTrace(); } frameContent.addView(mWeekBar, 2); mWeekBar.setup(mDelegate); mWeekBar.onWeekStartChange(mDelegate.getWeekStart()); this.mWeekLine = findViewById(R.id.line); this.mWeekLine.setBackgroundColor(mDelegate.getWeekLineBackground()); LayoutParams lineParams = (LayoutParams) this.mWeekLine.getLayoutParams(); lineParams.setMargins(mDelegate.getWeekLineMargin(), mDelegate.getWeekBarHeight(), mDelegate.getWeekLineMargin(), 0); this.mWeekLine.setLayoutParams(lineParams); this.mMonthPager = (MonthViewPager) findViewById(R.id.vp_month); this.mMonthPager.mWeekPager = mWeekPager; this.mMonthPager.mWeekBar = mWeekBar; LayoutParams params = (LayoutParams) this.mMonthPager.getLayoutParams(); params.setMargins(0, mDelegate.getWeekBarHeight() + CalendarUtil.dipToPx(context, 1), 0, 0); mWeekPager.setLayoutParams(params); mSelectLayout = (YearViewSelectLayout) findViewById(R.id.selectLayout); mSelectLayout.setBackgroundColor(mDelegate.getYearViewBackground()); mSelectLayout.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { if (mWeekPager.getVisibility() == VISIBLE) { return; } if (mDelegate.mYearChangeListener != null) { mDelegate.mYearChangeListener.onYearChange(position + mDelegate.getMinYear()); } } @Override public void onPageScrollStateChanged(int state) { } }); mDelegate.mInnerListener = new OnInnerDateSelectedListener() { /** * * @param calendar calendar * @param isClick ? */ @Override public void onMonthDateSelected(Calendar calendar, boolean isClick) { if (calendar.getYear() == mDelegate.getCurrentDay().getYear() && calendar.getMonth() == mDelegate.getCurrentDay().getMonth() && mMonthPager.getCurrentItem() != mDelegate.mCurrentMonthViewItem) { return; } mDelegate.mIndexCalendar = calendar; if (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT || isClick) { mDelegate.mSelectedCalendar = calendar; } mWeekPager.updateSelected(mDelegate.mIndexCalendar, false); mMonthPager.updateSelected(); if (mWeekBar != null && (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT || isClick)) { mWeekBar.onDateSelected(calendar, mDelegate.getWeekStart(), isClick); } } /** * * @param calendar calendar * @param isClick ? */ @Override public void onWeekDateSelected(Calendar calendar, boolean isClick) { mDelegate.mIndexCalendar = calendar; if (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT || isClick || mDelegate.mIndexCalendar.equals(mDelegate.mSelectedCalendar)) { mDelegate.mSelectedCalendar = calendar; } int y = calendar.getYear() - mDelegate.getMinYear(); int position = 12 * y + mDelegate.mIndexCalendar.getMonth() - mDelegate.getMinYearMonth(); mWeekPager.updateSingleSelect(); mMonthPager.setCurrentItem(position, false); mMonthPager.updateSelected(); if (mWeekBar != null && (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT || isClick || mDelegate.mIndexCalendar.equals(mDelegate.mSelectedCalendar))) { mWeekBar.onDateSelected(calendar, mDelegate.getWeekStart(), isClick); } } }; if (isInRange(mDelegate.getCurrentDay())) { mDelegate.mSelectedCalendar = mDelegate.createCurrentDate(); } else { mDelegate.mSelectedCalendar = mDelegate.getMinRangeCalendar(); } mDelegate.mIndexCalendar = mDelegate.mSelectedCalendar; mWeekBar.onDateSelected(mDelegate.mSelectedCalendar, mDelegate.getWeekStart(), false); mMonthPager.setup(mDelegate); mMonthPager.setCurrentItem(mDelegate.mCurrentMonthViewItem); mSelectLayout.setOnMonthSelectedListener(new YearRecyclerView.OnMonthSelectedListener() { @Override public void onMonthSelected(int year, int month) { int position = 12 * (year - mDelegate.getMinYear()) + month - mDelegate.getMinYearMonth(); mDelegate.isShowYearSelectedLayout = false; closeSelectLayout(position); } }); mSelectLayout.setup(mDelegate); mWeekPager.updateSelected(mDelegate.createCurrentDate(), false); } /** * * * @param minYear ? * @param minYearMonth ? * @param minYearDay ? * @param maxYear * @param maxYearMonth * @param maxYearDay */ @SuppressWarnings("all") public void setRange(int minYear, int minYearMonth, int minYearDay, int maxYear, int maxYearMonth, int maxYearDay) { if (CalendarUtil.compareTo(minYear, minYearMonth, minYearDay, maxYear, maxYearMonth, maxYearDay) > 0) { return; } mDelegate.setRange(minYear, minYearMonth, minYearDay, maxYear, maxYearMonth, maxYearDay); mWeekPager.notifyDataSetChanged(); mSelectLayout.notifyDataSetChanged(); mMonthPager.notifyDataSetChanged(); if (!isInRange(mDelegate.mSelectedCalendar)) { mDelegate.mSelectedCalendar = mDelegate.getMinRangeCalendar(); mDelegate.updateSelectCalendarScheme(); mDelegate.mIndexCalendar = mDelegate.mSelectedCalendar; } mWeekPager.updateRange(); mMonthPager.updateRange(); mSelectLayout.updateRange(); } /** * ? * * @return */ public int getCurDay() { return mDelegate.getCurrentDay().getDay(); } /** * ? * * @return */ public int getCurMonth() { return mDelegate.getCurrentDay().getMonth(); } /** * ? * * @return */ public int getCurYear() { return mDelegate.getCurrentDay().getYear(); } /** * * * @param year */ public void showYearSelectLayout(final int year) { showSelectLayout(year); } /** * * showYearSelectLayout(final int year) ? * * @param year */ private void showSelectLayout(final int year) { if (mParentLayout != null && mParentLayout.mContentView != null) { if (!mParentLayout.isExpand()) { mParentLayout.expand(); return; } } mWeekPager.setVisibility(GONE); mDelegate.isShowYearSelectedLayout = true; if (mParentLayout != null) { mParentLayout.hideContentView(); } mWeekBar.animate().translationY(-mWeekBar.getHeight()).setInterpolator(new LinearInterpolator()) .setDuration(260).setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); mWeekBar.setVisibility(GONE); mSelectLayout.setVisibility(VISIBLE); mSelectLayout.scrollToYear(year, false); if (mParentLayout != null && mParentLayout.mContentView != null) { mParentLayout.expand(); } } }); mMonthPager.animate().scaleX(0).scaleY(0).setDuration(260).setInterpolator(new LinearInterpolator()) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); } }); } /** * ? * * @return true or false */ public boolean isYearSelectLayoutVisible() { return mSelectLayout.getVisibility() == VISIBLE; } /** * */ public void closeYearSelectLayout() { if (mSelectLayout.getVisibility() == GONE) { return; } int position = 12 * (mDelegate.mSelectedCalendar.getYear() - mDelegate.getMinYear()) + mDelegate.mSelectedCalendar.getMonth() - mDelegate.getMinYearMonth(); closeSelectLayout(position); mDelegate.isShowYearSelectedLayout = false; } /** * ?? * * @param position ? */ private void closeSelectLayout(final int position) { mSelectLayout.setVisibility(GONE); mWeekBar.setVisibility(VISIBLE); if (position == mMonthPager.getCurrentItem()) { if (mDelegate.mCalendarSelectListener != null && mDelegate.getSelectMode() != CalendarViewDelegate.SELECT_MODE_SINGLE) { mDelegate.mCalendarSelectListener.onCalendarSelect(mDelegate.mSelectedCalendar, false); } } else { mMonthPager.setCurrentItem(position, false); } mWeekBar.animate().translationY(0).setInterpolator(new LinearInterpolator()).setDuration(280) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); mWeekBar.setVisibility(VISIBLE); } }); mMonthPager.animate().scaleX(1).scaleY(1).setDuration(180).setInterpolator(new LinearInterpolator()) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); mMonthPager.setVisibility(VISIBLE); mMonthPager.clearAnimation(); if (mParentLayout != null) { mParentLayout.showContentView(); } } }); } /** * ? */ public void scrollToCurrent() { scrollToCurrent(false); } /** * ? * * @param smoothScroll smoothScroll */ public void scrollToCurrent(boolean smoothScroll) { if (!isInRange(mDelegate.getCurrentDay())) { return; } Calendar calendar = mDelegate.createCurrentDate(); if (mDelegate.mCalendarInterceptListener != null && mDelegate.mCalendarInterceptListener.onCalendarIntercept(calendar)) { mDelegate.mCalendarInterceptListener.onCalendarInterceptClick(calendar, false); return; } mDelegate.mSelectedCalendar = mDelegate.createCurrentDate(); mDelegate.mIndexCalendar = mDelegate.mSelectedCalendar; mDelegate.updateSelectCalendarScheme(); mWeekBar.onDateSelected(mDelegate.mSelectedCalendar, mDelegate.getWeekStart(), false); if (mMonthPager.getVisibility() == VISIBLE) { mMonthPager.scrollToCurrent(smoothScroll); mWeekPager.updateSelected(mDelegate.mIndexCalendar, false); } else { mWeekPager.scrollToCurrent(smoothScroll); } mSelectLayout.scrollToYear(mDelegate.getCurrentDay().getYear(), smoothScroll); } /** * */ public void scrollToNext() { scrollToNext(false); } /** * * * @param smoothScroll smoothScroll */ public void scrollToNext(boolean smoothScroll) { if (isYearSelectLayoutVisible()) { mSelectLayout.setCurrentItem(mSelectLayout.getCurrentItem() + 1, smoothScroll); } else if (mWeekPager.getVisibility() == VISIBLE) { mWeekPager.setCurrentItem(mWeekPager.getCurrentItem() + 1, smoothScroll); } else { mMonthPager.setCurrentItem(mMonthPager.getCurrentItem() + 1, smoothScroll); } } /** * */ public void scrollToPre() { scrollToPre(false); } /** * * * @param smoothScroll smoothScroll */ public void scrollToPre(boolean smoothScroll) { if (isYearSelectLayoutVisible()) { mSelectLayout.setCurrentItem(mSelectLayout.getCurrentItem() - 1, smoothScroll); } else if (mWeekPager.getVisibility() == VISIBLE) { mWeekPager.setCurrentItem(mWeekPager.getCurrentItem() - 1, smoothScroll); } else { mMonthPager.setCurrentItem(mMonthPager.getCurrentItem() - 1, smoothScroll); } } /** * */ public void scrollToSelectCalendar() { if (!mDelegate.mSelectedCalendar.isAvailable()) { return; } scrollToCalendar(mDelegate.mSelectedCalendar.getYear(), mDelegate.mSelectedCalendar.getMonth(), mDelegate.mSelectedCalendar.getDay(), false); } /** * * * @param year year * @param month month * @param day day */ public void scrollToCalendar(int year, int month, int day) { scrollToCalendar(year, month, day, false); } /** * * * @param year year * @param month month * @param day day * @param smoothScroll smoothScroll */ @SuppressWarnings("all") public void scrollToCalendar(int year, int month, int day, boolean smoothScroll) { Calendar calendar = new Calendar(); calendar.setYear(year); calendar.setMonth(month); calendar.setDay(day); if (!isInRange(calendar)) { return; } if (mDelegate.mCalendarInterceptListener != null && mDelegate.mCalendarInterceptListener.onCalendarIntercept(calendar)) { mDelegate.mCalendarInterceptListener.onCalendarInterceptClick(calendar, false); return; } if (mWeekPager.getVisibility() == VISIBLE) { mWeekPager.scrollToCalendar(year, month, day, smoothScroll); } else { mMonthPager.scrollToCalendar(year, month, day, smoothScroll); } } /** * ? * * @param year */ public void scrollToYear(int year) { scrollToYear(year, false); } /** * ? * * @param year * @param smoothScroll smoothScroll */ @SuppressWarnings("all") public void scrollToYear(int year, boolean smoothScroll) { if (mSelectLayout.getVisibility() != VISIBLE) { return; } mSelectLayout.scrollToYear(year, smoothScroll); } /** * ?? * * @param monthViewScrollable ?? */ public final void setMonthViewScrollable(boolean monthViewScrollable) { mDelegate.setMonthViewScrollable(monthViewScrollable); } /** * ?? * * @param weekViewScrollable ?? */ public final void setWeekViewScrollable(boolean weekViewScrollable) { mDelegate.setWeekViewScrollable(weekViewScrollable); } /** * ?? * * @param yearViewScrollable ?? */ public final void setYearViewScrollable(boolean yearViewScrollable) { mDelegate.setYearViewScrollable(yearViewScrollable); } /** * */ public final void clearSelectRange() { mDelegate.clearSelectRange(); mMonthPager.clearSelectRange(); mWeekPager.clearSelectRange(); } /** * ? * * @return return */ public final List<Calendar> getSelectCalendarRange() { return mDelegate.getSelectCalendarRange(); } /** * * * @param calendarItemHeight MonthView item height */ public final void setCalendarItemHeight(int calendarItemHeight) { if (mDelegate.getCalendarItemHeight() == calendarItemHeight) { return; } mDelegate.setCalendarItemHeight(calendarItemHeight); mMonthPager.updateItemHeight(); mWeekPager.updateItemHeight(); if (mParentLayout == null) { return; } mParentLayout.updateCalendarItemHeight(); } /** * * * @param cls MonthView.class */ public final void setMonthView(Class<?> cls) { if (cls == null) { return; } if (mDelegate.getMonthViewClass().equals(cls)) { return; } mDelegate.setMonthViewClass(cls); mMonthPager.updateMonthViewClass(); } /** * * * @param cls WeekView.class */ public final void setWeekView(Class<?> cls) { if (cls == null) { return; } if (mDelegate.getWeekBarClass().equals(cls)) { return; } mDelegate.setWeekViewClass(cls); mWeekPager.updateWeekViewClass(); } /** * ? * * @param cls WeekBar.class */ public final void setWeekBar(Class<?> cls) { if (cls == null) { return; } if (mDelegate.getWeekBarClass().equals(cls)) { return; } mDelegate.setWeekBarClass(cls); FrameLayout frameContent = (FrameLayout) findViewById(R.id.frameContent); frameContent.removeView(mWeekBar); try { Constructor constructor = cls.getConstructor(Context.class); mWeekBar = (WeekBar) constructor.newInstance(getContext()); } catch (Exception e) { e.printStackTrace(); } frameContent.addView(mWeekBar, 2); mWeekBar.setup(mDelegate); mWeekBar.onWeekStartChange(mDelegate.getWeekStart()); this.mMonthPager.mWeekBar = mWeekBar; mWeekBar.onDateSelected(mDelegate.mSelectedCalendar, mDelegate.getWeekStart(), false); } /** * * ?select_mode = single_mode * ????? * ???? * * @param listener listener */ public final void setOnCalendarInterceptListener(OnCalendarInterceptListener listener) { if (listener == null) { mDelegate.mCalendarInterceptListener = null; } if (listener == null || mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT) { return; } mDelegate.mCalendarInterceptListener = listener; if (!listener.onCalendarIntercept(mDelegate.mSelectedCalendar)) { return; } mDelegate.mSelectedCalendar = new Calendar(); } /** * ? * * @param listener listener */ public void setOnYearChangeListener(OnYearChangeListener listener) { this.mDelegate.mYearChangeListener = listener; } /** * ? * * @param listener listener */ public void setOnMonthChangeListener(OnMonthChangeListener listener) { this.mDelegate.mMonthChangeListener = listener; if (mDelegate.mMonthChangeListener == null) { return; } post(new Runnable() { @Override public void run() { mDelegate.mMonthChangeListener.onMonthChange(mDelegate.mSelectedCalendar.getYear(), mDelegate.mSelectedCalendar.getMonth()); } }); } /** * ?? * * @param listener listener */ public void setOnWeekChangeListener(OnWeekChangeListener listener) { this.mDelegate.mWeekChangeListener = listener; } /** * * * @param listener listener */ public void setOnCalendarSelectListener(OnCalendarSelectListener listener) { this.mDelegate.mCalendarSelectListener = listener; if (mDelegate.mCalendarSelectListener == null) { return; } if (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_RANGE) { return; } if (!isInRange(mDelegate.mSelectedCalendar)) { return; } post(new Runnable() { @Override public void run() { mDelegate.updateSelectCalendarScheme(); mDelegate.mCalendarSelectListener.onCalendarSelect(mDelegate.mSelectedCalendar, false); } }); } /** * * * @param listener listener */ public final void setOnCalendarRangeSelectListener(OnCalendarRangeSelectListener listener) { this.mDelegate.mCalendarRangeSelectListener = listener; } /** * ?defaultminRange = -1maxRange = -1 ? * * @param minRange minRange * @param maxRange maxRange */ public final void setSelectRange(int minRange, int maxRange) { if (minRange > maxRange) { return; } mDelegate.setSelectRange(minRange, maxRange); } /** * ? * * @return ? */ public final int getMinSelectRange() { return mDelegate.getMinSelectRange(); } /** * * * @return */ public final int getMaxSelectRange() { return mDelegate.getMaxSelectRange(); } /** * * * @param listener listener */ public void setOnCalendarLongClickListener(OnCalendarLongClickListener listener) { this.mDelegate.mCalendarLongClickListener = listener; } /** * * * @param preventLongPressedSelect * @param listener listener */ public void setOnCalendarLongClickListener(OnCalendarLongClickListener listener, boolean preventLongPressedSelect) { this.mDelegate.mCalendarLongClickListener = listener; this.mDelegate.setPreventLongPressedSelected(preventLongPressedSelect); } /** * ? * * @param listener listener */ public void setOnViewChangeListener(OnViewChangeListener listener) { this.mDelegate.mViewChangeListener = listener; } /** * ???? */ @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); if (getParent() != null && getParent() instanceof CalendarLayout) { mParentLayout = (CalendarLayout) getParent(); mMonthPager.mParentLayout = mParentLayout; mWeekPager.mParentLayout = mParentLayout; mParentLayout.mWeekBar = mWeekBar; mParentLayout.setup(mDelegate); mParentLayout.initStatus(); } } /** * * * @param mSchemeDates mSchemeDatesMap ??? */ public final void setSchemeDate(Map<String, Calendar> mSchemeDates) { this.mDelegate.mSchemeDatesMap = mSchemeDates; this.mDelegate.clearSelectedScheme(); this.mSelectLayout.update(); this.mMonthPager.updateScheme(); this.mWeekPager.updateScheme(); } /** * */ public final void clearSchemeDate() { this.mDelegate.mSchemeDatesMap = null; this.mDelegate.clearSelectedScheme(); mSelectLayout.update(); mMonthPager.updateScheme(); mWeekPager.updateScheme(); } /** * ? * APItry cache * * @param calendar calendar */ public final void removeSchemeDate(Calendar calendar) { if (calendar == null) { return; } if (mDelegate.mSchemeDatesMap == null || mDelegate.mSchemeDatesMap.size() == 0) { return; } if (mDelegate.mSchemeDatesMap.containsKey(calendar.toString())) { mDelegate.mSchemeDatesMap.remove(calendar.toString()); } if (mDelegate.mSelectedCalendar.equals(calendar)) { mDelegate.clearSelectedScheme(); } mSelectLayout.update(); mMonthPager.updateScheme(); mWeekPager.updateScheme(); } /** * * * @param yearViewBackground ? * @param weekBackground ? * @param lineBg */ public void setBackground(int yearViewBackground, int weekBackground, int lineBg) { mWeekBar.setBackgroundColor(weekBackground); mSelectLayout.setBackgroundColor(yearViewBackground); mWeekLine.setBackgroundColor(lineBg); } /** * * * @param currentDayTextColor * @param curMonthTextColor ? * @param otherMonthColor * @param curMonthLunarTextColor ? * @param otherMonthLunarTextColor */ public void setTextColor(int currentDayTextColor, int curMonthTextColor, int otherMonthColor, int curMonthLunarTextColor, int otherMonthLunarTextColor) { mDelegate.setTextColor(currentDayTextColor, curMonthTextColor, otherMonthColor, curMonthLunarTextColor, otherMonthLunarTextColor); } /** * * * @param selectedThemeColor * @param selectedTextColor * @param selectedLunarTextColor */ public void setSelectedColor(int selectedThemeColor, int selectedTextColor, int selectedLunarTextColor) { mDelegate.setSelectColor(selectedThemeColor, selectedTextColor, selectedLunarTextColor); } /** * * * @param selectedThemeColor * @param schemeColor */ public void setThemeColor(int selectedThemeColor, int schemeColor) { mDelegate.setThemeColor(selectedThemeColor, schemeColor); } /** * * * @param schemeLunarTextColor * @param schemeColor * @param schemeTextColor */ public void setSchemeColor(int schemeColor, int schemeTextColor, int schemeLunarTextColor) { mDelegate.setSchemeColor(schemeColor, schemeTextColor, schemeLunarTextColor); } /** * * * @param yearViewMonthTextColor * @param yearViewDayTextColor * @param yarViewSchemeTextColor */ public void setYearViewTextColor(int yearViewMonthTextColor, int yearViewDayTextColor, int yarViewSchemeTextColor) { mDelegate.setYearViewTextColor(yearViewMonthTextColor, yearViewDayTextColor, yarViewSchemeTextColor); } /** * ? * * @param weekBackground * @param weekTextColor */ public void setWeeColor(int weekBackground, int weekTextColor) { mWeekBar.setBackgroundColor(weekBackground); mWeekBar.setTextColor(weekTextColor); } /** * ? */ public final void setSelectDefaultMode() { if (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_DEFAULT) { return; } mDelegate.mSelectedCalendar = mDelegate.mIndexCalendar; mDelegate.setSelectMode(CalendarViewDelegate.SELECT_MODE_DEFAULT); mWeekBar.onDateSelected(mDelegate.mSelectedCalendar, mDelegate.getWeekStart(), false); mMonthPager.updateDefaultSelect(); mWeekPager.updateDefaultSelect(); } /** * ?? */ public void setSelectRangeMode() { if (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_RANGE) { return; } mDelegate.setSelectMode(CalendarViewDelegate.SELECT_MODE_RANGE); clearSelectRange(); } /** * ?? */ public void setSelectSingleMode() { if (mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_SINGLE) { return; } mDelegate.setSelectMode(CalendarViewDelegate.SELECT_MODE_SINGLE); mWeekPager.updateSelected(); mMonthPager.updateSelected(); } /** * */ public void setWeekStarWithSun() { setWeekStart(CalendarViewDelegate.WEEK_START_WITH_SUN); } /** * */ public void setWeekStarWithMon() { setWeekStart(CalendarViewDelegate.WEEK_START_WITH_MON); } /** * */ public void setWeekStarWithSat() { setWeekStart(CalendarViewDelegate.WEEK_START_WITH_SAT); } /** * * CalendarViewDelegate.WEEK_START_WITH_SUN * CalendarViewDelegate.WEEK_START_WITH_MON * CalendarViewDelegate.WEEK_START_WITH_SAT * * @param weekStart */ private void setWeekStart(int weekStart) { if (weekStart != CalendarViewDelegate.WEEK_START_WITH_SUN && weekStart != CalendarViewDelegate.WEEK_START_WITH_MON && weekStart != CalendarViewDelegate.WEEK_START_WITH_SAT) return; if (weekStart == mDelegate.getWeekStart()) return; mDelegate.setWeekStart(weekStart); mWeekBar.onWeekStartChange(weekStart); mWeekBar.onDateSelected(mDelegate.mSelectedCalendar, weekStart, false); mWeekPager.updateWeekStart(); mMonthPager.updateWeekStart(); mSelectLayout.updateWeekStart(); } /** * ??? * * @return isSingleSelectMode */ public boolean isSingleSelectMode() { return mDelegate.getSelectMode() == CalendarViewDelegate.SELECT_MODE_SINGLE; } /** * ? */ public void setAllMode() { setShowMode(CalendarViewDelegate.MODE_ALL_MONTH); } /** * ?? */ public void setOnlyCurrentMode() { setShowMode(CalendarViewDelegate.MODE_ONLY_CURRENT_MONTH); } /** * ? */ public void setFixMode() { setShowMode(CalendarViewDelegate.MODE_FIT_MONTH); } /** * ? * CalendarViewDelegate.MODE_ALL_MONTH * CalendarViewDelegate.MODE_ONLY_CURRENT_MONTH * CalendarViewDelegate.MODE_FIT_MONTH * * @param mode ? */ private void setShowMode(int mode) { if (mode != CalendarViewDelegate.MODE_ALL_MONTH && mode != CalendarViewDelegate.MODE_ONLY_CURRENT_MONTH && mode != CalendarViewDelegate.MODE_FIT_MONTH) return; if (mDelegate.getMonthViewShowMode() == mode) return; mDelegate.setMonthViewShowMode(mode); mWeekPager.updateShowMode(); mMonthPager.updateShowMode(); mWeekPager.notifyDataSetChanged(); } /** * ? * ?? */ public final void update() { mWeekBar.onWeekStartChange(mDelegate.getWeekStart()); mSelectLayout.update(); mMonthPager.updateScheme(); mWeekPager.updateScheme(); } /** * */ public void updateWeekBar() { mWeekBar.onWeekStartChange(mDelegate.getWeekStart()); } /** * ? */ public final void updateCurrentDate() { mDelegate.updateCurrentDay(); mMonthPager.updateCurrentDate(); mWeekPager.updateCurrentDate(); } /** * ??? * * @return ??? */ public List<Calendar> getCurrentWeekCalendars() { return mWeekPager.getCurrentWeekCalendars(); } /** * ? * * @return ? */ public Calendar getSelectedCalendar() { return mDelegate.mSelectedCalendar; } /** * ? * * @return ? */ public Calendar getMinRangeCalendar() { return mDelegate.getMinRangeCalendar(); } /** * * * @return */ public Calendar getMaxRangeCalendar() { return mDelegate.getMaxRangeCalendar(); } /** * MonthViewPager * * @return */ public MonthViewPager getMonthViewPager() { return mMonthPager; } /** * * * @return */ public WeekViewPager getWeekViewPager() { return mWeekPager; } /** * ? * * @param calendar calendar * @return ? */ protected final boolean isInRange(Calendar calendar) { return mDelegate != null && CalendarUtil.isCalendarInRange(calendar, mDelegate); } /** * ?? */ public interface OnYearChangeListener { void onYearChange(int year); } /** * ? */ public interface OnMonthChangeListener { void onMonthChange(int year, int month); } /** * ? */ public interface OnWeekChangeListener { void onWeekChange(List<Calendar> weekCalendars); } /** * ? * ?CalendarLayout? */ interface OnInnerDateSelectedListener { /** * * * @param calendar calendar * @param isClick ? */ void onMonthDateSelected(Calendar calendar, boolean isClick); /** * * * @param calendar calendar * @param isClick ? */ void onWeekDateSelected(Calendar calendar, boolean isClick); } /** * */ public interface OnCalendarRangeSelectListener { /** * * * @param calendar calendar */ void onCalendarSelectOutOfRange(Calendar calendar); /** * * * @param calendar calendar * @param isOutOfMinRange ???? */ void onSelectOutOfRange(Calendar calendar, boolean isOutOfMinRange); /** * * * @param calendar calendar * @param isEnd ?? */ void onCalendarRangeSelect(Calendar calendar, boolean isEnd); } /** * */ public interface OnCalendarSelectListener { /** * * * @param calendar calendar */ void onCalendarOutOfRange(Calendar calendar); /** * * * @param calendar calendar * @param isClick isClick */ void onCalendarSelect(Calendar calendar, boolean isClick); } public interface OnCalendarLongClickListener { /** * * * @param calendar calendar */ void onCalendarLongClickOutOfRange(Calendar calendar); /** * * * @param calendar calendar */ void onCalendarLongClick(Calendar calendar); } /** * ? */ public interface OnViewChangeListener { /** * ? * * @param isMonthView isMonthView? */ void onViewChange(boolean isMonthView); } /** * ?? */ public interface OnCalendarInterceptListener { boolean onCalendarIntercept(Calendar calendar); void onCalendarInterceptClick(Calendar calendar, boolean isClick); } }