Android中自定义日历控件

最近闲来无事,写了一个简单日历的View,可能有些写的不完善的地方,后期我会慢慢完善的。

先来看一下自定义实现的日历效果:

NewCalender是一个自定义View,继承LinearLayout,通过动态添加布局文件来实现界面效果,可以点击前后按钮进行月份的切换,通过渲染日历视图实现简单的日历效果。最后通过自定义CalenderItemTextView,继承TextView,然后用画笔对当前日期进行标注。

1.动态添加布局文件,实现简单的日历布局。

 LayoutInflater inflater=LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.calendar_view, this);
        mIvPrev= (ImageView) view.findViewById(R.id.iv_pre);
        mIvNext= (ImageView) view.findViewById(R.id.iv_next);
        mTvDate= (TextView) view.findViewById(R.id.tv_date);
        mGridView= (GridView) view.findViewById(R.id.gv_calendar_grid);

2.点击按钮进行月份的自由切换。

 mIvPrev.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                calendar.add(Calendar.MONTH,-1);
                renderCalendar();
            }
        });
        mIvNext.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                calendar.add(Calendar.MONTH,1);
                renderCalendar();
            }
        });

3.通过渲染日历视图

SimpleDateFormat sdf=new SimpleDateFormat(displayFormat);
        mTvDate.setText(sdf.format(calendar.getTime()));
        ArrayList<Date> cells=new ArrayList<>();
        Calendar mCalendar= (Calendar) calendar.clone();
        mCalendar.set(Calendar.DAY_OF_MONTH,1);
        int prevDays = mCalendar.get(Calendar.DAY_OF_WEEK) - 1;
        mCalendar.add(Calendar.DAY_OF_MONTH,-prevDays);
        int maxCellCount=6*7;
        while (cells.size()<maxCellCount){
            cells.add(mCalendar.getTime());
            mCalendar.add(Calendar.DAY_OF_MONTH,1);
        }

4.通过适配器实现所属当前月份与不是当前月份,进行颜色区分。

public static class CalendarAdapter extends ArrayAdapter<Date>{

       LayoutInflater inflater;
        public CalendarAdapter(Context context, ArrayList<Date> days) {
            super(context, R.layout.calendar_text_day,days);
            inflater=LayoutInflater.from(context);
        }

        @NonNull
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Date date = getItem(position);
            if (convertView==null){
               convertView= inflater.inflate(R.layout.calendar_text_day,null);
            }
            int day=date.getDate();
            ((TextView)convertView).setText(String.valueOf(day));
            Date now=new Date();
           Boolean isTheSameMonth=false;
            if (date.getMonth()==now.getMonth()){
                isTheSameMonth=true;
            }
            if (isTheSameMonth){
                ((TextView)convertView).setTextColor(Color.parseColor("#000000"));
            }else{
                ((TextView)convertView).setTextColor(Color.parseColor("#666666"));
            }

            if (now.getDate()==date.getDate()&&now.getMonth()==date.getMonth()
                    &&now.getYear()==date.getYear()){
                ((TextView)convertView).setTextColor(Color.parseColor("#ff0000"));
                ((CalendarItemTextView)convertView).isToday=true;
            }
            return convertView;
        }
        public interface  NewCalendarListener{
            void  onItemLongPress(Date day);
        }
    }

5.绑定适配器,实现日历效果。

 mGridView.setAdapter(new CalendarAdapter(getContext(),cells));

6.自定义CalendarItemTextView,实现对当前日期进行标注。

public class CalendarItemTextView extends TextView {

    public boolean isToday=false;
    private Paint mPaint=new Paint();
    public CalendarItemTextView(Context context) {
        super(context);
    }

    public CalendarItemTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initControl();
    }
    public CalendarItemTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initControl();
    }
    private void initControl() {
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setColor(Color.parseColor("#ff0000"));
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setStrokeWidth((float)2.6);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (isToday){
            canvas.translate(getWidth()/2,getHeight()/2);
            canvas.drawCircle(0,0,getWidth()/2,mPaint);
        }
    }
}

基本代码都已经贴上了,如果还有不明白的地方可以去我的github上进行下载,也可以去我的csdn进行下载。

Demo

csdn

https://download.csdn.net/download/wen_haha/10632752

github

https://github.com/kongkongdaren/CustomCalendarDemo

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值