¿Cómo seleccionar la fecha múltiple en calendarView personalizado?

Estoy haciendo calendario personalizado en android Mi requisito es que haga la selección de fecha múltiple igual que se muestra en la imagen de cualquiera tiene alguna sugerencia. Ahora puedo hacer calendario en la vista y tratando de dibujar el camino de acuerdo al tacto, pero no funciona para mí. Mi código:-

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<String> items; private List<String> 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<String>(); df = new SimpleDateFormat("yyyy-MM-dd", Locale.US); curentDateString = df.format(selectedDate.getTime()); dayString= new ArrayList<String>(); 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 < 5; j++) { String datevalue = fillDate(k++); canvas.drawText(datevalue, i * width + x, j * height + y, foreground); } } if(mpath!=null) { Paint selected = new Paint(); selected.setColor(Color.GREEN); canvas.drawPath(mpath,selected); // canvas.drawCircle(x, y, 25, selected); } super.onDraw(canvas); } private void getRect(int x, int y, Rect rect) { rect.set((int) (x * width), (int) (y * height), (int) (x * width + width), (int) (y * height + height)); } public String fillDate(int index) { String date = ""; // separates daystring into parts. String[] separatedTime = dayString.get(index).split("-"); // taking last part of date. ie; 2 from 2012-12-02 String gridvalue = separatedTime[2].replaceFirst("^0*", ""); // checking whether the day is in current month or not. if ((Integer.parseInt(gridvalue) > 1) && (index < firstDay)) { // setting offdays to white color. //dayView.setTextColor(Color.WHITE); //dayView.setClickable(false); //dayView.setFocusable(false); } else if ((Integer.parseInt(gridvalue) < 7) && (index > 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); } 

}

Puede anular la selección de la fecha, añadir a la matriz y, a continuación, seleccionar la segunda fecha …

Con mi biblioteca, puede seleccionar una fecha pero establecer fechas de evento. Le gusta la selección múltiple.

MFCalendarView

  • Android Agregar evento al calendario con Intent, obtiene el identificador de evento
  • Pequeños números en CalendarView android
  • ¿Cómo usar y probar la API del Calendario de Android 4.0 en el emulador?
  • Material-calendarview set color de fondo de las fechas
  • Cómo configurar un recordatorio en Android?
  • Buscando un buen calendario datepicker para android
  • Obtención de año, mes y fecha en Android
  • Barra de herramientas con calendario
  • Esquema de URL para activar el cliente del calendario
  • ¿Cómo reducir el tamaño de CalendarView?
  • ¿Cómo mostrar una interfaz de usuario de calendario en una aplicación de Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.