android画日历
16lz
2021-12-04
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;}}
更多相关文章
- 箭头函数的基础使用
- Python技巧匿名函数、回调函数和高阶函数
- Android系统启动——Zygote进程
- Android(安卓)全局异常处理(二)
- android图片上传springMvc
- android 捕捉app错误信息
- android 图片处理
- android IntentService
- Android(安卓)P Android.dp添加逻辑判断