自定义控件_自定义日历
来源:互联网 发布:php短信轰炸机 编辑:程序博客网 时间:2024/06/10 07:11
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); }}
阅读全文
0 0
- 自定义控件_自定义日历
- 自定义View之_日历控件
- 自定义日历控件(Calendar)
- 自定义日历控件
- Flex自定义日历控件
- 自定义Flex日历控件
- C#自定义日历控件
- android 自定义日历控件
- Android自定义日历控件
- Android 自定义日历控件
- 自定义日历控件
- android自定义日历控件
- 自定义日历控件-CalendarView
- Android 自定义日历控件
- 自定义日历控件
- Android 自定义日历控件
- Android-自定义日历控件
- Android自定义日历控件
- 阿里云Ecs挂载云盘
- Java中的异常
- springMVC接受前台json数据
- Mysql数据库不支持InnoDB
- Kubernetes的service mesh – 第三部分:将一切加密
- 自定义控件_自定义日历
- 转自动化测试之路——起点
- 【BeagleBone Black Rev. C试用体验】+固件更换
- leetcode 39|40|216|377. Combination Sum 1|2|3|4
- 【逆向】Windows可执行文件简述(一)
- 线段树 模板
- Cookie源码翻译
- C#:获取系统当前日期/时间
- 华为工程师预测十年后的Kubernetes