From bdb8945d71353eeae749a19e0aec1882584544ae Mon Sep 17 00:00:00 2001 From: Kevin Jiang Date: Mon, 22 Jun 2015 11:50:30 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8D=95=E9=80=89?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E3=80=82=E9=9A=90=E8=97=8F=E7=A1=AE=E5=AE=9A?= =?UTF-8?q?=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datepicker/views/DatePicker.java | 16 ++ .../datepicker/views/MonthView.java | 226 ++++++++++++++---- .../datepicker/views/TitleView.java | 7 + .../datepicker/demo/MainActivity.java | 28 ++- Demo/src/main/res/layout/activity_main.xml | 12 +- 5 files changed, 231 insertions(+), 58 deletions(-) diff --git a/DatePicker/src/main/java/cn/aigestudio/datepicker/views/DatePicker.java b/DatePicker/src/main/java/cn/aigestudio/datepicker/views/DatePicker.java index d834edf..d8b40f6 100644 --- a/DatePicker/src/main/java/cn/aigestudio/datepicker/views/DatePicker.java +++ b/DatePicker/src/main/java/cn/aigestudio/datepicker/views/DatePicker.java @@ -42,6 +42,18 @@ public void setOnDateSelected(OnDateSelected onDateSelected) { titleView.setOnDateSelected(onDateSelected, monthView); } + /** + * 监听选择的日期发生变化 + * @param onDateSelected + */ + public void setOnDateChanged(OnDateSelected onDateSelected) { + monthView.setOnDateChanged(onDateSelected); + } + + public void hideEnsureButton() { + titleView.hideEnsureButton(); + } + @Override public void setColor(int color) { titleView.setColor(color); @@ -52,4 +64,8 @@ public void setColor(int color) { public void isLunarDisplay(boolean display) { monthView.setLunarShow(display); } + + public void setSingleMonth(boolean t) { + monthView.setSingleSelected(t); + } } diff --git a/DatePicker/src/main/java/cn/aigestudio/datepicker/views/MonthView.java b/DatePicker/src/main/java/cn/aigestudio/datepicker/views/MonthView.java index 5fe7c10..28c0cba 100644 --- a/DatePicker/src/main/java/cn/aigestudio/datepicker/views/MonthView.java +++ b/DatePicker/src/main/java/cn/aigestudio/datepicker/views/MonthView.java @@ -29,6 +29,7 @@ import cn.aigestudio.datepicker.bizs.CalendarBiz; import cn.aigestudio.datepicker.entities.BGCircle; +import cn.aigestudio.datepicker.interfaces.OnDateSelected; /** * 月视图 @@ -69,6 +70,7 @@ public class MonthView extends View implements ValueAnimator.AnimatorUpdateListe private Map circlesAppear = new HashMap<>(); private Map circlesDisappear = new HashMap<>(); private List dateSelected = new ArrayList<>(); + private OnDateSelected mOnDateSelected; private enum EventType { SINGLE, MULTIPLE @@ -135,6 +137,18 @@ public MonthView(Context context, AttributeSet attrs, int defStyleAttr) { buildCalendarRegion(); } + /** + * 设置日期是多选还是单选 + * @param t + */ + public void setSingleSelected(boolean t) { + if (t) { + mEventType = EventType.SINGLE; + } else { + mEventType = EventType.MULTIPLE; + } + } + /** * 设置页面改变时的监听器 * @@ -249,6 +263,104 @@ private BGCircle createCircle(float x, float y) { return circle1; } + /** + * 点击选择日期后,添加或者删除 + * @param region + * @param date + */ + private void dateSelect(Region region, final String date) { + if (mEventType == EventType.SINGLE) { + int size = dateSelected.size(); + if (!dateSelected.contains(date)) { + for (int i = 0; i < size; i++) { + removeDateSelected(region, dateSelected.get(i)); + } + addDateSelected(region, date); + } else { + for (int i = 0; i < size; i++) { + String nDate = dateSelected.get(i); + if (nDate.equals(date)) { + continue; + } + removeDateSelected(region, nDate); + } + } + } else { + if (dateSelected.contains(date)) { + removeDateSelected(region, date); + } else { + addDateSelected(region, date); + } + } + } + + /** + * 删除一个已经选择的日期 + * @param region + * @param date + */ + private void removeDateSelected(Region region, final String date) { + if (dateSelected.contains(date)) { + dateSelected.remove(date); + + BGCircle circle = circlesAppear.get(date); + + ValueAnimator animScale = ObjectAnimator.ofInt(circle, "radius", circleRadius, 0); + animScale.setDuration(250); + animScale.setInterpolator(new AccelerateInterpolator()); + animScale.addUpdateListener(this); + animScale.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + circlesDisappear.remove(date); + } + }); + animScale.start(); + + circlesDisappear.put(date, circle); + + circlesAppear.remove(date); + } + } + + /** + * 添加日期到选择的列表里面 + * @param region + * @param date + */ + private void addDateSelected(Region region, final String date) { + dateSelected.add(date); + + BGCircle circle = createCircle(region.getBounds().centerX() + index * sizeBase, region.getBounds().centerY()); + + ValueAnimator animScale1 = ObjectAnimator.ofInt(circle, "radius", 0, animZoomOut1); + animScale1.setDuration(250); + animScale1.setInterpolator(new DecelerateInterpolator()); + animScale1.addUpdateListener(this); + + ValueAnimator animScale2 = ObjectAnimator.ofInt(circle, "radius", animZoomOut1, animZoomIn1); + animScale2.setDuration(100); + animScale2.setInterpolator(new AccelerateInterpolator()); + animScale2.addUpdateListener(this); + + ValueAnimator animScale3 = ObjectAnimator.ofInt(circle, "radius", animZoomIn1, animZoomOut2); + animScale3.setDuration(150); + animScale3.setInterpolator(new DecelerateInterpolator()); + animScale3.addUpdateListener(this); + + ValueAnimator animScale4 = ObjectAnimator.ofInt(circle, "radius", animZoomOut2, circleRadius); + animScale4.setDuration(50); + animScale4.setInterpolator(new AccelerateInterpolator()); + animScale4.addUpdateListener(this); + + AnimatorSet animSet = new AnimatorSet(); + animSet.playSequentially(animScale1, animScale2, animScale3, animScale4); + + animSet.start(); + + circlesAppear.put(date, circle); + } + private void defineContainRegion(int x, int y) { for (int i = 0; i < mRegion.length; i++) { for (int j = 0; j < mRegion[i].length; j++) { @@ -267,58 +379,60 @@ private void defineContainRegion(int x, int y) { } final String date = currentYear + "-" + currentMonth + "-" + mCalendarBiz.getGregorianCreated().get(index)[i][j]; - if (dateSelected.contains(date)) { - dateSelected.remove(date); - - BGCircle circle = circlesAppear.get(date); - - ValueAnimator animScale = ObjectAnimator.ofInt(circle, "radius", circleRadius, 0); - animScale.setDuration(250); - animScale.setInterpolator(new AccelerateInterpolator()); - animScale.addUpdateListener(this); - animScale.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - circlesDisappear.remove(date); - } - }); - animScale.start(); - - circlesDisappear.put(date, circle); - - circlesAppear.remove(date); - } else { - dateSelected.add(date); - - BGCircle circle = createCircle(region.getBounds().centerX() + index * sizeBase, region.getBounds().centerY()); - - ValueAnimator animScale1 = ObjectAnimator.ofInt(circle, "radius", 0, animZoomOut1); - animScale1.setDuration(250); - animScale1.setInterpolator(new DecelerateInterpolator()); - animScale1.addUpdateListener(this); - - ValueAnimator animScale2 = ObjectAnimator.ofInt(circle, "radius", animZoomOut1, animZoomIn1); - animScale2.setDuration(100); - animScale2.setInterpolator(new AccelerateInterpolator()); - animScale2.addUpdateListener(this); - - ValueAnimator animScale3 = ObjectAnimator.ofInt(circle, "radius", animZoomIn1, animZoomOut2); - animScale3.setDuration(150); - animScale3.setInterpolator(new DecelerateInterpolator()); - animScale3.addUpdateListener(this); - - ValueAnimator animScale4 = ObjectAnimator.ofInt(circle, "radius", animZoomOut2, circleRadius); - animScale4.setDuration(50); - animScale4.setInterpolator(new AccelerateInterpolator()); - animScale4.addUpdateListener(this); - - AnimatorSet animSet = new AnimatorSet(); - animSet.playSequentially(animScale1, animScale2, animScale3, animScale4); - - animSet.start(); - - circlesAppear.put(date, circle); - } + dateSelect(region, date); + +// if (dateSelected.contains(date)) { +// dateSelected.remove(date); +// +// BGCircle circle = circlesAppear.get(date); +// +// ValueAnimator animScale = ObjectAnimator.ofInt(circle, "radius", circleRadius, 0); +// animScale.setDuration(250); +// animScale.setInterpolator(new AccelerateInterpolator()); +// animScale.addUpdateListener(this); +// animScale.addListener(new AnimatorListenerAdapter() { +// @Override +// public void onAnimationEnd(Animator animation) { +// circlesDisappear.remove(date); +// } +// }); +// animScale.start(); +// +// circlesDisappear.put(date, circle); +// +// circlesAppear.remove(date); +// } else { +// dateSelected.add(date); +// +// BGCircle circle = createCircle(region.getBounds().centerX() + index * sizeBase, region.getBounds().centerY()); +// +// ValueAnimator animScale1 = ObjectAnimator.ofInt(circle, "radius", 0, animZoomOut1); +// animScale1.setDuration(250); +// animScale1.setInterpolator(new DecelerateInterpolator()); +// animScale1.addUpdateListener(this); +// +// ValueAnimator animScale2 = ObjectAnimator.ofInt(circle, "radius", animZoomOut1, animZoomIn1); +// animScale2.setDuration(100); +// animScale2.setInterpolator(new AccelerateInterpolator()); +// animScale2.addUpdateListener(this); +// +// ValueAnimator animScale3 = ObjectAnimator.ofInt(circle, "radius", animZoomIn1, animZoomOut2); +// animScale3.setDuration(150); +// animScale3.setInterpolator(new DecelerateInterpolator()); +// animScale3.addUpdateListener(this); +// +// ValueAnimator animScale4 = ObjectAnimator.ofInt(circle, "radius", animZoomOut2, circleRadius); +// animScale4.setDuration(50); +// animScale4.setInterpolator(new AccelerateInterpolator()); +// animScale4.addUpdateListener(this); +// +// AnimatorSet animSet = new AnimatorSet(); +// animSet.playSequentially(animScale1, animScale2, animScale3, animScale4); +// +// animSet.start(); +// +// circlesAppear.put(date, circle); +// } } } } @@ -388,6 +502,10 @@ public boolean onTouchEvent(MotionEvent event) { } } else { defineContainRegion((int) event.getX(), (int) event.getY()); + // 调用外部设置的监听器 + if (mOnDateSelected != null) { + mOnDateSelected.selected(dateSelected); + } } break; } @@ -542,4 +660,8 @@ private void drawMonth(Canvas canvas, float offsetX, int year, int month) { mCalendarBiz.getGregorianCreated().put(current, gregorianCurrent); canvas.restore(); } + + public void setOnDateChanged(OnDateSelected onDateSelected) { + mOnDateSelected = onDateSelected; + } } diff --git a/DatePicker/src/main/java/cn/aigestudio/datepicker/views/TitleView.java b/DatePicker/src/main/java/cn/aigestudio/datepicker/views/TitleView.java index 96d52c1..7818b66 100644 --- a/DatePicker/src/main/java/cn/aigestudio/datepicker/views/TitleView.java +++ b/DatePicker/src/main/java/cn/aigestudio/datepicker/views/TitleView.java @@ -89,4 +89,11 @@ public void onSizeChanged(int size) { tvConfirm.setPadding(0, padding, padding, padding); tvConfirm.getPaint().setTextSize(textSizeSmall); } + + /** + * 隐藏确定按钮 + */ + public void hideEnsureButton() { + tvConfirm.setVisibility(View.INVISIBLE); + } } diff --git a/Demo/src/main/java/cn/aigestudio/datepicker/demo/MainActivity.java b/Demo/src/main/java/cn/aigestudio/datepicker/demo/MainActivity.java index 916d79c..d71a51d 100644 --- a/Demo/src/main/java/cn/aigestudio/datepicker/demo/MainActivity.java +++ b/Demo/src/main/java/cn/aigestudio/datepicker/demo/MainActivity.java @@ -40,7 +40,7 @@ * @author AigeStudio 2015-03-26 */ public class MainActivity extends Activity { - private DatePicker mDatePicker; + private DatePicker mDatePicker, mDPNoTitle; private Button btnPick; @Override @@ -51,14 +51,34 @@ protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.activity_main); mDatePicker = (DatePicker) findViewById(R.id.main_dp); + mDatePicker.setSingleMonth(true); mDatePicker.setOnDateSelected(new OnDateSelected() { @Override public void selected(List date) { - for (String s : date) { - LogUtil.v(s); - } + Toast.makeText(MainActivity.this, date.toString(), + Toast.LENGTH_SHORT).show(); } }); + mDatePicker.setOnDateChanged(new OnDateSelected() { + @Override + public void selected(List date) { + Toast.makeText(MainActivity.this, date.toString(), + Toast.LENGTH_SHORT).show(); + } + }); + + /* 隐藏确定按钮 + mDPNoTitle = (DatePicker) findViewById(R.id.picker_no_title); + mDPNoTitle.hideEnsureButton(); + mDPNoTitle.setSingleMonth(true); + mDPNoTitle.setOnDateChanged(new OnDateSelected() { + @Override + public void selected(List date) { + Toast.makeText(MainActivity.this, date.toString(), + Toast.LENGTH_SHORT).show(); + } + }); + */ btnPick = (Button) findViewById(R.id.main_btn); btnPick.setOnClickListener(new View.OnClickListener() { diff --git a/Demo/src/main/res/layout/activity_main.xml b/Demo/src/main/res/layout/activity_main.xml index e4a13e8..9d11565 100644 --- a/Demo/src/main/res/layout/activity_main.xml +++ b/Demo/src/main/res/layout/activity_main.xml @@ -1,10 +1,18 @@ + + From c044333aba621424e76f70f718972ffee118a540 Mon Sep 17 00:00:00 2001 From: Kevin Jiang Date: Mon, 22 Jun 2015 11:55:12 +0800 Subject: [PATCH 2/2] remove useless codes comments --- .../datepicker/views/MonthView.java | 53 ------------------- 1 file changed, 53 deletions(-) diff --git a/DatePicker/src/main/java/cn/aigestudio/datepicker/views/MonthView.java b/DatePicker/src/main/java/cn/aigestudio/datepicker/views/MonthView.java index 28c0cba..b21fcc0 100644 --- a/DatePicker/src/main/java/cn/aigestudio/datepicker/views/MonthView.java +++ b/DatePicker/src/main/java/cn/aigestudio/datepicker/views/MonthView.java @@ -380,59 +380,6 @@ private void defineContainRegion(int x, int y) { final String date = currentYear + "-" + currentMonth + "-" + mCalendarBiz.getGregorianCreated().get(index)[i][j]; dateSelect(region, date); - -// if (dateSelected.contains(date)) { -// dateSelected.remove(date); -// -// BGCircle circle = circlesAppear.get(date); -// -// ValueAnimator animScale = ObjectAnimator.ofInt(circle, "radius", circleRadius, 0); -// animScale.setDuration(250); -// animScale.setInterpolator(new AccelerateInterpolator()); -// animScale.addUpdateListener(this); -// animScale.addListener(new AnimatorListenerAdapter() { -// @Override -// public void onAnimationEnd(Animator animation) { -// circlesDisappear.remove(date); -// } -// }); -// animScale.start(); -// -// circlesDisappear.put(date, circle); -// -// circlesAppear.remove(date); -// } else { -// dateSelected.add(date); -// -// BGCircle circle = createCircle(region.getBounds().centerX() + index * sizeBase, region.getBounds().centerY()); -// -// ValueAnimator animScale1 = ObjectAnimator.ofInt(circle, "radius", 0, animZoomOut1); -// animScale1.setDuration(250); -// animScale1.setInterpolator(new DecelerateInterpolator()); -// animScale1.addUpdateListener(this); -// -// ValueAnimator animScale2 = ObjectAnimator.ofInt(circle, "radius", animZoomOut1, animZoomIn1); -// animScale2.setDuration(100); -// animScale2.setInterpolator(new AccelerateInterpolator()); -// animScale2.addUpdateListener(this); -// -// ValueAnimator animScale3 = ObjectAnimator.ofInt(circle, "radius", animZoomIn1, animZoomOut2); -// animScale3.setDuration(150); -// animScale3.setInterpolator(new DecelerateInterpolator()); -// animScale3.addUpdateListener(this); -// -// ValueAnimator animScale4 = ObjectAnimator.ofInt(circle, "radius", animZoomOut2, circleRadius); -// animScale4.setDuration(50); -// animScale4.setInterpolator(new AccelerateInterpolator()); -// animScale4.addUpdateListener(this); -// -// AnimatorSet animSet = new AnimatorSet(); -// animSet.playSequentially(animScale1, animScale2, animScale3, animScale4); -// -// animSet.start(); -// -// circlesAppear.put(date, circle); -// } } } }