自定义控件_自定义日历

来源:互联网 发布: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);    }}
原创粉丝点击