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() {@Overridepublic 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;}//点击具体的天后处理@Overridepublic boolean onSingleTapUp(MotionEvent e) {day = getDay(e.getX(), e.getY());if (day != INVALID_POSITION) {//自定义处理函数}return true;}});}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);colPadding = (w -leftPadding)/ 7;rowPadding = (h - topPadding) / 7;}/** * 画日期 */@Overrideprotected 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);}@Overridepublic 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;}}

更多相关文章

  1. 箭头函数的基础使用
  2. Python技巧匿名函数、回调函数和高阶函数
  3. Android系统启动——Zygote进程
  4. Android(安卓)全局异常处理(二)
  5. android图片上传springMvc
  6. android 捕捉app错误信息
  7. android 图片处理
  8. android IntentService
  9. Android(安卓)P Android.dp添加逻辑判断

随机推荐

  1. go语言基础
  2. C语言字符串输出函数puts()的作用是什么
  3. c语言绝对值怎么打
  4. go语言适合做什么?
  5. 复数型是c语言的数据类型吗?
  6. Visual C++2010如何编写并运行C++程序
  7. go 为什么比php性能高
  8. aspx是什么文件?
  9. C语言中数组所占字节怎么算
  10. gin是什么意思?