1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/huanghaibin_dev-CalendarView

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
QUESTION.md 15 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 23:45 1070ce6

CalendarView Характеристики

  • Основан на Canvas, экстремальная скорость.
  • Горячая замена пользовательского интерфейса.
  • Поддержка просмотра месяца, недели, года, лунного календаря и т. д.
  • Статическая или динамическая настройка начала недели.
  • Статическая или динамическая установка высоты элемента календаря.
  • Перехват даты и диапазона.
  • Мультитач, плавная прокрутка календаря.
  • Поддержка NestedScrolling.
  • Весь пользовательский интерфейс зависит от вашего рисунка.

1. Создайте класс, расширяющий MonthView, RangeMonthView или MultiMonthView.

Если вам нужен WeekView, также создайте класс, расширяющий WeekView, RangeWeekView или MultiWeekView.

  • Реализуйте три метода: onDrawSelected, onDrawScheme и onDrawText, например:
/**
 * CustomMonthView с canvas
 */
public class CustomMonthView extends MonthView {

    /**
     * Рисование выбранного календаря
     *
     * @param canvas    canvas
     * @param calendar  выбранный календарь
     * @param x         начальная точка x элемента календаря
     * @param y         начальная точка y элемента календаря
     * @param hasScheme есть ли у календаря схема?
     * @return если возвращает true, снова вызовет onDrawScheme
     */
    @Override
    protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) {
        canvas.drawRect(x , y , x + mItemWidth , y + mItemHeight, mSelectedPaint);
        return true;
    }

    /**
     * рисование схемы, если у календаря есть схема
     *
     * @param canvas   canvas
     * @param calendar календарь имеет схему
     * @param x        начальная точка x элемента календаря
     * @param y        начальная точка y элемента календаря
     */
    @Override
    protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) {
       canvas.drawCircle(x + mItemWidth / 2, y + mItemHeight - 3 * mPadding, mPointRadius, mPointPaint);
    }

    /**
     * рисование текста
     *
     * @param canvas     canvas
     * @param calendar   календарь
     * @param x          начальная точка x элемента календаря
     * @param y          начальная точка y элемента календаря
     * @param hasScheme  есть ли у календаря схема?
     * @param isSelected выбран ли календарь?
     */
    @Override
    protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) {
        float baselineY = mTextBaseLine + y;
        int cx = x + mItemWidth / 2;
        canvas.drawText(String.valueOf(calendar.getDay()),
                            cx,
                            baselineY,
                                calendar.isCurrentDay() ? mCurDayTextPaint :
                                    calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint);
    }
}
  • Добавьте путь к классу в xml:
<attr name="month_view" format="string" /><!--ваш путь к MonthView.class-->
<attr name="week_view" format="string" /> <!--ваш путь к WeekView.class-->

<com.haibin.calendarview.CalendarView
            android:id="@+id/calendarView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:month_view="com.haibin.calendarviewproject.meizu.MeiZuMonthView"
            app:week_view="com.haibin.calendarviewproject.meizu.MeizuWeekView" />
  • Вы также можете использовать функцию горячей замены, быстро переключая стили пользовательского интерфейса:
mCalendarView.setWeekView(MeiZuWeekView.class);
mCalendarView.setMonthView(MeiZuMonthView.class);
  • Календарь имеет несколько режимов просмотра на выбор в зависимости от ваших потребностей:
MonthView、WeekView,и select_mode="default_mode"
То же, что и календарь мобильного телефона, перехват даты не поддерживается
MonthView、WeekView,и select_mode="single_mode"
Одиночный режим, поддержка перехвата даты
RangeMonthView、RangeWeekView,необходимо установить select_mode="range_mode"
Поддержка перехвата дат
MultiMonthView、MultiWeekView,необходимо установить select_mode="multi_mode"
Поддержка перехвата дат
  • Если вам нужен WeekView, добавьте родительский макет CalendarLayout в CalendarView:
<com.haibin.calendarview.CalendarLayout
        android:layout_width="match_parent" **Текст запроса:**

