如何在自定义calendarView中选择多个日期?

我在android中制作自定义日历我的要求是使多个日期选择与图像中显示的任何一个有任何建议。现在我在视图上制作日历并尝试根据触摸绘制路径但它不适合我。这是我的代码: –

public class CalendarView extends View { private float width; // width of one tile private float height; // height of one tile private int selX; // X index of selection private int selY; // Y index of selection private final Rect selRect = new Rect(); private GregorianCalendar month, itemmonth;// calendar instances. private CalendarAdapter adapter;// adapter instance private Context mContext ; private GregorianCalendar pmonthmaxset; private GregorianCalendar selectedDate; private ArrayList items; private List dayString; private GregorianCalendar pmonth; // calendar instance for previous month /** * calendar instance for previous month for getting complete view */ private int firstDay; private int maxWeeknumber; private int maxP; private int calMaxP; private int lastWeekDay; private int leftDays; private int mnthlength; private String itemvalue, curentDateString; private DateFormat df; private Canvas macanvas; private Path mpath; private float cselX; // X index of selection private float cselY; // Y index of selection public CalendarView(Context context) { super(context); mpath = new Path(); RectF mrectf = new RectF(selRect); //mpath.ad month = (GregorianCalendar) GregorianCalendar.getInstance(); itemmonth = (GregorianCalendar) month.clone(); Locale.setDefault(Locale.US); selectedDate = (GregorianCalendar) month.clone(); mContext = context; month.set(GregorianCalendar.DAY_OF_MONTH, 1); this.items = new ArrayList(); df = new SimpleDateFormat("yyyy-MM-dd", Locale.US); curentDateString = df.format(selectedDate.getTime()); dayString= new ArrayList(); macanvas = new Canvas(); refreshDays(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { width = w / 7f; height = (w)/(7f); getRect(selX, selY, selRect); super.onSizeChanged(w, h, oldw, oldh); } @Override protected void onDraw(Canvas canvas) { // Draw the background... Paint background = new Paint(); background.setColor( Color.GRAY); canvas.drawRect(0, 0, getWidth(), getHeight(), background); // Draw the board... // Define colors for the grid lines Paint foreground = new Paint(Paint.ANTI_ALIAS_FLAG); foreground.setColor(Color.RED); Paint dark = new Paint(); dark.setColor(Color.BLUE); Paint hilite = new Paint(); hilite.setColor(Color.BLUE); Paint light = new Paint(); light.setColor(Color.BLUE); // Draw the minor grid lines for (int i = 0; i < 6; i++) { canvas.drawLine(0, i * height, getWidth(), i * height, light); canvas.drawLine(0, i * height + 1, getWidth(), i * height + 1, hilite); } for (int i = 0; i < 8; i++) { canvas.drawLine(i * width, 0, i * width,width*5, light); canvas.drawLine(i * width+1, 0, i * width+1,width*5, light); } foreground.setColor(Color.RED); foreground.setStyle(Style.FILL); foreground.setTextSize(height * 0.75f); foreground.setTextScaleX(width / height); foreground.setTextAlign(Paint.Align.CENTER); // Draw the number in the center of the tile FontMetrics fm = foreground.getFontMetrics(); // Centering in X: use alignment (and X at midpoint) float x = width / 2; // Centering in Y: measure ascent/descent first float y = height / 2 - (fm.ascent + fm.descent) / 2; int k =0; for (int i = 0; i < 7; i++) { for (int j = 0; j  1) && (index < firstDay)) { // setting offdays to white color. //dayView.setTextColor(Color.WHITE); //dayView.setClickable(false); //dayView.setFocusable(false); } else if ((Integer.parseInt(gridvalue)  28)) { //dayView.setTextColor(Color.WHITE); //dayView.setClickable(false); //dayView.setFocusable(false); } else { // setting curent month's days in blue color. //dayView.setTextColor(Color.BLUE); } if (dayString.get(index).equals(curentDateString)) { //setSelected(v); //previousView = v; } else { //v.setBackgroundResource(R.drawable.list_item_background); } return gridvalue; } public void refreshDays() { // clear items items.clear(); dayString.clear(); Locale.setDefault(Locale.US); pmonth = (GregorianCalendar) month.clone(); // month start day. ie; sun, mon, etc firstDay = month.get(GregorianCalendar.DAY_OF_WEEK); // finding number of weeks in current month. maxWeeknumber = month.getActualMaximum(GregorianCalendar.WEEK_OF_MONTH); // allocating maximum row number for the gridview. mnthlength = maxWeeknumber * 7; maxP = getMaxP(); // previous month maximum day 31,30.... calMaxP = maxP - (firstDay - 1);// calendar offday starting 24,25 ... /** * Calendar instance for getting a complete gridview including the three * month's (previous,current,next) dates. */ pmonthmaxset = (GregorianCalendar) pmonth.clone(); /** * setting the start date as previous month's required date. */ pmonthmaxset.set(GregorianCalendar.DAY_OF_MONTH, calMaxP + 1); /** * filling calendar gridview. */ for (int n = 0; n < mnthlength; n++) { itemvalue = df.format(pmonthmaxset.getTime()); pmonthmaxset.add(GregorianCalendar.DATE, 1); dayString.add(itemvalue); } } private int getMaxP() { int maxP; if (month.get(GregorianCalendar.MONTH) == month .getActualMinimum(GregorianCalendar.MONTH)) { pmonth.set((month.get(GregorianCalendar.YEAR) - 1), month.getActualMaximum(GregorianCalendar.MONTH), 1); } else { pmonth.set(GregorianCalendar.MONTH, month.get(GregorianCalendar.MONTH) - 1); } maxP = pmonth.getActualMaximum(GregorianCalendar.DAY_OF_MONTH); return maxP; } @Override public boolean onTouchEvent(MotionEvent event) { switch(event.getAction()) { case MotionEvent.ACTION_DOWN: //select((int) (event.getX() / width), // (int) (event.getY() / height)); mpath.moveTo(event.getX(), event.getY()); mpath.lineTo(event.getX(), event.getY()); break; case MotionEvent.ACTION_MOVE: invalidate(); cselX = event.getX(); cselY = event.getY(); mpath.lineTo(cselX,cselY); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: break; } return true; } private void select(int x, int y) { selX = Math.min(Math.max(x, 0), 8); selY = Math.min(Math.max(y, 0), 8); getRect(selX, selY, selRect); invalidate(selRect); } 

}

您可以取消选择日期,添加到数组,然后用户选择第二个日期…

使用我的库,您可以选择一个日期,但设置事件日期。 它喜欢多种选择。

MFCalendarView