Continue fixing issues with calendar widget. Now able to scroll properly without miswrapping

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

@ -8,6 +8,7 @@ import android.graphics.Bitmap;
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.graphics.drawable.BitmapDrawable;
import android.text.format.DateFormat; import android.text.format.DateFormat;
@ -197,45 +198,49 @@ public class CalendarView extends View {
// Month border -- Start // Month border -- Start
RectF rectF = new RectF(); RectF rectF = new RectF();
float monthBorder = MONTH_TEXT_SIZE * density + 10; float monthTitleHeight = (MONTH_TEXT_SIZE + 30) * density;
rectF.set(15, 15, getMeasuredWidth() - 15, monthBorder); rectF.set(15, 15, getMeasuredWidth() - 15, monthTitleHeight);
canvas.drawRoundRect(rectF, CURVE_RADIUS, CURVE_RADIUS, borderPaint); canvas.drawRoundRect(rectF, CURVE_RADIUS, CURVE_RADIUS, borderPaint);
rectF.set(16, 16, getMeasuredWidth() - 16, monthBorder - 1); rectF.set(16, 16, getMeasuredWidth() - 16, monthTitleHeight - 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
Bitmap leftArrow = ((BitmapDrawable)getResources().getDrawable(R.drawable.cal_left)).getBitmap(); Bitmap leftArrow = ((BitmapDrawable)getResources().getDrawable(R.drawable.cal_left)).getBitmap();
leftArrowHeight = (int)(leftArrow.getHeight()); leftArrowHeight = (int)(leftArrow.getHeight()*density);
leftArrowWidth = (int)(leftArrow.getWidth()); leftArrowWidth = (int)(leftArrow.getWidth()*density);
leftArrowX = 24; leftArrowX = 24;
leftArrowY = 8 + (int)((monthBorder / 2 - leftArrowHeight/2)); leftArrowY = 8 + (int)((monthTitleHeight / 2 - leftArrowHeight/2));
canvas.drawBitmap(leftArrow, leftArrowX, leftArrowY, null); canvas.drawBitmap(leftArrow, new Rect(0,0,leftArrow.getWidth(),leftArrow.getHeight()),
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
Bitmap rightArrow = ((BitmapDrawable)getResources().getDrawable(R.drawable.cal_right)).getBitmap(); Bitmap rightArrow = ((BitmapDrawable)getResources().getDrawable(R.drawable.cal_right)).getBitmap();
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() - 24 - (PADDING*3) - rightArrow.getWidth();
rightArrowY = 8 + (int)((monthBorder / 2 - rightArrowHeight/2)); rightArrowY = 8 + (int)((monthTitleHeight / 2 - rightArrowHeight/2));
canvas.drawBitmap(rightArrow, rightArrowX, rightArrowY, null); canvas.drawBitmap(rightArrow, new Rect(0,0,rightArrow.getWidth(),rightArrow.getHeight()),
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) (monthBorder / 2 + MONTH_TEXT_SIZE / 2); int monthY = (int) (monthTitleHeight / 2 + 15);
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
// Day heading -- Start // Day heading -- Start
int dayLeft = 15; int dayLeft = 15;
int dayTop = (int)(getMeasuredHeight() * 0.2) + (PADDING * 2); int dayTop = (int)(monthTitleHeight + PADDING * 2);
boxWidth = (getMeasuredWidth() - 38 - (PADDING*2)) / 7; boxWidth = (getMeasuredWidth() - 38 - (PADDING*2)) / 7;
boxHeight = (int) (((getMeasuredHeight() - (getMeasuredHeight() * 0.2) - 16) - (PADDING * 8)) / 7); boxHeight = (int) (((getMeasuredHeight() - (monthTitleHeight) - 16) - (PADDING * 8)) / 7);
int textX = 0; int textX = 0;
int textY = 0; int textY = 0;
@ -277,7 +282,9 @@ public class CalendarView extends View {
calendar.set(Calendar.DATE, 1); calendar.set(Calendar.DATE, 1);
// offset for day of week // offset for day of week
int firstDayOffset = calendar.get(Calendar.DAY_OF_WEEK) + firstDayOfWeek - Calendar.SUNDAY; int firstDayOfMonth = calendar.get(Calendar.DAY_OF_WEEK) - firstDayOfWeek + Calendar.SUNDAY;
if(firstDayOfMonth == 0)
firstDayOfMonth = 7;
boolean firstTime = true; boolean firstTime = true;
int dayOfMonth = 1; int dayOfMonth = 1;
Paint colorPaint, textPaint; Paint colorPaint, textPaint;
@ -288,7 +295,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 != firstDayOffset) { if (firstTime && j != firstDayOfMonth) {
dayLeft += boxWidth + PADDING; dayLeft += boxWidth + PADDING;
continue; continue;
} }
@ -346,19 +353,11 @@ public class CalendarView extends View {
&& (y > 5 && y < (leftArrowY * 2))) { && (y > 5 && y < (leftArrowY * 2))) {
Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
calendar.setTime(calendarDate); calendar.setTime(calendarDate);
calendar.add(-1, Calendar.MONTH); int currentDay = calendar.get(Calendar.DATE);
int prevDay = calendar.get(Calendar.DAY_OF_MONTH); calendar.set(Calendar.DATE, 1);
calendar.set(1, Calendar.DAY_OF_MONTH); calendar.add(Calendar.MONTH, -1);
int lastDay = calendar.getActualMaximum(Calendar.DATE);
int currentMonth = calendar.get(Calendar.MONTH); calendar.set(Calendar.DATE, Math.min(currentDay, lastDay));
if (currentMonth == Calendar.JANUARY) {
calendar.set(Calendar.MONTH, Calendar.DECEMBER);
calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) - 1);
} else {
calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - 1);
}
int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
calendar.set(Math.min(prevDay, lastDay), Calendar.DAY_OF_MONTH);
calendarDate = calendar.getTime(); calendarDate = calendar.getTime();
currentHighlightDay = calendar.get(Calendar.DATE); currentHighlightDay = calendar.get(Calendar.DATE);
this.invalidate(); this.invalidate();
@ -366,18 +365,11 @@ public class CalendarView extends View {
&& (y > 5 && y < (rightArrowY * 2))) { && (y > 5 && y < (rightArrowY * 2))) {
Calendar calendar = Calendar.getInstance(); Calendar calendar = Calendar.getInstance();
calendar.setTime(calendarDate); calendar.setTime(calendarDate);
int prevDay = calendar.get(Calendar.DAY_OF_MONTH); int currentDay = calendar.get(Calendar.DATE);
calendar.set(1, Calendar.DAY_OF_MONTH); calendar.set(Calendar.DATE, 1);
calendar.add(Calendar.MONTH, 1);
int currentMonth = calendar.get(Calendar.MONTH); int lastDay = calendar.getActualMaximum(Calendar.DATE);
if (currentMonth == Calendar.DECEMBER) { calendar.set(Calendar.DATE, Math.min(currentDay, lastDay));
calendar.set(Calendar.MONTH, Calendar.JANUARY);
calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) + 1);
} else {
calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) + 1);
}
int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
calendar.set(Math.min(prevDay, lastDay), Calendar.DAY_OF_MONTH);
calendarDate = calendar.getTime(); calendarDate = calendar.getTime();
currentHighlightDay = calendar.get(Calendar.DATE); currentHighlightDay = calendar.get(Calendar.DATE);
this.invalidate(); this.invalidate();

Loading…
Cancel
Save