android画日历

package cn.calendar;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;

public class CalendarView extends View {

	static public class DateRect {
		private int x;
		private int y;
		private int day;

		public static int rectSize = 20;

		public static int diff = 10;

		public DateRect(int x, int y, int day) {
			super();
			this.x = x;
			this.y = y;
			this.day = day;
		}

		public int getX() {
			return x;
		}

		public void setX(int x) {
			this.x = x;
		}

		public int getY() {
			return y;
		}

		public void setY(int y) {
			this.y = y;
		}

		public int getDay() {
			return day;
		}

		public void setDay(int day) {
			this.day = day;
		}

		public boolean isSelected(float selX, float selY) {
			if ((selX >= x - diff && selX <= x + rectSize + diff)
					&& (selY >= y - rectSize - diff && selY <= y + diff)) {
				return true;
			}

			return false;
		}
	}

	public static final int INVALID_POSITION = -1;
	private int leftPadding = 20;
	private int topPadding = 100;
	private int rowPadding;
	private int colPadding;

	private int year;

	private int month;

	private int day;

	private Calendar cal = Calendar.getInstance();
	private Calendar today = (Calendar) cal.clone();

	private List<DateRect> rects ;

	private final Paint cPaint;
	private final Paint tPaint;



	private GestureDetector mGestureDetector;

	public CalendarView(Context context) {
		super(context);

	

		setFocusable(true);
		setFocusableInTouchMode(true);

		cPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
		cPaint.setStyle(Paint.Style.FILL_AND_STROKE);
		cPaint.setColor(Color.RED);
		cPaint.setTextSize(20f);

		tPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
		tPaint.setStyle(Paint.Style.FILL_AND_STROKE);
		tPaint.setColor(Color.WHITE);
		tPaint.setTextSize(20f);

		setBackgroundColor(R.color.background);

		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.MONTH, 1);
							CalendarView.this.invalidate();
						}

						if (e1.getX() < e2.getX()) {
							cal.add(Calendar.MONTH, -1);
							CalendarView.this.invalidate();
						}

						return true;

					}
//					点击具体的天后处理
					@Override
					public boolean onSingleTapUp(MotionEvent e) {
						day = getDay(e.getX(), e.getY());
						if (day != INVALID_POSITION) {
//							自定义处理函数
						}
						return true;
					}

				});
	}

	@Override
	protected void onSizeChanged(int w, int h, int oldw, int oldh) {
		super.onSizeChanged(w, h, oldw, oldh);
		colPadding = (w -leftPadding)/ 7;
		rowPadding = (h - topPadding) / 7;
	}
/**
 * 画日期
 */
	@Override
	protected void onDraw(Canvas canvas) {
		year = cal.get(Calendar.YEAR);
		month = cal.get(Calendar.MONTH);

		String yearMonth = year + "年" + (month + 1) + "月";
		canvas.drawText(yearMonth, (colPadding * 7) / 2 - 35, 50, tPaint);

		String[] weekStr = new String[] { "一", "二", "三", "四", "五", "六", "日"};

		for (int i = 0; i < weekStr.length; i++) {
			canvas.drawText(weekStr[i], leftPadding + i * colPadding,
					topPadding, tPaint);
		}

		cal.set(Calendar.DATE, 1);
		int month = cal.get(Calendar.MONTH);
		int y = 1;
		rects = new ArrayList<DateRect>();
		while (cal.get(Calendar.MONTH) == month) {
			int day = cal.get(Calendar.DATE);
			int x = cal.get(Calendar.DAY_OF_WEEK);
			
			if (x == 1) {
				x = 7;
			} else {
				x = x - 1; 
			}
			
			int dx = leftPadding + (x - 1) * colPadding;
			int dy = topPadding + y * rowPadding;
			
			
			rects.add(new DateRect(dx, dy, day));

			if (cal.equals(today)) {
				canvas.drawText(day + "", dx, dy, cPaint);
			} else {
				canvas.drawText(day + "", dx, dy, tPaint);
			}
			
			if(x == 7)
			{
//				到下一行
			  y = y + 1;	
			}
			cal.add(Calendar.DATE, 1);
		}
		cal.add(Calendar.DATE, -1);

	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		 mGestureDetector.onTouchEvent(event);
		 return true;
	}

	private int getDay(float x, float y) {
		for (DateRect rect : rects) {
			if (rect.isSelected(x, y)) {
				return rect.getDay();
			}
		}
		return INVALID_POSITION;
	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值