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"); } } privatestaticList createHourString(){ List wheelString=newArrayList<>(); for(inti=0;i<24;i++){ wheelString.add(String.format("%02d"+"时",i)); } returnwheelString; } privatestaticList createMinuteString(){ List wheelString=newArrayList<>(); for(inti=0;i<60;i++){ wheelString.add(String.format("%02d"+"分",i)); } returnwheelString; } privatestaticList createYearString(){ List wheelString=newArrayList<>(); for(inti=minYear;i<=maxYear;i++){ wheelString.add(Integer.toString(i)); } returnwheelString; } privatestaticList createMonthString(){ List wheelString=newArrayList<>(); for(inti=1;i<=12;i++){ wheelString.add(String.format("%02d"+"月",i)); } returnwheelString; } privatestaticList createDayString(){ List wheelString=newArrayList<>(); for(inti=1;i<=31;i++){ wheelString.add(String.format("%02d"+"日",i)); } returnwheelString; } privatestaticList createSimpleDayString(){ List wheelString=newArrayList<>(); wheelString.add("一天后"); wheelString.add("两天后"); wheelString.add("三天后"); returnwheelString; } privatestaticList createSetWarnTimeString(){ List wheelString=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();就能获取到控件的当前选择的项。获取到所在的项以后剩下的就是逻辑操作了。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。