public class MydateView extends View {
private static final int NUM_COLUMNS = 7;
private static final int NUM_ROWS = 6;
private Paint mPaint;
private int mDayColor = Color.parseColor("#000000");
private int mSelectDayColor = Color.parseColor("#ffffff");
private int mSelectBGColor = Color.parseColor("#1FC2F3");
private int mCurrentColor = Color.parseColor("#ff0000");
private int mCurrYear,mCurrMonth,mCurrDay;
private int mSelYear,mSelMonth,mSelDay;
private int mColumnSize,mRowSize;
private DisplayMetrics mDisplayMetrics;
private int mDaySize = 18;
private TextView tv_date,tv_week;
private int weekRow;
private int [][] daysString;
private int mCircleRadius = 6;
private DateClick dateClick;
private int mCircleColor = Color.parseColor("#ff0000");
private int mCircleColors = Color.parseColor("#0acb6a");
//需要绘制小圆点的 日期
private List<Integer> daysHasThingList;
Context context;
public MydateView(Context context, AttributeSet attrs) {
super(context, attrs);
//获取屏幕的矩阵信息
mDisplayMetrics = getResources().getDisplayMetrics();
Calendar calendar = Calendar.getInstance();
mPaint = new Paint();
mCurrYear =calendar.get(Calendar.YEAR);
mCurrMonth =calendar.get(Calendar.MONTH);
mCurrDay =calendar.get(Calendar.DATE);
setSelectYearMonth(mCurrYear,mCurrMonth,mCurrDay);
this.context=context;
}
//默认的测量
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
//添加需要绘制小圆点的天数
public void AdddayHasThingList(List<Integer> list){
daysHasThingList=list;
}
@Override
protected void onDraw(Canvas canvas) {
initSize();
//6行7列
daysString = new int[6][7];
//设置画笔中文字
mPaint.setTextSize(mDaySize*mDisplayMetrics.scaledDensity);
String dayString;
//获取某个月份的天数
int mMonthDays =getMonthDays(mSelYear, mSelMonth);
//获取某个月份的第一天是星期几
int weekNumber =getFirstDayWeek(mSelYear, mSelMonth);
for(int day=0;day< mMonthDays;day++){
//第几天
dayString = (day + 1) + "";
//计算指定天的行列坐标,并存入坐标二维数组
int column = (day+weekNumber - 1) % 7;
int row = (day+weekNumber - 1) / 7;
daysString[row][column]=day + 1;
//开始绘制的坐标
int startX = (int) (mColumnSize * column + (mColumnSize - mPaint.measureText(dayString))/2);
int startY = (int) (mRowSize * row + mRowSize/2 - (mPaint.ascent() + mPaint.descent())/2);
if(dayString.equals(mSelDay+"")){
//绘制背景色矩阵
int startRecX = mColumnSize * column;
int startRecY = mRowSize * row;
int endRecX = startRecX + mColumnSize;
int endRecY = startRecY + mRowSize;
mPaint.setColor(mSelectBGColor);
canvas.drawRect(startRecX, startRecY, endRecX, endRecY, mPaint);
//记录第几行,即第几周
weekRow = row + 1;
}
//绘制事务圆形标志
drawCircle(row,column,day + 1,canvas);
//绘制天数,不同业务选择不同的颜色
if(dayString.equals(mSelDay+"")){
mPaint.setColor(mSelectDayColor);
}else if(dayString.equals(mCurrDay+"") && mCurrDay != mSelDay && mCurrMonth == mSelMonth){
//正常月,选中其他日期,则今日为红色
mPaint.setColor(mCurrentColor);
}else{
mPaint.setColor(mDayColor);
}
canvas.drawText(dayString, startX, startY, mPaint);
//意义不明
if(tv_date != null){
tv_date.setText(mSelYear + "待修改" + (mSelMonth + 1) + "待修改");
}
if(tv_week != null){
tv_week.setText("待修改" + weekRow +"待修改");
}
}
}
//绘制小圆点
private void drawCircle(int row,int column,int day,Canvas canvas){
if(daysHasThingList != null && daysHasThingList.size() >0){
if(!daysHasThingList.contains(day))return;
mPaint.setColor(mCircleColors);
float circleX = (float) (mColumnSize * column + mColumnSize*0.5);
float circley = (float) (mRowSize * row + mRowSize*0.85);
canvas.drawCircle(circleX, circley, mCircleRadius, mPaint);
// Resources res = context.getResources();
//
// Bitmap bitmap= BitmapFactory.decodeResource(res,R.drawable.picture_frame);
//
// canvas.drawBitmap(bitmap, circleX, circley, mPaint);
}
}
@Override
public boolean performClick() {
return super.performClick();
}
private int downX = 0,downY = 0;
@Override
public boolean onTouchEvent(MotionEvent event) {
int eventCode= event.getAction();
switch(eventCode){
case MotionEvent.ACTION_DOWN:
downX = (int) event.getX();
downY = (int) event.getY();
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
int upX = (int) event.getX();
int upY = (int) event.getY();
//拖动距离在10以内视为点击事件
if(Math.abs(upX-downX) < 10 && Math.abs(upY - downY) < 10){//点击事件
performClick();
doClickAction((upX + downX)/2,(upY + downY)/2);
}
break;
}
return true;
}
/**
* 初始化列宽行
*/
private void initSize(){
mColumnSize = getWidth() / NUM_COLUMNS;
mRowSize = getHeight() / NUM_ROWS;
}
/**
* 设置年月
* @param year
* @param month
*/
private void setSelectYearMonth(int year,int month,int day){
mSelYear = year;
mSelMonth = month;
mSelDay= day;
}
/**
* 执行点击事件
* @param x
* @param y
*/
private void doClickAction(int x,int y){
//通过点击的坐标来判断点击的是哪个
int row = y / mRowSize;
int column = x / mColumnSize;
setSelectYearMonth(mSelYear,mSelMonth,daysString[row][column]);
invalidate();
if(dateClick != null){
dateClick.onClickOnDate();
}
}
/**
* 左点击,日历向后翻页
*/
public void onLeftClick(){
int year = mSelYear;
int month = mSelMonth;
int day = mSelDay;
if(month == 0){
year = mSelYear-1;
month = 11;
}else if(getMonthDays(year, month) == day){
month = month-1;
day = getMonthDays(year, month);
}else{
month = month-1;
}
setSelectYearMonth(year,month,day);
invalidate();
}
/**
* 右点击,日历向前翻页
*/
public void onRightClick(){
int year = mSelYear;
int month = mSelMonth;
int day = mSelDay;
if(month == 11){
year = mSelYear+1;
month = 0;
}else if(getMonthDays(year, month) == day){
month = month + 1;
day =getMonthDays(year, month);
}else{
month = month + 1;
}
setSelectYearMonth(year,month,day);
invalidate();
}
/**
*点击日期修改时间
*/
public void ondataClick(int mSelYear,int mSelMonth){
int year = mSelYear;
int month = mSelMonth;
int day =1;
setSelectYearMonth(year,month,day);
invalidate();
}
public int getmSelYear() {
return mSelYear;
}
public int getmSelMonth() {
return mSelMonth;
}
public int getmSelDay() {
return this.mSelDay;
}
public void setmDayColor(int mDayColor) {
this.mDayColor = mDayColor;
}
public void setmSelectDayColor(int mSelectDayColor) {
this.mSelectDayColor = mSelectDayColor;
}
public void setmSelectBGColor(int mSelectBGColor) {
this.mSelectBGColor = mSelectBGColor;
}
public void setmCurrentColor(int mCurrentColor) {
this.mCurrentColor = mCurrentColor;
}
public void setmDaySize(int mDaySize) {
this.mDaySize = mDaySize;
}
public void setTextView(TextView tv_date,TextView tv_week){
this.tv_date = tv_date;
this.tv_week = tv_week;
invalidate();
}
public interface DateClick{
public void onClickOnDate();
}
public void setDateClick(DateClick dateClick) {
this.dateClick = dateClick;
}
public void setTodayToView(){
setSelectYearMonth(mCurrYear,mCurrMonth,mCurrDay);
invalidate();
}
/**
* 获取指定年份的天数
* @param year
* @param month
* @return
*/
public int getMonthDays(int year, int month) {
month++;
switch (month) {
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;
}
default:
return -1;
}
}
public int getFirstDayWeek(int year, int month){
Calendar calendar = Calendar.getInstance();
calendar.set(year, month, 1);
Log.d("DateView", "DateView:First:" + calendar.getFirstDayOfWeek());
return calendar.get(Calendar.DAY_OF_WEEK);
}
}
自定义控件_自定义日历
最新推荐文章于 2021-10-25 17:45:40 发布