实现效果图
只分析一下怎样自己画出这个View
public class DayHeader extends View {
// fields
private final static int iDayHeaderFontSize = 12;
// fields
private Paint pt = new Paint();
private RectF rect = new RectF();
private int iWeekDay = -1;
private boolean bHoliday = false;
// methods
public DayHeader(Context context, int iWidth, int iHeight) {
super(context);
setLayoutParams(new LayoutParams(iWidth, iHeight));
}
public void setData(int iWeekDay) {
this.iWeekDay = iWeekDay;
this.bHoliday = false;
if ((iWeekDay == Calendar.SATURDAY) || (iWeekDay == Calendar.SUNDAY))
this.bHoliday = true;
}
private void drawDayHeader(Canvas canvas) {
if (iWeekDay != -1) {
// background
pt.setColor(DayStyle.getColorFrameHeader(bHoliday));//周未
canvas.drawRect(rect, pt);
// text
pt.setTypeface(null);
pt.setTextSize(iDayHeaderFontSize);
pt.setAntiAlias(true);
pt.setFakeBoldText(true);
pt.setColor(DayStyle.getColorTextHeader(bHoliday));
final int iTextPosY = getTextHeight();
final String sDayName = DayStyle.getWeekDayName(iWeekDay);
// draw day name
final int iDayNamePosX = (int) rect.left
+ ((int) rect.width() >> 1)
- ((int) pt.measureText(sDayName) >> 1);
canvas.drawText(sDayName, iDayNamePosX, rect.top + iTextPosY + 2,
pt);
}
}
private int getTextHeight() {
return (int) (-pt.ascent() + pt.descent());
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// init rectangles
rect.set(0, 0, this.getWidth(), this.getHeight());
rect.inset(1, 1);
// drawing
drawDayHeader(canvas);
}
}
这是日历上面的显示星期几的单元格,在主界面代码里循环调用7次。
public class DayStyle {
// methods
private static String[] getWeekDayNames() {
String[] vec = new String[10];
vec[Calendar.SUNDAY] = "Sun";
vec[Calendar.MONDAY] = "Mon";
vec[Calendar.TUESDAY] = "Tue";
vec[Calendar.WEDNESDAY] = "Wed";
vec[Calendar.THURSDAY] = "Thu";
vec[Calendar.FRIDAY] = "Fri";
vec[Calendar.SATURDAY] = "Sat";
return vec;
}
public static String getWeekDayName(int iDay) {
return vecStrWeekDayNames[iDay];
}
// fields
private final static String[] vecStrWeekDayNames = getWeekDayNames();
// fields
public final static int iColorFrameHeader = 0xffEDEDED;
public final static int iColorFrameHeaderHoliday = 0xffEDEDED;
public final static int iColorTextHeader = 0xff8c8c8c;
public final static int iColorTextHeaderHoliday = 0xff8c8c8c;
public final static int iColorText = 0xff8c8c8c;
public final static int iColorBkg = 0xffeaeaea;
public final static int iColorTextHoliday = 0xff8c8c8c;
public final static int iColorBkgHoliday = 0xffeaeaea;
public final static int iColorTextToday = 0xfffcffff;
public final static int iColorBkgToday = 0xff225599;
public final static int iColorTextSelected = 0xfffcffff;
public final static int iColorBkgSelectedLight = 0xffbbddff;
public final static int iColorBkgSelectedDark = 0xff225599;
public final static int iColorTextFocused = 0xff666666;
public final static int iColorBkgFocusLight = 0xffffddbb;
public final static int iColorBkgFocusDark = 0xffaa5500;
public final static int iColorBkgNotCurMonth = 0xfff4f4f4;
public final static int iColorTextNotCurMonth = 0xffd3d3d3;
// methods
public static int getColorFrameHeader(boolean bHoliday) {
if (bHoliday)
return iColorFrameHeaderHoliday;
return iColorFrameHeader;
}
public static int getColorTextHeader(boolean bHoliday) {
if (bHoliday)
return iColorTextHeaderHoliday;
return iColorTextHeader;
}
public static int getColorText(boolean bHoliday, boolean bToday) {
if (bToday)
return iColorTextToday;
if (bHoliday)
return iColorTextHoliday;
return iColorText;
}
public static int getColorBkg(boolean bHoliday, boolean bToday) {
if (bToday)
return iColorBkgToday;
if (bHoliday)
return iColorBkgHoliday;
return iColorBkg;
}
public static int getWeekDay(int index, int iFirstDayOfWeek) {
int iWeekDay = -1;
if (iFirstDayOfWeek == Calendar.MONDAY) {
iWeekDay = index + Calendar.MONDAY;
if (iWeekDay > Calendar.SATURDAY)
iWeekDay = Calendar.SUNDAY;
}
if (iFirstDayOfWeek == Calendar.SUNDAY) {
iWeekDay = index + Calendar.SUNDAY;
}
return iWeekDay;
}
}
这里定义Cell和DayHeader里用到的一些常量和颜色值,最主要的是Cell里,画出每一天的单元格
public class Cell extends View{
public interface OnItemClick {
public void OnClick(Cell item);
}
public static int ANIM_ALPHA_DURATION = 100;
float fTextSize = 22;
private final static int iMargin = 1;
private final static int iAlphaInactiveMonth = 0x50;
private int iDateYear = 0;
private int iDateMonth = 0;
private int iDateDay = 0;
private OnItemClick itemClick = null;
private Paint pt = new Paint();
private RectF rect = new RectF();
private String sDate = "";
private boolean bSelected = false;
boolean bIsActiveMonth = false;
private boolean bToday = false;
private boolean bHoliday = false;
private boolean bTouchedDown = false;
public Cell(Context context, int iWidth, int iHeight) {
super(context);
setFocusable(true);
setLayoutParams(new LayoutParams(iWidth, iHeight));
}
public boolean getSelected() {
return this.bSelected;
}
public void setSelected(boolean bEnable) {
if (this.bSelected != bEnable) {
this.bSelected = bEnable;
this.invalidate();
}
}
public void settextsize(float value){
this.fTextSize=value;
}
public void setData(int iYear, int iMonth, int iDay, boolean bToday,
boolean bHoliday, int iActiveMonth) {
iDateYear = iYear;
iDateMonth = iMonth;
iDateDay = iDay;
this.sDate = Integer.toString(iDateDay);
this.bIsActiveMonth = (iDateMonth == iActiveMonth);
this.bToday = bToday;
this.bHoliday = bHoliday;
}
public void setItemClick(OnItemClick itemClick) {
this.itemClick = itemClick;
}
private int getTextHeight() {
return (int) (-pt.ascent() + pt.descent());
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
boolean bResult = super.onKeyDown(keyCode, event);
if ((keyCode == KeyEvent.KEYCODE_DPAD_CENTER)
|| (keyCode == KeyEvent.KEYCODE_ENTER)) {
doItemClick();
}
return bResult;
}
public boolean onKeyUp(int keyCode, KeyEvent event) {
boolean bResult = super.onKeyUp(keyCode, event);
return bResult;
}
public void doItemClick() {
if (itemClick != null)
itemClick.OnClick(this);
}
protected void onFocusChanged(boolean gainFocus, int direction,
Rect previouslyFocusedRect) {
super.onFocusChanged(gainFocus, direction, previouslyFocusedRect);
invalidate();
}
public Calendar getDate() {
Calendar calDate = Calendar.getInstance();
calDate.clear();
calDate.set(Calendar.YEAR, iDateYear);
calDate.set(Calendar.MONTH, iDateMonth);
calDate.set(Calendar.DAY_OF_MONTH, iDateDay);
return calDate;
}
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// init rectangles
rect.set(0, 0, this.getWidth(), this.getHeight());
rect.inset(1, 1);
// drawing
final boolean bFocused = IsViewFocused();
drawDayView(canvas, bFocused);
drawDayNumber(canvas, bFocused);
}
private void drawDayView(Canvas canvas, boolean bFocused) {
if (bSelected || bFocused) {
LinearGradient lGradBkg = null;
if (bFocused) {
lGradBkg = new LinearGradient(rect.left, 0, rect.right, 0,
DayStyle.iColorBkgFocusDark,
DayStyle.iColorBkgFocusLight, Shader.TileMode.CLAMP);
}
if (bSelected) {
lGradBkg = new LinearGradient(rect.left, 0, rect.right, 0,
DayStyle.iColorBkgSelectedDark,
DayStyle.iColorBkgSelectedLight, Shader.TileMode.CLAMP);
}
if (lGradBkg != null) {
pt.setShader(lGradBkg);
canvas.drawRect(rect, pt);
}
pt.setShader(null);
} else {
pt.setColor(DayStyle.getColorBkg(bHoliday, bToday));
if (!bIsActiveMonth)
// pt.setAlpha(iAlphaInactiveMonth);
pt.setColor(DayStyle.iColorBkgNotCurMonth);
canvas.drawRect(rect, pt);
}
}
public void drawDayNumber(Canvas canvas, boolean bFocused) {
// draw day number
pt.setTypeface(null);
pt.setAntiAlias(true);
pt.setShader(null);
pt.setFakeBoldText(true);
pt.setTextSize(fTextSize);
pt.setUnderlineText(false);
if (bToday)
pt.setUnderlineText(true);
int iTextPosX = (int) rect.right - (int) pt.measureText(sDate);
int iTextPosY = (int) rect.bottom + (int) (-pt.ascent())
- getTextHeight();
iTextPosX -= ((int) rect.width() >> 1)
- ((int) pt.measureText(sDate) >> 1);
iTextPosY -= ((int) rect.height() >> 1) - (getTextHeight() >> 1);
// draw text
if (bSelected || bFocused) {
if (bSelected)
pt.setColor(DayStyle.iColorTextSelected);
if (bFocused)
pt.setColor(DayStyle.iColorTextFocused);
} else {
pt.setColor(DayStyle.getColorText(bHoliday, bToday));
}
if (!bIsActiveMonth)
pt.setColor(DayStyle.iColorTextNotCurMonth);
// pt.setAlpha(iAlphaInactiveMonth);
canvas.drawText(sDate, iTextPosX, iTextPosY + iMargin, pt);
pt.setUnderlineText(false);
}
public boolean IsViewFocused() {
return (this.isFocused() || bTouchedDown);
}
public boolean onTouchEvent(MotionEvent event) {
boolean bHandled = false;
if (event.getAction() == MotionEvent.ACTION_DOWN) {
bHandled = true;
bTouchedDown = true;
invalidate();
startAlphaAnimIn(Cell.this);
}
if (event.getAction() == MotionEvent.ACTION_CANCEL) {
bHandled = true;
bTouchedDown = false;
invalidate();
}
if (event.getAction() == MotionEvent.ACTION_UP) {
bHandled = true;
bTouchedDown = false;
invalidate();
doItemClick();
}
return bHandled;
}
public static void startAlphaAnimIn(View view) {
AlphaAnimation anim = new AlphaAnimation(0.5F, 1);
anim.setDuration(ANIM_ALPHA_DURATION);
anim.startNow();
view.startAnimation(anim);
}
}
在主界面里
calendarLL = (LinearLayout) findViewById(R.id.calendar);
generateCalendar(calendarLL);
private void generateCalendar(LinearLayout layContent) {
layContent.addView(generateCalendarHeader());
days.clear();
for (int iRow = 0; iRow < 6; iRow++) {
layContent.addView(generateCalendarRow());
}
}
private View generateCalendarHeader() {
LinearLayout layRow = createLayout(LinearLayout.HORIZONTAL);
for (int iDay = 0; iDay < 7; iDay++) {
DayHeader day = new DayHeader(this, iDayCellWidth, iDayHeaderHeight);
final int iWeekDay = DayStyle.getWeekDay(iDay, iFirstDayOfWeek);
day.setData(iWeekDay);
layRow.addView(day);
}
return layRow;
}
private View generateCalendarRow() {
LinearLayout layRow = createLayout(LinearLayout.HORIZONTAL);
for (int iDay = 0; iDay < 7; iDay++) {
Cell dayCell = new Cell(this, iDayCellWidth, iDayCellHeight);
dayCell.setItemClick(mOnDayCellClick);
days.add(dayCell);
layRow.addView(dayCell);
}
return layRow;
}
这是主要代码,画星期几是generateCalendarHeader方法,画每一天是generateCalendarRow方法。
全部代码有点多可以去 日历项目下载,如果只要这一页代码说一声我也可以贴出来