最近闲来无事,写了一个简单日历的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.youkuaiyun.com/download/wen_haha/10632752
github