Android 날짜 표시 와 날짜 선택 라 이브 러 리

날짜 표시 와 라 이브 러 리 선택 은 연속 적 이 고 여러 개의 불 연속 적 인 날 짜 를 선택 할 수 있 습 니 다.구체 적 인 UI 는 완전히 추상 화 되 어 고도 로 사용자 정의 할 수 있 습 니 다GITHUB 주소
지원 하 는 기능:
1.연속 적 이 고 여러 개의 불 연속 적 인 날 짜 를 선택한다.
2.두 가지 도구 류(SingleMonthSelector,CalendarSelector)를 제공 하여 한 달 과 여러 달 연속 날짜 의 선택 을 처리 합 니 다.
3.이벤트 선택 을 차단 할 수 있 습 니 다.선택 한 날짜 의 길이 가 제한 되 거나 특정한 날 짜 를 선택 할 수 없 을 때 이 벤트 를 중단 할 수 있 습 니 다.
4.SingleMonthSelector,CalendarSelector 두 도구 류 는 모두 상태 저장 을 지원 하고 이전의 상 태 를 복원 할 수 있 습 니 다.
5.UI 디 스 플레이 는 매우 유연 하 게 사용자 정의 할 수 있 습 니 다.매달 하루 에 다른 layot 를 지정 할 수 있 고 매달 줄 과 열(6 줄 7 열)에 서로 다른 장식 기 를 지정 할 수 있 습 니 다.
6,일주일 의 첫날 은 완전히 일치 하지 않 습 니 다.현재 지원(SUNDAY,SATURDAY,MONDAY)세 가지
7.layot 에서 실시 간 으로 구체 적 인 디 스 플레이 스타일 을 볼 수 있 도록 editor mode 지원 을 제공 하여 디 버 깅 을 개발 할 때 편리 합 니 다.
8、API+8 이상 버 전 지원
어떻게 사용 합 니까?
Gradle 파일 에 의존 도 추가
compile 'com.tubb.calendarselector.library:calendar-selector:0.1.1'
MonthView 를 사용 하여 달 을 표시 합 니 다.이것 은 사용자 정의 View 입 니 다.주요 작업 은 그룹 이 한 달 동안 의 일 수 를 표시 하 는 것 입 니 다.

<com.tubb.calendarselector.library.MonthView
 android:id="@+id/ssMv"
 android:layout_width="match_parent"
 android:layout_height="300dp"
 sc:sc_firstday_week="sunday"
 sc:sc_draw_monthday_only="false"
 sc:sc_month="2016-3"/>

편 의 를 위해 저 희 는 두 가지 도구 류 를 제공 하여 날 짜 를 선택 하 는 기능 을 제공 합 니 다.SingleMonthSelector 는 한 달 동안 선택 할 수 있 고 CalendarSelector 는 여러 달 동안 선택 할 수 있 습 니 다.
저희 도 이 두 도구 류 에 상태 유지 기능 을 제공 합 니 다.필요 할 때 상태 회복 을 하고 사용자 에 게 더 좋 은 체험 을 주기 위해 구체 적 으로 사용 하면 State Saved Activity 를 볼 수 있 습 니 다.
Single MonthSelector 사용 하기
singleMonthSelector.bind(monthView);
CalendarSelector 사용 하기(여기 서 주의해 야 할 것 은 ListView 가 지원 되 지 않 습 니 다.이 경우 RecyclerView 를 직접 사용 하 십시오)
calendarSelector.bind(containerViewGroup, monthView, itemPosition);
저 희 는 이 두 날짜 에 도구 류 를 선택 하 는 데 두 가지 모델 을 제공 하여 연속(SEGMENT)과 불 연속(INTERVAL)을 선택 하 는 시간 을 지원 합 니 다.
SEGMENT MODE

