|
33 | 33 |
|
34 | 34 | /**
|
35 | 35 | * Created by Raquib-ul-Alam Kanak on 7/21/2014.
|
36 |
| - * Website: http://april-shower.com |
| 36 | + * Website: http://alamkanak.me |
37 | 37 | */
|
38 | 38 | public class WeekView extends View {
|
39 | 39 |
|
@@ -102,6 +102,8 @@ public class WeekView extends View {
|
102 | 102 | private EventClickListener mEventClickListener;
|
103 | 103 | private EventLongPressListener mEventLongPressListener;
|
104 | 104 | private MonthChangeListener mMonthChangeListener;
|
| 105 | + private TimeClickListener mTimeClickListener; |
| 106 | + |
105 | 107 | private final GestureDetector.SimpleOnGestureListener mGestureListener = new GestureDetector.SimpleOnGestureListener() {
|
106 | 108 |
|
107 | 109 | @Override
|
@@ -148,17 +150,28 @@ else if (mCurrentFlingDirection == Direction.VERTICAL){
|
148 | 150 |
|
149 | 151 | @Override
|
150 | 152 | public boolean onSingleTapConfirmed(MotionEvent e) {
|
| 153 | + // If the tap was on an event then trigger the callback. |
151 | 154 | if (mEventRects != null && mEventClickListener != null) {
|
152 | 155 | List<EventRect> reversedEventRects = mEventRects;
|
153 | 156 | Collections.reverse(reversedEventRects);
|
154 | 157 | for (EventRect event : reversedEventRects) {
|
155 | 158 | if (event.rectF != null && e.getX() > event.rectF.left && e.getX() < event.rectF.right && e.getY() > event.rectF.top && e.getY() < event.rectF.bottom) {
|
156 | 159 | mEventClickListener.onEventClick(event.originalEvent, event.rectF);
|
157 | 160 | playSoundEffect(SoundEffectConstants.CLICK);
|
158 |
| - break; |
| 161 | + return super.onSingleTapConfirmed(e); |
159 | 162 | }
|
160 | 163 | }
|
161 | 164 | }
|
| 165 | + |
| 166 | + // If the tap was on in an empty space, then trigger the callback. |
| 167 | + if (mTimeClickListener != null && e.getX() > mHeaderColumnWidth && e.getY() > (mHeaderTextHeight + mHeaderRowPadding * 2 + mHeaderMarginBottom)) { |
| 168 | + Calendar selectedTime = getTimeFromPoint(e.getX(), e.getY()); |
| 169 | + if (selectedTime != null) { |
| 170 | + playSoundEffect(SoundEffectConstants.CLICK); |
| 171 | + mTimeClickListener.onTimeClicked(selectedTime); |
| 172 | + } |
| 173 | + } |
| 174 | + |
162 | 175 | return super.onSingleTapConfirmed(e);
|
163 | 176 | }
|
164 | 177 |
|
@@ -375,7 +388,7 @@ private void drawHeaderRowAndEvents(Canvas canvas) {
|
375 | 388 | lineCount = (lineCount) * (mNumberOfVisibleDays+1);
|
376 | 389 | float[] hourLines = new float[lineCount * 4];
|
377 | 390 |
|
378 |
| - // Clear the cache for events rectangles. |
| 391 | + // Clear the cache for event rectangles. |
379 | 392 | if (mEventRects != null) {
|
380 | 393 | for (EventRect eventRect: mEventRects) {
|
381 | 394 | eventRect.rectF = null;
|
@@ -450,6 +463,37 @@ private void drawHeaderRowAndEvents(Canvas canvas) {
|
450 | 463 |
|
451 | 464 | }
|
452 | 465 |
|
| 466 | + /** |
| 467 | + * Get the time and date where the user clicked on. |
| 468 | + * @param x The x position of the touch event. |
| 469 | + * @param y The y position of the touch event. |
| 470 | + * @return The time and date at the clicked position. |
| 471 | + */ |
| 472 | + private Calendar getTimeFromPoint(float x, float y){ |
| 473 | + int leftDaysWithGaps = (int) -(Math.ceil(mCurrentOrigin.x / (mWidthPerDay + mColumnGap))); |
| 474 | + float startPixel = mCurrentOrigin.x + (mWidthPerDay + mColumnGap) * leftDaysWithGaps + |
| 475 | + mHeaderColumnWidth; |
| 476 | + for (int dayNumber = leftDaysWithGaps + 1; |
| 477 | + dayNumber <= leftDaysWithGaps + mNumberOfVisibleDays + 1; |
| 478 | + dayNumber++) { |
| 479 | + float start = (startPixel < mHeaderColumnWidth ? mHeaderColumnWidth : startPixel); |
| 480 | + if (mWidthPerDay + startPixel - start> 0 |
| 481 | + && x>start && x<startPixel + mWidthPerDay){ |
| 482 | + Calendar day = (Calendar) mToday.clone(); |
| 483 | + day.add(Calendar.DATE, dayNumber - 1); |
| 484 | + float pixelsFromZero = y - mCurrentOrigin.y - mHeaderTextHeight |
| 485 | + - mHeaderRowPadding * 2 - mTimeTextHeight/2 - mHeaderMarginBottom; |
| 486 | + int hour = (int)(pixelsFromZero / mHourHeight); |
| 487 | + int minute = (int) (60 * (pixelsFromZero - hour * mHourHeight) / mHourHeight); |
| 488 | + day.add(Calendar.HOUR, hour); |
| 489 | + day.set(Calendar.MINUTE, minute); |
| 490 | + return day; |
| 491 | + } |
| 492 | + startPixel += mWidthPerDay + mColumnGap; |
| 493 | + } |
| 494 | + return null; |
| 495 | + } |
| 496 | + |
453 | 497 | /**
|
454 | 498 | * Draw all the events of a particular day.
|
455 | 499 | * @param date The day.
|
@@ -660,13 +704,17 @@ private void getMoreEvents(Calendar day) {
|
660 | 704 | }
|
661 | 705 | }
|
662 | 706 |
|
| 707 | + /** |
| 708 | + * Cache the event for smooth scrolling functionality. |
| 709 | + * @param event The event to cache. |
| 710 | + */ |
663 | 711 | private void cacheEvent(WeekViewEvent event) {
|
664 | 712 | if (!isSameDay(event.getStartTime(), event.getEndTime())) {
|
665 | 713 | Calendar endTime = (Calendar) event.getStartTime().clone();
|
666 | 714 | endTime.set(Calendar.HOUR_OF_DAY, 23);
|
667 | 715 | endTime.set(Calendar.MINUTE, 59);
|
668 | 716 | Calendar startTime = (Calendar) event.getEndTime().clone();
|
669 |
| - startTime.set(Calendar.HOUR_OF_DAY, 00); |
| 717 | + startTime.set(Calendar.HOUR_OF_DAY, 0); |
670 | 718 | startTime.set(Calendar.MINUTE, 0);
|
671 | 719 | WeekViewEvent event1 = new WeekViewEvent(event.getId(), event.getName(), event.getStartTime(), endTime);
|
672 | 720 | event1.setColor(event.getColor());
|
@@ -869,6 +917,15 @@ public void setEventLongPressListener(EventLongPressListener eventLongPressListe
|
869 | 917 | this.mEventLongPressListener = eventLongPressListener;
|
870 | 918 | }
|
871 | 919 |
|
| 920 | + public TimeClickListener getHourClickListener(){ |
| 921 | + return mTimeClickListener; |
| 922 | + } |
| 923 | + |
| 924 | + public void setHourClickListener(TimeClickListener mTimeClickListener){ |
| 925 | + this.mTimeClickListener = mTimeClickListener; |
| 926 | + } |
| 927 | + |
| 928 | + |
872 | 929 | /**
|
873 | 930 | * Get the number of visible days in a week.
|
874 | 931 | * @return The number of visible days in a week.
|
@@ -1275,6 +1332,11 @@ public interface EventLongPressListener {
|
1275 | 1332 | public void onEventLongPress(WeekViewEvent event, RectF eventRect);
|
1276 | 1333 | }
|
1277 | 1334 |
|
| 1335 | + public interface TimeClickListener { |
| 1336 | + public void onTimeClicked(Calendar time); |
| 1337 | + } |
| 1338 | + |
| 1339 | + |
1278 | 1340 | /////////////////////////////////////////////////////////////////
|
1279 | 1341 | //
|
1280 | 1342 | // Helper methods.
|
|
0 commit comments