More fixes to calendar

pull/14/head
Tim Su 15 years ago
parent 8f447e4870
commit 8fe7255ba2

Binary file not shown.

After

Width:  |  Height:  |  Size: 955 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 930 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 655 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 676 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 718 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 714 B

@ -1,17 +1,15 @@
package com.todoroo.astrid.ui; package com.todoroo.astrid.ui;
import java.io.InputStream;
import java.util.Calendar; import java.util.Calendar;
import java.util.Date; import java.util.Date;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF; import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.text.format.DateFormat; import android.text.format.DateFormat;
import android.text.format.DateUtils; import android.text.format.DateUtils;
import android.util.AttributeSet; import android.util.AttributeSet;
@ -34,7 +32,8 @@ public class CalendarView extends View {
private Paint borderRightAlignPaint; private Paint borderRightAlignPaint;
private Paint backColorPaint; private Paint backColorPaint;
private Paint whiteCenterAlignLargePaint; private Paint whiteCenterAlignLargePaint;
private Paint whiteRightAlignPaint; private Paint darkRightAlignPaint;
private Paint todayCalendarPaint;
private Paint dayPaint; private Paint dayPaint;
private Paint calendarPaint; private Paint calendarPaint;
private float density; private float density;
@ -114,11 +113,15 @@ public class CalendarView extends View {
whiteCenterAlignLargePaint.setTextAlign(Paint.Align.CENTER); whiteCenterAlignLargePaint.setTextAlign(Paint.Align.CENTER);
whiteCenterAlignLargePaint.setTextSize(MONTH_TEXT_SIZE * density); whiteCenterAlignLargePaint.setTextSize(MONTH_TEXT_SIZE * density);
whiteRightAlignPaint = new Paint(); darkRightAlignPaint = new Paint();
whiteRightAlignPaint.setAntiAlias(true); darkRightAlignPaint.setAntiAlias(true);
whiteRightAlignPaint.setColor(Color.rgb(40, 40, 40)); darkRightAlignPaint.setColor(Color.rgb(40, 40, 40));
whiteRightAlignPaint.setTextAlign(Paint.Align.RIGHT); darkRightAlignPaint.setTextAlign(Paint.Align.RIGHT);
whiteRightAlignPaint.setTextSize(TEXT_SIZE * density); darkRightAlignPaint.setTextSize(TEXT_SIZE * density);
todayCalendarPaint = new Paint();
todayCalendarPaint.setAntiAlias(true);
todayCalendarPaint.setColor(Color.rgb(222, 221, 154));
backColorPaint = new Paint(); backColorPaint = new Paint();
backColorPaint.setAntiAlias(true); backColorPaint.setAntiAlias(true);
@ -194,41 +197,35 @@ public class CalendarView extends View {
// Month border -- Start // Month border -- Start
RectF rectF = new RectF(); RectF rectF = new RectF();
rectF.set(15, 15, getMeasuredWidth() - 15, (int)(getMeasuredHeight() * 0.2)); // 20% height is given to month border float monthBorder = MONTH_TEXT_SIZE * density + 10;
rectF.set(15, 15, getMeasuredWidth() - 15, monthBorder);
canvas.drawRoundRect(rectF, CURVE_RADIUS, CURVE_RADIUS, borderPaint); canvas.drawRoundRect(rectF, CURVE_RADIUS, CURVE_RADIUS, borderPaint);
rectF.set(16, 16, getMeasuredWidth() - 16, (int)(getMeasuredHeight() * 0.2) - 1); rectF.set(16, 16, getMeasuredWidth() - 16, monthBorder - 1);
// canvas.drawRoundRect(rectF, CURVE_RADIUS, CURVE_RADIUS, backColorPaint); // canvas.drawRoundRect(rectF, CURVE_RADIUS, CURVE_RADIUS, backColorPaint);
// Month border -- end // Month border -- end
// Month left arrow -- Start // Month left arrow -- Start
InputStream is = getResources().openRawResource(R.drawable.leftarrow); Bitmap leftArrow = ((BitmapDrawable)getResources().getDrawable(R.drawable.cal_left)).getBitmap();
Bitmap leftArrow = BitmapFactory.decodeStream(is); leftArrowHeight = (int)(leftArrow.getHeight());
leftArrowWidth = (int)(leftArrow.getWidth());
leftArrowHeight = (int)(leftArrow.getHeight() * density);
leftArrowWidth = (int)(leftArrow.getWidth() * density);
leftArrowX = 24; leftArrowX = 24;
leftArrowY = 8 + (int)((getMeasuredHeight() * 0.2 / 2) - (leftArrowHeight/2)); leftArrowY = 8 + (int)((monthBorder / 2 - leftArrowHeight/2));
canvas.drawBitmap(leftArrow, new Rect(0,0,leftArrow.getWidth(),leftArrow.getHeight()), canvas.drawBitmap(leftArrow, leftArrowX, leftArrowY, null);
new Rect(leftArrowX, leftArrowY, leftArrowX + leftArrowWidth,
leftArrowY + leftArrowHeight), null);
// Month left arrow -- End // Month left arrow -- End
// Month right arrow -- Start // Month right arrow -- Start
is = getResources().openRawResource(R.drawable.rightarrow); Bitmap rightArrow = ((BitmapDrawable)getResources().getDrawable(R.drawable.cal_right)).getBitmap();
Bitmap rightArrow = BitmapFactory.decodeStream(is); rightArrowHeight = (int)(rightArrow.getHeight());
rightArrowHeight = (int)(rightArrow.getHeight() * density); rightArrowWidth = (int)(rightArrow.getWidth());
rightArrowWidth = (int)(rightArrow.getWidth() * density);
rightArrowX = getMeasuredWidth() - 16 - (PADDING*3) - rightArrow.getWidth(); rightArrowX = getMeasuredWidth() - 16 - (PADDING*3) - rightArrow.getWidth();
rightArrowY = 8 + (int)((getMeasuredHeight() * 0.2 / 2) - (rightArrowHeight/2)); rightArrowY = 8 + (int)((monthBorder / 2 - rightArrowHeight/2));
canvas.drawBitmap(rightArrow, new Rect(0,0,rightArrow.getWidth(),rightArrow.getHeight()), canvas.drawBitmap(rightArrow, rightArrowX, rightArrowY, null);
new Rect(rightArrowX, rightArrowY, rightArrowX + rightArrowWidth,
rightArrowY + rightArrowHeight), null);
// Month right arrow -- End // Month right arrow -- End
// Month text -- Start // Month text -- Start
int monthX = getMeasuredWidth() / 2; int monthX = getMeasuredWidth() / 2;
int monthY = (int) (getMeasuredHeight() * 0.2 / 2) + 14; int monthY = (int) (monthBorder / 2 + MONTH_TEXT_SIZE / 2);
String monthYear = (String) DateFormat.format("MMMM yyyy", calendarDate); //$NON-NLS-1$ String monthYear = (String) DateFormat.format("MMMM yyyy", calendarDate); //$NON-NLS-1$
canvas.drawText(monthYear, monthX, monthY, whiteCenterAlignLargePaint); canvas.drawText(monthYear, monthX, monthY, whiteCenterAlignLargePaint);
// Month text -- End // Month text -- End
@ -259,7 +256,7 @@ public class CalendarView extends View {
textX = dayLeft + boxWidth - PADDING * 2; textX = dayLeft + boxWidth - PADDING * 2;
textY = dayTop + (boxHeight - boxHeight/8) - PADDING * 2; textY = dayTop + (boxHeight - boxHeight/8) - PADDING * 2;
canvas.drawText(day, textX, textY, whiteRightAlignPaint); canvas.drawText(day, textX, textY, darkRightAlignPaint);
dayLeft += boxWidth + PADDING; dayLeft += boxWidth + PADDING;
} }
@ -271,12 +268,16 @@ public class CalendarView extends View {
if (currentHighlightDay == -1) { if (currentHighlightDay == -1) {
currentHighlightDay = calendar.get(Calendar.DATE); currentHighlightDay = calendar.get(Calendar.DATE);
} }
int today = -1;
Calendar todayCalendar = Calendar.getInstance();
if(calendar.get(Calendar.MONTH) == todayCalendar.get(Calendar.MONTH) &&
calendar.get(Calendar.YEAR) == todayCalendar.get(Calendar.YEAR))
today = todayCalendar.get(Calendar.DATE);
int lastDateOfThisMonth = calendar.getActualMaximum(Calendar.DATE); int lastDateOfThisMonth = calendar.getActualMaximum(Calendar.DATE);
calendar.set(Calendar.DATE, 1); calendar.set(Calendar.DATE, 1);
// offset for day of week // offset for day of week
calendar.add(Calendar.DATE, firstDayOfWeek - Calendar.SUNDAY); int firstDayOffset = calendar.get(Calendar.DAY_OF_WEEK) + firstDayOfWeek - Calendar.SUNDAY;
int firstDay = calendar.get(Calendar.DAY_OF_WEEK);
boolean firstTime = true; boolean firstTime = true;
int dayOfMonth = 1; int dayOfMonth = 1;
Paint colorPaint, textPaint; Paint colorPaint, textPaint;
@ -287,7 +288,7 @@ public class CalendarView extends View {
dayLeft = 15; dayLeft = 15;
dayTop += boxHeight + PADDING; dayTop += boxHeight + PADDING;
for (int j = 1; j <= 7; j++) { for (int j = 1; j <= 7; j++) {
if (firstTime && j != firstDay) { if (firstTime && j != firstDayOffset) {
dayLeft += boxWidth + PADDING; dayLeft += boxWidth + PADDING;
continue; continue;
} }
@ -296,11 +297,14 @@ public class CalendarView extends View {
if (dayOfMonth <= lastDateOfThisMonth) { if (dayOfMonth <= lastDateOfThisMonth) {
if (currentHighlightDay == dayOfMonth) { if (currentHighlightDay == dayOfMonth) {
colorPaint = whiteRightAlignPaint; colorPaint = darkRightAlignPaint;
textPaint = borderRightAlignPaint; textPaint = borderRightAlignPaint;
} else if(today == dayOfMonth) {
colorPaint = todayCalendarPaint;
textPaint = darkRightAlignPaint;
} else { } else {
colorPaint = calendarPaint; colorPaint = calendarPaint;
textPaint = whiteRightAlignPaint; textPaint = darkRightAlignPaint;
} }
dayLeftArr[dayOfMonth-1] = dayLeft; dayLeftArr[dayOfMonth-1] = dayLeft;
dayTopArr[dayOfMonth-1] = dayTop; dayTopArr[dayOfMonth-1] = dayTop;
@ -338,50 +342,46 @@ public class CalendarView extends View {
private void performClick(int x, int y) { private void performClick(int x, int y) {
// System.out.println("---------------------Current x, y : " + x + ", " + y); // System.out.println("---------------------Current x, y : " + x + ", " + y);
// Handle left-right arrow click -- start // Handle left-right arrow click -- start
if ((x > leftArrowX && x < (leftArrowX + leftArrowWidth * 2)) if ((x > leftArrowX && x < (leftArrowX + leftArrowWidth * 2))
&& (y > 5 && y < (leftArrowY * 2))) { && (y > 5 && y < (leftArrowY * 2))) {
Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
calendar.setTime(calendarDate); calendar.setTime(calendarDate);
int prevMonth = calendar.get(Calendar.MONTH); calendar.add(-1, Calendar.MONTH);
int prevDay = calendar.get(Calendar.DAY_OF_MONTH);
int currentMonth = calendar.get(Calendar.MONTH); calendar.set(1, Calendar.DAY_OF_MONTH);
if (currentMonth == Calendar.JANUARY) {
calendar.set(Calendar.MONTH, Calendar.DECEMBER); int currentMonth = calendar.get(Calendar.MONTH);
calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) - 1); if (currentMonth == Calendar.JANUARY) {
} else { calendar.set(Calendar.MONTH, Calendar.DECEMBER);
calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1); calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) - 1);
} } else {
calendarDate = calendar.getTime(); calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1);
calendar.setTime(calendarDate); }
if (prevMonth == calendar.get(Calendar.MONTH)) { int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1); calendar.set(Math.min(prevDay, lastDay), Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DATE, 1); calendarDate = calendar.getTime();
calendarDate = calendar.getTime(); currentHighlightDay = calendar.get(Calendar.DATE);
} this.invalidate();
currentHighlightDay = calendar.get(Calendar.DATE); } else if ((x > rightArrowX - rightArrowWidth && x < (rightArrowX + rightArrowWidth))
this.invalidate(); && (y > 5 && y < (rightArrowY * 2))) {
} else if ((x > rightArrowX - rightArrowWidth && x < (rightArrowX + rightArrowWidth)) Calendar calendar = Calendar.getInstance();
&& (y > 5 && y < (rightArrowY * 2))) { calendar.setTime(calendarDate);
Calendar calendar = Calendar.getInstance(); int prevDay = calendar.get(Calendar.DAY_OF_MONTH);
calendar.setTime(calendarDate); calendar.set(1, Calendar.DAY_OF_MONTH);
int prevMonth = calendar.get(Calendar.MONTH);
int currentMonth = calendar.get(Calendar.MONTH);
int currentMonth = calendar.get(Calendar.MONTH); if (currentMonth == Calendar.DECEMBER) {
if (currentMonth == Calendar.DECEMBER) { calendar.set(Calendar.MONTH, Calendar.JANUARY);
calendar.set(Calendar.MONTH, Calendar.JANUARY); calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) + 1);
calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) + 1); } else {
} else { calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + 1);
calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + 1); }
} int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
calendarDate = calendar.getTime(); calendar.set(Math.min(prevDay, lastDay), Calendar.DAY_OF_MONTH);
if (prevMonth == calendar.get(Calendar.MONTH)) { calendarDate = calendar.getTime();
calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1); currentHighlightDay = calendar.get(Calendar.DATE);
calendar.set(Calendar.DATE, 1); this.invalidate();
calendarDate = calendar.getTime(); // Handle left-right arrow click -- end
}
currentHighlightDay = calendar.get(Calendar.DATE);
this.invalidate();
// Handle left-right arrow click -- end
} else { } else {
// Check if clicked on date // Check if clicked on date
for (int i=0; i<dayLeftArr.length; i++) { for (int i=0; i<dayLeftArr.length; i++) {

Loading…
Cancel
Save