package com.chinaece.gaia.calendar;
import java.util.Calendar;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import com.chinaece.gaia.gui.CalendarActivity;
public class CalendarView extends View {
private GetCalendar getCalendar;
public static final int INVALID_POSITION = -1;
private int leftPadding = 0;
private int topPadding = 100;
private int rowPadding;
private int colPadding;
private int year;
private int month;
private int day;
private int hour;
private int minite;
private int second;
private String startTime,endTime;
public String getStartTime() {
return startTime;
}
public String getEndTime() {
return endTime;
}
private Calendar cal = Calendar.getInstance();
public Calendar getCal() {
return cal;
}
private Calendar today = (Calendar) cal.clone();
private GestureDetector mGestureDetector;
Calendar calendar1 = Calendar.getInstance();
int hour1 = calendar1.get(Calendar.HOUR_OF_DAY);
int minute1 = calendar1.get(Calendar.MINUTE);
int week = calendar1.get(Calendar.DAY_OF_WEEK);
public CalendarView(Context context) {
super(context);
setFocusable(true);
setFocusableInTouchMode(true);
mGestureDetector = new GestureDetector(
new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
if (e1.getX() > e2.getX()) {
cal.add(Calendar.WEEK_OF_YEAR, 1);
int fyear = cal.get(Calendar.YEAR);
int fmonth = cal.get(Calendar.MONTH);
int fday = cal.get(Calendar.DATE);
int monthcount = getMonthDays(fyear,fmonth);
int amonthcount = agetMonthDays(fyear, fmonth-1);
int start = 0,end = 0;
int mmonth = fmonth,myear = fyear;
int dayofweek = cal.get(Calendar.DAY_OF_WEEK);
start = fday+1-dayofweek;
if(start > monthcount){
mmonth = mmonth+1;
start = start-monthcount;
}
if(start <= 0){
mmonth = mmonth-1;
if(mmonth-1 == 0){
myear = myear -1 ;
}
start = start + amonthcount;
}
end = fday+7-dayofweek;
if(end > monthcount){
mmonth = mmonth+1;
end = start-monthcount;
}
if(end <= 0){
mmonth = mmonth-1;
if(mmonth-1 == 0){
myear = myear -1 ;
}
end = end + amonthcount;
}
String mstartTime = myear+"-"+(mmonth+1)+"-"+start+" "+"00:00:00";
String mendTime = myear+"-"+(mmonth+1)+"-"+end+" "+"23:59:59";
CalendarView.this.invalidate();
getCalendar.getCalendar(mstartTime, mendTime);
}
if (e1.getX() < e2.getX()) {
cal.add(Calendar.WEEK_OF_YEAR, -1);
int fyear = cal.get(Calendar.YEAR);
int fmonth = cal.get(Calendar.MONTH);
int fday = cal.get(Calendar.DATE);
int monthcount = getMonthDays(fyear,fmonth);
int amonthcount = agetMonthDays(fyear, fmonth-1);
int start = 0,end = 0;
int mmonth = fmonth,myear = fyear;
int dayofweek = cal.get(Calendar.DAY_OF_WEEK);
start = fday+1-dayofweek;
if(start > monthcount){
mmonth = mmonth+1;
start = start-monthcount;
}
if(start <= 0){
mmonth = mmonth-1;
if(mmonth-1 == 0){
myear = myear -1 ;
}
start = start + amonthcount;
}
end = fday+7-dayofweek;
if(end > monthcount){
mmonth = mmonth+1;
end = start-monthcount;
}
if(end <= 0){
mmonth = mmonth-1;
if(mmonth-1 == 0){
myear = myear -1 ;
}
end = end + amonthcount;
}
String estartTime = myear+"-"+(mmonth+1)+"-"+start+" "+"00:00:00";
String eendTime = myear+"-"+(mmonth+1)+"-"+end+" "+"23:59:59";
CalendarView.this.invalidate();
getCalendar.getCalendar(estartTime, eendTime);
}
return true;
}
});
}
public CalendarView(Context context,AttributeSet attrs) {
super(context,attrs);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
colPadding = (w -leftPadding)/ 8;
rowPadding = (h - topPadding) /25;
}
@Override
protected void onDraw(Canvas canvas) {
Paint cPaint;
Paint tPaint;
Paint bPaint;
Paint yPaint;
Paint lPaint;
cPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
cPaint.setStyle(Paint.Style.FILL_AND_STROKE);
cPaint.setColor(Color.RED);
cPaint.setTextSize(18);
tPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
tPaint.setStyle(Paint.Style.FILL_AND_STROKE);
tPaint.setColor(Color.BLACK);
tPaint.setTextSize(20);
bPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
bPaint.setStyle(Paint.Style.FILL_AND_STROKE);
bPaint.setColor(Color.WHITE);
bPaint.setTextSize(20f);
yPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
yPaint.setStyle(Paint.Style.FILL_AND_STROKE);
yPaint.setColor(Color.BLACK);
yPaint.setTextSize(25f);
lPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
lPaint.setStyle(Paint.Style.FILL_AND_STROKE);
lPaint.setColor(Color.BLACK);
lPaint.setStrokeWidth(2);
year = cal.get(Calendar.YEAR);
month = cal.get(Calendar.MONTH);
day = cal.get(Calendar.DATE);
hour = cal.get(Calendar.HOUR);
minite = cal.get(Calendar.MINUTE);
second = cal.get(Calendar.SECOND);
canvas.drawColor(Color.WHITE);
float right = canvas.getWidth() - leftPadding;
float bottom = canvas.getHeight() - topPadding;
String months = String.valueOf(month+1);
String yearMonth = year + "年" + months + "月";
canvas.drawText(yearMonth, (colPadding * 7) / 2 - 35, 50, yPaint);
String[] weekStr = new String[] { "周日","周一", "周二", "周三", "周四", "周五", "周六" };
for (int i = 0; i < weekStr.length; i++) {
canvas.drawText(weekStr[i], (float) (leftPadding + ((float)i+1.1) * colPadding),
(float) (topPadding + rowPadding*0.4), tPaint);
}
canvas.drawLine(leftPadding, topPadding,right, topPadding,lPaint);
for (int i = 0; i < 24; i++) {
String str = String.valueOf(i)+":00";
canvas.drawText(str, leftPadding+2,
(float) (topPadding+ (i+1.6) * rowPadding), tPaint);
canvas.drawLine(leftPadding, topPadding + (i+1) * rowPadding,
right, topPadding + (i+1) * rowPadding,lPaint);
}
for (int i=0; i<8;i++){
canvas.drawLine((float) (leftPadding + (i+1) * colPadding), topPadding,
leftPadding + (i+1) * colPadding, 2000, lPaint);
}
Paint dpaint = new Paint();
dpaint.setColor(Color.RED);
dpaint.setAlpha(50);
if(cal.equals(today)){
canvas.drawRect(canvas.getWidth()/8*(week), 2000/25+topPadding-5, canvas.getWidth()/8*(week+1),((float)1900/25*(hour1+1))+((float)1900/25/60)*minute1+topPadding, dpaint);
}
int monthcount = getMonthDays(year,month);
int amonthcount = agetMonthDays(year, month-1);
int week = cal.get(Calendar.WEEK_OF_MONTH);
int dateinfo = day;
int start = 0,end = 0;
int mmonth = month,myear = year;
int dayofweek = cal.get(Calendar.DAY_OF_WEEK);
start = day+1-dayofweek;
if(start > monthcount){
mmonth = mmonth+1;
start = start-monthcount;
}
if(start <= 0){
mmonth = mmonth-1;
if(mmonth-1 == 0){
myear = myear -1 ;
}
start = start + amonthcount;
}
end = day+7-dayofweek;
if(end > monthcount){
mmonth = mmonth+1;
end = start-monthcount;
}
if(end <= 0){
mmonth = mmonth-1;
if(mmonth-1 == 0){
myear = myear -1 ;
}
end = end + amonthcount;
}
startTime = myear+"-"+(mmonth+1)+"-"+start+" "+"00:00:00";
if(end<start){
endTime = myear+"-"+(mmonth+2)+"-"+end+" "+"23:59:59";
}else{
endTime = myear+"-"+(mmonth+1)+"-"+end+" "+"23:59:59";
}
for(int i = 1; i<8;i++)
{
dateinfo = day + i - dayofweek;
if (dateinfo > monthcount){
mmonth = mmonth+1;
dateinfo = dateinfo - monthcount;
}
if (dateinfo <= 0){
mmonth = mmonth-1;
if(mmonth-1 == 0){
myear = myear -1 ;
}
dateinfo = dateinfo + amonthcount;
}
double dx = leftPadding + (i+0.2) * colPadding;
double dy = topPadding + rowPadding*0.9;
if (cal.equals(today)) {
canvas.drawText(dateinfo + "", (float) dx, (float) dy, cPaint);
} else {
canvas.drawText(dateinfo + "", (float) dx, (float) dy, tPaint);
}
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(CalendarActivity.width, 2000);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
mGestureDetector.onTouchEvent(event);
return true;
}
private int getMonthDays(int year, int mon)
{
mon++;
switch (mon)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
{
return 31;
}
case 4:
case 6:
case 9:
case 11:
{
return 30;
}
case 2:
{
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
return 29;
else
return 28;
}}
return 0;
}
public void setGetCalendar(GetCalendar getCalendar) {
this.getCalendar = getCalendar;
}
private int agetMonthDays(int year, int mon)
{
mon++;
if(mon == 0){
mon = 12;
}
switch (mon)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
{
return 31;
}
case 4:
case 6:
case 9:
case 11:
{
return 30;
}
case 2:
{
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
return 29;
else
return 28;
}}
return 0;
}
}