datepicker 日历控件修改之路

为了满足自己的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);
    }
});

发布了29 篇原创文章 · 获赞 40 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/xiyunmengyuan/article/details/75309689
今日推荐