自定义控件_自定义日历

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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值