android:layout_height="match_parent"
    android:orientation="vertical"
    app:default_status="shrink"
    app:calendar_content_view_id="@+id/recyclerView">

    <com.haibin.calendarview.CalendarView
        android:id="@+id/calendarView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:month_view="com.haibin.calendarviewproject.simple.SimpleMonthView"
        app:week_view="com.haibin.calendarviewproject.simple.SimpleWeekView"
        app:week_bar_view="com.haibin.calendarviewproject.EnglishWeekBar"
        app:month_view_show_mode="mode_only_current" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffff" />
</com.haibin.calendarview.CalendarLayout>

- Вы можете использовать слушатель для отслеживания переключения между WeekView и MonthView.

```java
public void setOnViewChangeListener(OnViewChangeListener listener);
  • Все атрибуты CalendarLayout позволяют плавно прокручивать календарь. Если используется CalendarLayout, необходимо установить calendar_content_view_id.
<attr name="default_status">
      <enum name="expand" value="0" />
      <enum name="shrink" value="1" />
</attr>

<!-- gesture -->
<attr name="gesture_mode">
      <enum name="default_mode" value="0" />
      <enum name="disabled" value="2" />
</attr>

<attr name="calendar_show_mode">
      <enum name="both_month_week_view" value="0" />
      <enum name="only_week_view" value="1" />
      <enum name="only_month_view" value="2" />
</attr>

<attr name="calendar_content_view_id" format="integer" />
  • Если вам нужен полный стиль CalendarView, установите app:calendar_match_parent="true", нет необходимости использовать CalendarLayout.

  • CalendarView также предоставляет YearView, если он вам нужен.

  • При необходимости быстрого перехода к дате можно использовать следующие методы:

CalendarView.scrollToCalendar();
CalendarView.scrollToNext();
CalendarView.scrollToPre();
CalendarView.scrollToXXX();
  • Поддерживается статическая или динамическая настройка начала недели:
app:week_start_with="mon、sun、sat"
mCalendarView.setWeekStarWithSun();
mCalendarView.setWeekStarWithMon();
mCalendarView.setWeekStarWithSat();
  • Можно задать диапазон календаря:
<attr name="min_year" format="integer" />
<attr name="max_year" format="integer" />
<attr name="min_year_month" format="integer" />
<attr name="max_year_month" format="integer" />
<attr name="min_year_day" format="integer" />
<attr name="max_year_day" format="integer" />
CalendarView.setRange(int minYear, int minYearMonth, int minYearDay,
         int maxYear, int maxYearMonth, int maxYearDay)
  • Чтобы перехватить календарь, добавьте OnCalendarInterceptListener:
mCalendarView.setOnCalendarInterceptListener(new CalendarView.OnCalendarInterceptListener() {
     @Override
     public boolean onCalendarIntercept(Calendar calendar) {

         return calendar.isWeekend();
     }

     @Override
     public void onCalendarInterceptClick(Calendar calendar, boolean isClick) {
         //todo 点击拦截的日期回调
     }
});
  • Результаты перехвата и диапазона в месячном и недельном представлении можно получить следующим образом:
boolean isInRange = isInRange(calendar);
boolean isEnable = !onCalendarIntercept(calendar);
  • В CalendarView есть настройки схемы, setSchemeDate(Map<String, Calendar> mSchemeDates).

Класс Calendar:

boolean isWeekend();
int getWeek();
String getSolarTerm();
String getGregorianFestival();
String getTraditionFestival();
boolean isLeapYear();
int getLeapMonth();
boolean isSameMonth(Calendar calendar);
int compareTo(Calendar calendar);
long
``` ### Все атрибуты **CalendarView**

