iOS自定义时间滚动选择控件
本文实例为大家分享了iOS自定义时间滚动选择控件的具体代码,供大家参考,具体内容如下
1.先上自定义的控件:
/**
*滚轮选择器
*authorLH
*data2016/8/2017:26
*/
publicclassWheelViewextendsView{
publicstaticfinalStringTAG="WheelView";
/**
*自动回滚到中间的速度
*/
publicstaticfinalfloatSPEED=2;
/**
*除选中item外,上下各需要显示的备选项数目
*/
publicstaticfinalintSHOW_SIZE=1;
privateContextcontext;
privateListitemList;
privateintitemCount;
/**
*item高度
*/
privateintitemHeight=50;
/**
*选中的位置,这个位置是mDataList的中心位置,一直不变
*/
privateintcurrentItem;
privatePaintselectPaint;
privatePaintmPaint;
//画背景图中单独的画笔
privatePaintcenterLinePaint;
privatefloatcenterY;
privatefloatcenterX;
privatefloatmLastDownY;
/**
*滑动的距离
*/
privatefloatmMoveLen=0;
privatebooleanisInit=false;
privateSelectListenermSelectListener;
privateTimertimer;
privateMyTimerTaskmTask;
HandlerupdateHandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
if(Math.abs(mMoveLen)itemList){
this.itemList=itemList;
if(itemList!=null){
itemCount=itemList.size();
resetCurrentSelect();
}else{
Log.i(TAG,"itemisnull");
}
}
privatevoidresetCurrentSelect(){
if(currentItem<0){
currentItem=0;
}
while(currentItem>=itemCount){
currentItem--;
}
if(currentItem>=0&¤tItem();
mPaint=newPaint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStyle(Style.FILL);
mPaint.setTextAlign(Align.CENTER);
mPaint.setColor(getResources().getColor(R.color.wheel_unselect_text));
intsize1=(int)(SupportDisplay.getLayoutScale()*22+0.5);
mPaint.setTextSize(size1);
selectPaint=newPaint(Paint.ANTI_ALIAS_FLAG);
selectPaint.setStyle(Style.FILL);
selectPaint.setTextAlign(Align.CENTER);
selectPaint.setColor(getResources().getColor(R.color.color_1a1a1a));
intsize2=(int)(SupportDisplay.getLayoutScale()*24+0.5);
selectPaint.setTextSize(size2);
centerLinePaint=newPaint(Paint.ANTI_ALIAS_FLAG);
centerLinePaint.setStyle(Style.FILL);
centerLinePaint.setTextAlign(Align.CENTER);
centerLinePaint.setColor(getResources().getColor(R.color.wheel_unselect_text));
//绘制背景
setBackground(null);
}
@Override
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);
if(isInit){
drawData(canvas);
}
}
privatevoiddrawData(Canvascanvas){
//先绘制选中的text再往上往下绘制其余的text
if(!itemList.isEmpty()){
//绘制中间data
drawCenterText(canvas);
//绘制上方data
for(inti=1;i=itemCount){
index=index-itemCount;
}
if(index<0){
index=index+itemCount;
}
Stringtext=itemList.get(index);
intitemHeight=getHeight()/(SHOW_SIZE*2+1);
floatd=itemHeight*position+type*mMoveLen;
floaty=centerY+type*d;
FontMetricsIntfmi=mPaint.getFontMetricsInt();
floatbaseline=(float)(y-(fmi.bottom/2.0+fmi.top/2.0));
canvas.drawText(text,centerX,baseline,mPaint);
}
@Override
publicvoidsetBackground(Drawablebackground){
background=newDrawable(){
@Override
publicvoiddraw(Canvascanvas){
itemHeight=getHeight()/(SHOW_SIZE*2+1);
intwidth=getWidth();
canvas.drawLine(0,itemHeight,width,itemHeight,centerLinePaint);
canvas.drawLine(0,itemHeight*2,width,itemHeight*2,centerLinePaint);
centerLinePaint.setColor(getResources().getColor(R.color.wheel_bg));
RecttopRect=newRect(0,0,width,itemHeight);
canvas.drawRect(topRect,centerLinePaint);
RectbottomRect=newRect(0,itemHeight*2,width,itemHeight*3);
canvas.drawRect(bottomRect,centerLinePaint);
}
@Override
publicvoidsetAlpha(intalpha){
}
@Override
publicvoidsetColorFilter(ColorFiltercf){
}
@Override
publicintgetOpacity(){
return0;
}
};
super.setBackground(background);
}
@Override
publicbooleanonTouchEvent(MotionEventevent){
switch(event.getActionMasked()){
caseMotionEvent.ACTION_DOWN:
doDown(event);
break;
caseMotionEvent.ACTION_MOVE:
doMove(event);
break;
caseMotionEvent.ACTION_UP:
doUp();
break;
default:
break;
}
returntrue;
}
privatevoiddoDown(MotionEventevent){
if(mTask!=null){
mTask.cancel();
mTask=null;
}
mLastDownY=event.getY();
}
privatevoiddoMove(MotionEventevent){
mMoveLen+=(event.getY()-mLastDownY);
if(mMoveLen>itemHeight/2){
//往下滑超过离开距离
mMoveLen=mMoveLen-itemHeight;
currentItem--;
if(currentItem<0){
currentItem=itemCount-1;
}
}elseif(mMoveLen<-itemHeight/2){
//往上滑超过离开距离
mMoveLen=mMoveLen+itemHeight;
currentItem++;
if(currentItem>=itemCount){
currentItem=0;
}
}
mLastDownY=event.getY();
invalidate();
}
privatevoiddoUp(){
//抬起手后mCurrentSelected的位置由当前位置move到中间选中位置
if(Math.abs(mMoveLen)<0.0001){
mMoveLen=0;
return;
}
if(mTask!=null){
mTask.cancel();
mTask=null;
}
if(null==timer){
timer=newTimer();
}
mTask=newMyTimerTask(updateHandler);
timer.schedule(mTask,0,10);
}
classMyTimerTaskextendsTimerTask{
Handlerhandler;
publicMyTimerTask(Handlerhandler){
this.handler=handler;
}
@Override
publicvoidrun(){
handler.sendMessage(handler.obtainMessage());
}
}
privatevoidperformSelect(){
if(mSelectListener!=null){
mSelectListener.onSelect(currentItem,itemList.get(currentItem));
}else{
Log.i(TAG,"nulllistener");
}
}
publicinterfaceSelectListener{
voidonSelect(intindex,Stringtext);
}
}
2.然后是时间选择控件的样式工具类
/**
*时间选择样式
*authorLH
*data2016/9/411:05
*/
publicclassWheelStyle{
publicstaticfinalintminYear=1980;
publicstaticfinalintmaxYear=2020;
/**
*WheelStyleHour
*/
publicstaticfinalintSTYLE_HOUR=1;
/**
*WheelStyleMinute
*/
publicstaticfinalintSTYLE_MINUTE=2;
/**
*WheelStyleYear
*/
publicstaticfinalintSTYLE_YEAR=3;
/**
*WheelStyleMonth
*/
publicstaticfinalintSTYLE_MONTH=4;
/**
*WheelStyleDay
*/
publicstaticfinalintSTYLE_DAY=5;
/**
*WheelStyleSimpleDay
*/
publicstaticfinalintSTYLE_SIMPLE_DAY=6;
/**
*WheelStyleSetWarn
*/
publicstaticfinalintSTYLE_SET_WARN=7;
/**
*WheelStyleWorkAnswer
*/
publicstaticfinalintSTYLE_WORK_ANSWER=8;
privateWheelStyle(){
}
publicstaticListgetItemList(Contextcontext,intStyle){
if(Style==STYLE_HOUR){
returncreateHourString();
}elseif(Style==STYLE_MINUTE){
returncreateMinuteString();
}elseif(Style==STYLE_YEAR){
returncreateYearString();
}elseif(Style==STYLE_MONTH){
returncreateMonthString();
}elseif(Style==STYLE_DAY){
returncreateDayString();
}elseif(Style==STYLE_SIMPLE_DAY){
returncreateSimpleDayString();
}elseif(Style==STYLE_SET_WARN){
returncreateSetWarnTimeString();
}else{
thrownewIllegalArgumentException("styleisillegal");
}
}
privatestaticListcreateHourString(){
ListwheelString=newArrayList<>();
for(inti=0;i<24;i++){
wheelString.add(String.format("%02d"+"时",i));
}
returnwheelString;
}
privatestaticListcreateMinuteString(){
ListwheelString=newArrayList<>();
for(inti=0;i<60;i++){
wheelString.add(String.format("%02d"+"分",i));
}
returnwheelString;
}
privatestaticListcreateYearString(){
ListwheelString=newArrayList<>();
for(inti=minYear;i<=maxYear;i++){
wheelString.add(Integer.toString(i));
}
returnwheelString;
}
privatestaticListcreateMonthString(){
ListwheelString=newArrayList<>();
for(inti=1;i<=12;i++){
wheelString.add(String.format("%02d"+"月",i));
}
returnwheelString;
}
privatestaticListcreateDayString(){
ListwheelString=newArrayList<>();
for(inti=1;i<=31;i++){
wheelString.add(String.format("%02d"+"日",i));
}
returnwheelString;
}
privatestaticListcreateSimpleDayString(){
ListwheelString=newArrayList<>();
wheelString.add("一天后");
wheelString.add("两天后");
wheelString.add("三天后");
returnwheelString;
}
privatestaticListcreateSetWarnTimeString(){
ListwheelString=newArrayList<>();
wheelString.add("30分钟");
wheelString.add("60分钟");
wheelString.add("90分钟");
wheelString.add("120分钟");
returnwheelString;
}
/**
*计算闰月
*
*@parammonth
*@return
*/
privatestaticbooleanisLeapMonth(intmonth){
returnmonth==1||month==3||month==5||month==7
||month==8||month==10||month==12;
}
/**
*计算闰年
*
*@paramyear
*@return
*/
privatestaticbooleanisLeapYear(intyear){
return(year%4==0&&year%100!=0)||year%400==0;
}
}
3.使用的xml
4.在Java文件中设置mWheelView.setWheelStyle(WheelStyle.STYLE_YEAR);就可以显示WheelStyle类中设置的类型了。这个类中的样式种类读者可以根据自己的需要自行添加。
5.获取当前选择的项也很简单mWheelView.getCurrentItem();就能获取到控件的当前选择的项。获取到所在的项以后剩下的就是逻辑操作了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。