Android基于wheelView的自定义日期选择器.docx
- 文档编号:25258313
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:28
- 大小:20.66KB
Android基于wheelView的自定义日期选择器.docx
《Android基于wheelView的自定义日期选择器.docx》由会员分享,可在线阅读,更多相关《Android基于wheelView的自定义日期选择器.docx(28页珍藏版)》请在冰豆网上搜索。
Android基于wheelView的自定义日期选择器
Android基于wheelView的自定义日期选择器
系统自带的DatePicker、TimePicker大家都知道,只有这种效果:
XX了很多,试了NumberPicker等都不行,本来打算自己写。
网友推荐了一个开源组件WheelView,下下来试了试,发现他已经定义的很完善了,在他的基础上拓展很容易。
现将基于wheelView自定义日期选择器记录如下:
一.首先要了解WheelView为我们提供了什么:
除了我写的”DateObject”与”StringWheelAdapter”,其余都是WheelView提供的,
1.WheelView.java:
可滚动的组件,
主要方法:
setAdapter(newStringWheelAdapter(dateList,7));//设置Adapter
setVisibleItems(3);//设置显示几行数据
setCyclic(true);//设置是否循环显示数据
addChangingListener(onDaysChangedListener)//设置滑动监听器
2.WheelAdapter.java:
滑动组件的适配器的接口,子类适配器用于装载数据
publicinterfaceWheelAdapter{
/**
*Getsitemscount
*@returnthecountofwheelitems
*/
publicintgetItemsCount();
/**
*Getsawheelitembyindex.
*
*@paramindextheitemindex
*@returnthewheelitemtextornull
*/
publicStringgetItem(intindex);
/**
*Getsmaximumitemlength.Itisusedtodeterminethewheelwidth.
*If-1isreturnedtherewillbeusedthedefaultwheelwidth.
*
*@returnthemaximumitemlengthor-1
*/
publicintgetMaximumLength();
}
3.OnWheelChangedListener.java:
滑动监听器接口
publicinterfaceOnWheelChangedListener{
/**
*Callbackmethodtobeinvokedwhencurrentitemchanged
*@paramwheelthewheelviewwhosestatehaschanged
*@paramoldValuetheoldvalueofcurrentitem
*@paramnewValuethenewvalueofcurrentitem
*/
voidonChanged(WheelViewwheel,intoldValue,intnewValue);
}
4.OnWheelScrollListener.java:
滚动监听器接口(暂时没用到)
5.NumericWheelAdapter.java:
当滚动内容为纯数字时调用的适配器
6.DateObject.java:
日期实体类,用于存储、获取选择的数据
packagekankan.wheel.widget;
importjava.util.Calendar;
publicclassDateObjectextendsObject{
privateintyear;
privateintmonth;
privateintday;
privateintweek;
privateinthour;
privateintminute;
privateStringlistItem;
/**
*日期对象的4个参数构造器,用于设置日期
*@paramyear
*@parammonth
*@paramday
*@authorsxzhang
*/
publicDateObject(intyear2,intmonth2,intday2,intweek2){
super();
this.year=year2;
intmaxDayOfMonth=Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH);
if(day2>maxDayOfMonth){
this.month=month2+1;
this.day=day2%maxDayOfMonth;
}else{
this.month=month2;
this.day=day2;
}
this.week=week2%7==0?
7:
week2%7;
if(day==Calendar.getInstance().get(Calendar.DAY_OF_MONTH)){
this.listItem=String.format("%02d",this.month)+"月"+String.format("%02d",this.day)+
"日"+"今天";
}else{
this.listItem=String.format("%02d",this.month)+"月"+String.format("%02d",this.day)+
"日"+getDayOfWeekCN(week);
}
}
/**
*日期对象的2个参数构造器,用于设置时间
*@paramhour2
*@paramminute2
*@paramisHourTypetrue:
传入的是hour;false:
传入的是minute
*@authorsxzhang
*/
publicDateObject(inthour2,intminute2,booleanisHourType){
super();
if(isHourType==true&&hour2!
=-1){//设置小时
if(hour2>24){
this.hour=hour2%24;
}else
this.hour=hour2;
this.listItem=this.hour+"时";
}elseif(isHourType==false&&minute2!
=-1){//设置分钟
if(minute2>60)
this.minute=minute2%60;
else
this.minute=minute2;
this.listItem=this.minute+"分";
}
}
publicintgetHour(){
returnhour;
}
publicvoidsetHour(inthour){
this.hour=hour;
}
publicintgetMinute(){
returnminute;
}
publicvoidsetMinute(intminute){
this.minute=minute;
}
publicintgetWeek(){
returnweek;
}
publicvoidsetWeek(intweek){
this.week=week;
}
publicintgetYear(){
returnyear;
}
publicvoidsetYear(intyear){
this.year=year;
}
publicintgetMonth(){
returnmonth;
}
publicvoidsetMonth(intmonth){
this.month=month;
}
publicintgetDay(){
returnday;
}
publicvoidsetDay(intday){
this.day=day;
}
publicStringgetListItem(){
returnlistItem;
}
publicvoidsetListItem(StringlistItem){
this.listItem=listItem;
}
/**
*根据day_of_week得到汉字星期
*@return
*/
publicstaticStringgetDayOfWeekCN(intday_of_week){
Stringresult=null;
switch(day_of_week){
case1:
result="星期日";
break;
case2:
result="星期一";
break;
case3:
result="星期二";
break;
case4:
result="星期三";
break;
case5:
result="星期四";
break;
case6:
result="星期五";
break;
case7:
result="星期六";
break;
default:
break;
}
returnresult;
}
}
7.StringWheelAdapter.java:
一会儿将定义的滚动内容为字符串的适配器,当内容为字符串时我们就可以随意拓展滑动部分的内容
packagekankan.wheel.widget;
importjava.util.ArrayList;
/**
*ThesimpleStringArraywheeladapter
*
*/
publicclassStringWheelAdapterimplementsWheelAdapter{
/**Thedefaultitemslength*/
publicstaticfinalintDEFAULT_LENGTH=-1;
//items
privateArrayList
//length
privateintlength;
/**
*Constructor
*@paramitemstheitems
*@paramlengththemaxitemslength
*/
publicStringWheelAdapter(ArrayList
this.list=list;
this.length=length;
}
@Override
publicStringgetItem(intindex){
if(index>=0&&index returnlist.get(index).getListItem(); } returnnull; } @Override publicintgetItemsCount(){ returnlist.size(); } @Override publicintgetMaximumLength(){ returnlength; } } 二.了解以后就可以使用他定义我们需要的了。 1.首先要做的是这个效果的部分: 这里写图片描述 我们将其命名为DatePicker: packagecom.sxkeji.timeswitch.widget; importjava.util.ArrayList; importjava.util.Calendar; importkankan.wheel.widget.DateObject; importkankan.wheel.widget.OnWheelChangedListener; importkankan.wheel.widget.StringWheelAdapter; importkankan.wheel.widget.WheelView; importandroid.content.Context; importandroid.util.AttributeSet; importandroid.widget.LinearLayout; /** *自定义的日期选择器 *@authorsxzhang * */ publicclassDatePickerextendsLinearLayout{ privateCalendarcalendar=Calendar.getInstance(); privateWheelViewnewDays; privateArrayList privateOnChangeListeneronChangeListener;//onChangeListener privatefinalintMARGIN_RIGHT=20; privateDateObjectdateObject;//日期数据对象 //Constructors publicDatePicker(Contextcontext){ super(context); init(context); } publicDatePicker(Contextcontext,AttributeSetattrs){ super(context,attrs); init(context); } /** *初始化 *@paramcontext */ privatevoidinit(Contextcontext){ intyear=calendar.get(Calendar.YEAR); intmonth=calendar.get(Calendar.MONTH)+1; intday=calendar.get(Calendar.DAY_OF_MONTH); intweek=calendar.get(Calendar.DAY_OF_WEEK); dateList=newArrayList for(inti=0;i<7;i++){ dateObject=newDateObject(year,month,day+i,week+i); dateList.add(dateObject); } newDays=newWheelView(context); LayoutParamsnewDays_param=newLayoutParams(300,LayoutParams.WRAP_CONTENT); newDays_param.setMargins(0,0,MARGIN_RIGHT,0); newDays.setLayoutParams(newDays_param); newDays.setAdapter(newStringWheelAdapter(dateList,7)); newDays.setVisibleItems(3); newDays.setCyclic(true); newDays.addChangingListener(onDaysChangedListener); addView(newDays); } /** *滑动改变监听器 */ privateOnWheelChangedListeneronDaysChangedListener=newOnWheelChangedListener(){ @Override publicvoidonChanged(WheelViewmins,intoldValue,intnewValue){ calendar.set(Calendar.DAY_OF_MONTH,newValue+1); change(); } }; /** *滑动改变监听器回调的接口 */ publicinterfaceOnChangeListener{ voidonChange(intyear,intmonth,intday,intday_of_week); } /** *设置滑动改变监听器 *@paramonChangeListener */ publicvoidsetOnChangeListener(OnChangeListeneronChangeListener){ this.onChangeListener=onChangeListener; } /** *滑动最终调用的方法 */ privatevoidchange(){ if(onChangeListener! =null){ onChangeListener.onChange( dateList.get(newDays.getCurrentItem()).getYear(), dateList.get(newDays.getCurrentItem()).getMonth(), dateList.get(newDays.getCurrentItem()).getDay(), dateList.get(newDays.getCurrentItem()).getWeek()); } } /** *根据day_of_week得到汉字星期 *@return */ publicstaticStringgetDayOfWeekCN(intday_of_week){ Stringresult=null; switch(day_of_week){ case1: result="星期日"; break; case2: result="星期一"; break; case3: result="星期二"; break; case4: result="星期三"; break; case5: result="星期四"; break; case6: result="星期五"; break; case7: result="星期六"; break; default: break; } returnresult; } @Override protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){ super.onMeasure(widthMeasureSpec,heightMeasureSpec); } } 2.然后要做的是这个效果的部分 这里写图片描述 我们命名为TimePicker: packagecom.sxkeji.timeswitch.widget; importjava.util.ArrayList; importjava.util.Calendar; importkankan.wheel.widget.DateObject; importkankan.wheel.widget.OnWheelChangedListener; importkankan.wheel.widget.StringWheelAdapter; importkankan.wheel.widget.WheelView; importandroid.content.Context; importandroid.util.AttributeSet; importandroid.widget.LinearLayout; /** *自定义的时间选择器 *@authorsxzhang * */ publicclassTimePickerextendsLinearLayout{ privateCalendarcalendar=Calendar.getInstance(); privateWheelViewhours,mins;//Wheelpicker privateOnChangeListeneronChangeListener;//onChangeListener privatefinalintMARGIN_RIGHT=15;//调整文字右端距离 privateArrayList privateDateObjectdateObject;//时间数据对象 //Constructors publicTimePicker(Contextcontext){ super(context); init(context); } publicTimePicker(Contextcontext,AttributeSetattrs){ super(context,attrs); init(context); } /** *初始化 *@paramcontext */ privatevoidinit(Contextcontext){ inthour=calendar.get(Calendar.HOUR_OF_DAY); intminute=calendar.get(Calendar.MINUTE); hourList=newArrayList minuteList=newArrayList for(inti=0;i<24;i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 基于 wheelView 自定义 日期 选择器