```xml
<declare-styleable name="CalendarView">

        <attr name="calendar_padding" format="dimension" /><!--CalendarView левое и правое заполнение-->

        <attr name="month_view" format="color" /> <!--Пользовательский путь класса-->
        <attr name="week_view" format="string" /> <!--Пользовательский путь класса -->
        <attr name="week_bar_height" format="dimension" /> <!--Высота WeekBar-->
        <attr name="week_bar_view" format="string" /> <!--Путь пользовательского класса WeekBar -->
        <attr name="week_line_margin" format="dimension" /><!--поле линии-->

        <attr name="week_line_background" format="color" /><!--цвет линии-->
        <attr name="week_background" format="color" /> <!--Фон WeekBar-->
        <attr name="week_text_color" format="color" /> <!--Цвет текста WeekBar-->
        <attr name="week_text_size" format="dimension" /><!--Размер текста WeekBar-->

        <attr name="current_day_text_color" format="color" /> <!--цвет текста текущего дня-->
        <attr name="current_day_lunar_text_color" format="color" /><!--цвет лунного текста текущего дня-->

        <attr name="calendar_height" format="string" /> <!--высота элемента календаря-->
        <attr name="day_text_size" format="string" /> <!--размер текста дня календаря-->
        <attr name="lunar_text_size" format="string" /> <!--размер лунного текста календаря-->

        <attr name="scheme_text_color" format="color" /> <!--цвет текста схемы календаря-->
        <attr name="scheme_month_text_color" format="color" /> <!--цвет месяца схемы календаря-->
        <attr name="scheme_lunar_text_color" format="color" /> <!--цвет лунного текста схемы календаря-->

        <attr name="scheme_theme_color" format="color" /> <!-- цвет темы фона схемы календаря-->

        <attr name="selected_theme_color" format="color" /> <!--выбранный цвет темы календаря-->
        <attr name="selected_text_color" format="color" /> <!--выбранный цвет текста календаря-->
        <attr name="selected_lunar_text_color" format="color" /> <!--выбранный лунный цвет текста календаря-->

        <attr name="current_month_text_color" format="color" /> <!--текущий цвет текста месяца-->
        <attr name="other_month_text_color" format="color" /> <!--другой цвет текста месяца-->

        <attr name="current_month_lunar_text_color" format="color" /> <!--текущий лунный цвет текста месяца-->
        <attr name="other_month_lunar_text_color" format="color" /> <!--другой лунный цвет текста месяца-->

        <!-- YearView -->
        <attr name="year_view_month_text_size" format="dimension" /> <!-- размер текста месяца year view-->
        <attr name="year_view_day_text_size" format="dimension" /> <!-- size текста дня year view-->
        <attr name="year_view_month_text_color" format="color" /> <!-- color текста месяца year view-->
        <attr name="year_view_day_text_color" format="color" /> <!-- color текста дня year view-->
        <attr name="year_view_scheme_color" format="color" /> <!-- scheme цвет year view-->

        <attr name="min_year" format="integer" />  <!--min_year-->
        <attr name="max_year" format="integer" />  <!--max_year-->
        <attr name="min_year_month" format="integer" /> <!--min_year_month-->
        <attr name="max_year_month" format="integer" /> <!--max_year_month-->

        <!--MonthView можно прокручивать-->
        <attr name="month_view_scrollable" format="boolean" />
        <!--WeekView можно прокручивать-->
        <attr name="week_view_scrollable" format="boolean" />
        <!--YearView можно прокручивать-->
        <attr name="year_view_scrollable" format="boolean" />
        
        <!--MonthView режим отображения-->
        <attr name="month_view_show_mode">
             <enum name="mode_all" value="0" />  <!--показать предыдущий, текущий и следующий месяц календаря-->
             <enum name="mode_only_current" value="1" /> <!--показать только текущий месяц-->
             <enum name="mode_fix" value="2" /> <!--зафиксировать текущий месяц-->
        </attr>

        <!-- WeekStar -->
        <attr name="week_start_with">
             <enum name="sun"

</declare-styleable>
``` Используйте лучше с демо при использовании. Календарь очень прост в настройке.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/huanghaibin_dev-CalendarView.git
git@api.gitlife.ru:oschina-mirror/huanghaibin_dev-CalendarView.git
oschina-mirror
huanghaibin_dev-CalendarView
huanghaibin_dev-CalendarView
master