为了满足自己的UI需求对datepicker 的源码进行了一些修改,下图是UI效果
1,datepicker 的引入
源码路径:https://github.com/dalong982242260/AndroidCalendar
2,首先是title内容的实现
// 标题栏根布局 用于添加标题栏空间 RelativeLayout rlTitle = new RelativeLayout(context);
LinearLayout llDateShow = new LinearLayout(context); llDateShow.setOrientation(HORIZONTAL);
定义一个Linearlayout 用来显示 年份和月份部分内容
// 标题栏子元素布局参数 RelativeLayout.LayoutParams lpYear = new RelativeLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT); lpYear.addRule(RelativeLayout.CENTER_VERTICAL);
RelativeLayout.LayoutParams lpMonth = new RelativeLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT); lpMonth.addRule(RelativeLayout.CENTER_IN_PARENT);
RelativeLayout.LayoutParams lpBack = new RelativeLayout.LayoutParams(WRAP_CONTENT, WRAP_CONTENT); lpEnsure.addRule(RelativeLayout.CENTER_VERTICAL); lpEnsure.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
// 年份显示 tvYear = new TextView(context); tvYear.setText("2017年"); tvYear.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); tvYear.setTextColor(mTManager.colorTitle());
// 月份显示 tvMonth = new TextView(context); tvMonth.setText("7月"); tvMonth.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16); tvMonth.setTextColor(mTManager.colorTitle()); Drawable rightDrawable2 = context.getResources().getDrawable(R.mipmap.arrow_top); rightDrawable2.setBounds(0, 0, rightDrawable2.getMinimumWidth(), rightDrawable2.getMinimumHeight()); tvMonth.setCompoundDrawables(null, null, rightDrawable2, null);
// 返回按钮显示 tvBack = new TextView(context);
tvBack.setText("返回");
tvBack.setGravity(Gravity.CENTER_VERTICAL);tvYear2.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 16);
tvBack.setTextColor(mTManager.colorTitle());
Drawable rightDrawable = context.getResources().getDrawable(R.mipmap.fanhui);
rightDrawable.setBounds(0, 0, rightDrawable.getMinimumWidth(), rightDrawable.getMinimumHeight());
tvBack2.setCompoundDrawables(rightDrawable, null, null, null);
tvBack2.setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
onSureClickListener.onSureClick();//回调接口
}});
添加view
llDateShow.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { onSureClickListener.onTopClick(); } });
llDateShow.addView(tvYear,lpYear); llDateShow.addView(tvMonth,lpMonth);
rlTitle.addView(tvBack, lpBack); rlTitle.addView(llDateShow,lpMonth);
回调接口的定义
OnSureClickListener onSureClickListener; public interface OnSureClickListener{ void onSureClick(); void onTopClick(); }
3,日历部分背景色的设置
@Override public int colorBG() { return 0x01acf1; } @Override public int colorBGCircle() { return 0xFFFFFFFF; } @Override public int colorTitleBG() { return 0xFFF37B7A; } @Override public int colorTitle() { return 0xEEFFFFFF; } @Override public int colorToday() { return 0x01acf1; } @Override public int colorG() { return 0xFFFFFFFF; }//中间字体颜色 @Override public int colorF() { return 0xEEC08AA4; } @Override public int colorWeekend() { return 0xFFFFFFFF; }//周末字体颜色设置 @Override public int colorHoliday() { return 0x80FED6D6; }
monthView.setBackground(context.getResources().getDrawable(R.mipmap.home_top_bg));
4,activity中的设置
final DatePicker picker = (DatePicker) findViewById(R.id.main_dp); picker.setDate(2017, 7); picker.setFestivalDisplay(false); picker.setTodayDisplay(false); picker.setHolidayDisplay(false); picker.setDeferredDisplay(false); picker.setHorizontalScrollBarEnabled(true); picker.setClickable(true); picker.setOnSureClickListener(new DatePicker.OnSureClickListener() { @Override public void onSureClick() { finish(); } @Override public void onTopClick() { new MyPickerDialog(BillTimeSearchActivity.this, AlertDialog.THEME_HOLO_LIGHT, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(android.widget.DatePicker view, final int years, final int months, final int dayOfMonths) { calendar.set(Calendar.YEAR, years); calendar.set(Calendar.MONTH, months); calendar.set(Calendar.DAY_OF_MONTH,dayOfMonths); handler.post(new Runnable() { @Override public void run() { tmp.clear(); tmp.add(years+"-"+months+"-"+dayOfMonths); dpcManager.clearnDATE_CACHE(); dpcManager.setDecorBG(tmp); picker.setDate(years, months+1); picker.setDPDecor(new DPDecor() { @Override public void drawDecorBG(Canvas canvas, Rect rect, Paint paint) { paint.setColor(getResources().getColor(R.color.white)); canvas.drawCircle(rect.centerX(), rect.centerY(), rect.width() / 3F, paint); } }); picker.invalidate(); } }); } },calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE)).show(); } });
单选事件
picker.setOnDatePickedListener(new DatePicker.OnDatePickedListener() { @Override public void onDatePicked(String date) { ToastUtil.showMessage(BillTimeSearchActivity.this,date); tmp.clear(); tmp.add(date); dpcManager.clearnDATE_CACHE(); dpcManager.setDecorBG(tmp); //picker.setDate(Integer.valueOf(date.split("-")[0]), Integer.valueOf(date.split("-")[1])); picker.setDPDecor(new DPDecor() { @Override public void drawDecorBG(Canvas canvas, Rect rect, Paint paint) { paint.setColor(getResources().getColor( R.color.white)); canvas.drawCircle(rect.centerX(), rect.centerY(), rect.width() / 3F, paint); } }); picker.invalidate(); } }); picker.setIsSelChangeColor(true, getResources().getColor(R.color.title_blue)); // 设置选择的日期字体颜色,不然有的背景颜色和默认的字体颜色不搭 dpcManager = DPCManager.getInstance(); picker.setMode(DPMode.SINGLE); // 动态更新的时候必须 清除cache dpcManager.clearnDATE_CACHE(); // 清除cache // 重新设置日期 tmp.add(year+"-"+month+"-"+day); dpcManager.setDecorBG(tmp); picker.setDate(year, month); picker.setDPDecor(new DPDecor() { @Override public void drawDecorBG(Canvas canvas, Rect rect, Paint paint) { paint.setColor(getResources().getColor( R.color.white)); canvas.drawCircle(rect.centerX(), rect.centerY(), rect.width() / 3F, paint); } });