selector = new CalendarSelector(data, CalendarSelector.Mode.SEGMENT);
selector.setSegmentSelectListener(new SegmentSelectListener() {
 @Override
 public void onSegmentSelect(FullDay startDay, FullDay endDay) {
 Log.d(TAG, "segment select " + startDay.toString() + " : " + endDay.toString());
 }

 @Override
 public boolean onInterceptSelect(FullDay selectingDay) { // one day intercept
 if(SCDateUtils.isToday(selectingDay.getYear(), selectingDay.getMonth(), selectingDay.getDay())){
  Toast.makeText(CalendarSelectorActivity.this, "Today can't be selected", Toast.LENGTH_SHORT).show();
  return true;
 }
 return super.onInterceptSelect(selectingDay);
 }

 @Override
 public boolean onInterceptSelect(FullDay startDay, FullDay endDay) { // segment days intercept
 int differDays = SCDateUtils.countDays(startDay.getYear(), startDay.getMonth(), startDay.getDay(),
  endDay.getYear(), endDay.getMonth(), endDay.getDay());
 Log.d(TAG, "differDays " + differDays);
 if(differDays > 10) {
  Toast.makeText(CalendarSelectorActivity.this, "Selected days can't more than 10", Toast.LENGTH_SHORT).show();
  return true;
 }
 return super.onInterceptSelect(startDay, endDay);
 }

 @Override
 public void selectedSameDay(FullDay sameDay) { // selected the same day
 super.selectedSameDay(sameDay);
 }
});
INTERVAL mode

selector = new SingleMonthSelector(CalendarSelector.Mode.INTERVAL);
selector.setIntervalSelectListener(new IntervalSelectListener() {
 @Override
 public void onIntervalSelect(List<FullDay> selectedDays) {
 Log.d(TAG, "interval selected days " + selectedDays.toString());
 }

 @Override
 public boolean onInterceptSelect(List<FullDay> selectedDays, FullDay selectingDay) {
 if(selectedDays.size() >= 5) {
  Toast.makeText(SingleMonthSelectorActivity.this, "Selected days can't more than 5", Toast.LENGTH_LONG).show();
  return true;
 }
 return super.onInterceptSelect(selectedDays, selectingDay);
 }
});
이 두 가지 모델 에서 우 리 는 모두 사건 을 선택 하 는 차단 기능 을 제공 했다.그러면 일부 제한 을 실현 할 수 있다.예 를 들 어 날짜 길이 의 제한,일부 특수 한 날 짜 는 선택 할 수 없다 등 이다.
구체 적 으로 어떻게 사용 하 는 지 는 예제 프로그램 SingleMonthSelector Activity 와 CalendarSelector Activity 를 볼 수 있 습 니 다.
사용자 정의
저 희 는 MonthView 의 디 스 플레이 에 매우 유연 한 사용자 정의 기능 을 제공 합 니 다.MonthView 자체 가 기능 이 완 선 된 사용자 정의 View 이 고 구체 적 으로 어느 날 의 디 스 플레이 는 layot 파일 에서 설정 할 수 있 습 니 다.

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 xmlns:tools="http://schemas.android.com/tools">

 <TextView
 android:id="@+id/tvDay"
 android:layout_width="30dp"
 android:layout_height="30dp"
 android:textSize="@dimen/t_16"
 tools:text="0"
 android:layout_gravity="center"
 android:gravity="center"
 android:textColor="@color/color_dayview_text_selector"
 android:background="@drawable/drawable_custom_dayview_text_bg"
 />

</FrameLayout>
위의 사용자 정의 기능 을 비교적 유연 하 게 실현 하기 위해 서,우 리 는 특별히 하나의 인 터 페 이 스 를 추상적으로 추정한다.이 인 터 페 이 스 를 실현 하고 해당 하 는 설정(MonthView.setSCMonth(scMonth,new CustomDayViewInflater(context)을 하면 된다.

public class CustomDayViewInflater extends DayViewInflater{

 public CustomDayViewInflater(Context context) {
 super(context);
 }

 @Override
 public DayViewHolder inflateDayView(ViewGroup container) {
 View dayView = mLayoutInflater.inflate(R.layout.layout_dayview_custom, container, false);
 return new CustomDayViewHolder(dayView);
 }

 public static class CustomDayViewHolder extends DayViewHolder{

 protected TextView tvDay;
 private int mPrevMonthDayTextColor;
 private int mNextMonthDayTextColor;

 public CustomDayViewHolder(View dayView) {
  super(dayView);
  tvDay = (TextView) dayView.findViewById(com.tubb.calendarselector.library.R.id.tvDay);
  mPrevMonthDayTextColor = ContextCompat.getColor(mContext, com.tubb.calendarselector.library.R.color.c_999999);
  mNextMonthDayTextColor = ContextCompat.getColor(mContext, com.tubb.calendarselector.library.R.color.c_999999);
 }

 @Override
 public void setCurrentMonthDayText(FullDay day, boolean isSelected) {
  tvDay.setText(String.valueOf(day.getDay()));
  tvDay.setSelected(isSelected);
 }

 @Override
 public void setPrevMonthDayText(FullDay day) {
  tvDay.setTextColor(mPrevMonthDayTextColor);
  tvDay.setText(String.valueOf(day.getDay()));
 }

 @Override
 public void setNextMonthDayText(FullDay day) {
  tvDay.setTextColor(mNextMonthDayTextColor);
  tvDay.setText(String.valueOf(day.getDay()));
 }

 }
}
날짜 선택 이 라면 두 가지 상태(선택,선택 되 지 않 음)사이 의 전환 이 있 습 니 다.이 상태 로 전환 하 는 인터페이스 가 드 러 났 습 니 다(DayViewHolder.setCurrent MonthDay Text(FullDay day,boolean isSelected).
이렇게 하면 우 리 는 상태 전환 을 할 때 애니메이션 같은 것 을 만 들 수 있 고 구체 적 으로 AnimDay View Inflater 예제 프로그램 을 볼 수 있다.

@Override
public void setCurrentMonthDayText(FullDay day, boolean isSelected) {
 boolean oldSelected = tvDay.isSelected();
 tvDay.setText(String.valueOf(day.getDay()));
 tvDay.setSelected(isSelected);
 // view selected animation
 if(!oldSelected && isSelected){
 AnimatorSet animatorSet = new AnimatorSet();
 animatorSet.setInterpolator(AnimationUtils.loadInterpolator(mContext, android.R.anim.bounce_interpolator));
 animatorSet.play(ObjectAnimator.ofFloat(tvDay, "scaleX", 0.5f, 1.0f))
  .with(ObjectAnimator.ofFloat(tvDay, "scaleY", 0.5f, 1.0f));
 animatorSet.setDuration(500)
  .start();
 }
}
어떤 경우 에 MonthView 의 줄 과 열 에 장식 을 더 해서 더욱 아름 답 게 보일 수 있 습 니 다.이 기능 은 저희 도 지원 합 니 다.구체 적 으로 어떻게 실현 하 는 지DecorDayViewInflater예제 절 차 를 볼 수 있 습 니 다.

@Override
public Decor inflateHorizontalDecor(ViewGroup container, int row, int totalRow) {
 return new Decor(mLayoutInflater.inflate(R.layout.view_horizontal_decor, container, false), true);
}

@Override
public Decor inflateVerticalDecor(ViewGroup container, int col, int totalCol) {
 return new Decor(mLayoutInflater.inflate(R.layout.view_vertical_decor, container, false), true);
}
우 리 는 또한 MonthView 에 이 달의 날짜 만 표시 하고 일주일 의 어느 날 을 첫날 로 지정 하 며 디 버 깅 을 개발 할 때 편리 하도록 추가 하 는 속성 등 자체 적 인 속성 을 제공 했다.

<resources>
 <declare-styleable name="MonthView">
 <!-- only draw the month day, or not, default is false -->
 <attr name="sc_draw_monthday_only" format="boolean"/>
 <!-- start day of a week, we support (sunday、monday and saturday) -->
 <attr name="sc_firstday_week" format="enum">
  <enum name="sunday" value="1"/>
  <enum name="monday" value="2"/>
  <enum name="saturday" value="7"/>
 </attr>

 <!-- editor mode only -->
 <!-- test selected days (format:1,2,3,4) -->
 <attr name="sc_selected_days" format="string"/>
 <!-- test month (format:2016-3) -->
 <attr name="sc_month" format="string"/>
 </declare-styleable>
</resources>
이상 은 본 고의 모든 내용 입 니 다.여러분 이 안 드 로 이 드 소프트웨어 프로 그래 밍 을 배 우 는 데 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기