亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS自定義時間滾動選擇控件

2020-07-26 02:20:06
字體:
來源:轉載
供稿:網友

本文實例為大家分享了iOS自定義時間滾動選擇控件的具體代碼,供大家參考,具體內容如下

1.先上自定義的控件:

/** * 滾輪選擇器 * author LH * data 2016/8/20 17:26 */public class WheelView extends View {  public static final String TAG = "WheelView";  /** * 自動回滾到中間的速度 */ public static final float SPEED = 2;  /** * 除選中item外,上下各需要顯示的備選項數目 */ public static final int SHOW_SIZE = 1;  private Context context;  private List<String> itemList; private int itemCount;  /** * item高度 */ private int itemHeight = 50;  /** * 選中的位置,這個位置是mDataList的中心位置,一直不變 */ private int currentItem;  private Paint selectPaint; private Paint mPaint; // 畫背景圖中單獨的畫筆 private Paint centerLinePaint;  private float centerY; private float centerX;  private float mLastDownY; /** * 滑動的距離 */ private float mMoveLen = 0; private boolean isInit = false; private SelectListener mSelectListener; private Timer timer; private MyTimerTask mTask;  Handler updateHandler = new Handler() {  @Override public void handleMessage(Message msg) {  if (Math.abs(mMoveLen) < SPEED) {  // 如果偏移量少于最少偏移量  mMoveLen = 0;  if (null != timer) {   timer.cancel();   timer.purge();   timer = null;  }  if (mTask != null) {   mTask.cancel();   mTask = null;   performSelect();  }  } else {  // 這里mMoveLen / Math.abs(mMoveLen)是為了保有mMoveLen的正負號,以實現上滾或下滾  mMoveLen = mMoveLen - mMoveLen / Math.abs(mMoveLen) * SPEED;  }  invalidate(); }  };  public WheelView(Context context) { super(context); init(context); }  public WheelView(Context context, AttributeSet attrs) { super(context, attrs); init(context); }  public void setOnSelectListener(SelectListener listener) { mSelectListener = listener; }  public void setWheelStyle(int style) { itemList = WheelStyle.getItemList(context, style); if (itemList != null) {  itemCount = itemList.size();  resetCurrentSelect();  invalidate(); } else {  Log.i(TAG, "item is null"); } }  public void setWheelItemList(List<String> itemList) { this.itemList = itemList; if (itemList != null) {  itemCount = itemList.size();  resetCurrentSelect(); } else {  Log.i(TAG, "item is null"); } }  private void resetCurrentSelect() { if (currentItem < 0) {  currentItem = 0; } while (currentItem >= itemCount) {  currentItem--; } if (currentItem >= 0 && currentItem < itemCount) {  invalidate(); } else {  Log.i(TAG, "current item is invalid"); } }  public int getItemCount() { return itemCount; } /** * 選擇選中的item的index * author LH * data 2016/9/4 11:09 */ public void setCurrentItem(int selected) { currentItem = selected; resetCurrentSelect(); }  public int getCurrentItem() { return currentItem; }  @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int mViewHeight = getMeasuredHeight(); int mViewWidth = getMeasuredWidth(); centerX = (float) (mViewWidth / 2.0); centerY = (float) (mViewHeight / 2.0);  isInit = true; invalidate(); }   private void init(Context context) { this.context = context;  timer = new Timer(); itemList = new ArrayList<>();  mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setStyle(Style.FILL); mPaint.setTextAlign(Align.CENTER); mPaint.setColor(getResources().getColor(R.color.wheel_unselect_text)); int size1 = (int) (SupportDisplay.getLayoutScale()*22+0.5); mPaint.setTextSize(size1);  selectPaint = new Paint(Paint.ANTI_ALIAS_FLAG); selectPaint.setStyle(Style.FILL); selectPaint.setTextAlign(Align.CENTER); selectPaint.setColor(getResources().getColor(R.color.color_1a1a1a)); int size2 = (int) (SupportDisplay.getLayoutScale()*24+0.5); selectPaint.setTextSize(size2);  centerLinePaint = new Paint(Paint.ANTI_ALIAS_FLAG); centerLinePaint.setStyle(Style.FILL); centerLinePaint.setTextAlign(Align.CENTER); centerLinePaint.setColor(getResources().getColor(R.color.wheel_unselect_text));  // 繪制背景 setBackground(null); }  @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (isInit) {  drawData(canvas); } }  private void drawData(Canvas canvas) { // 先繪制選中的text再往上往下繪制其余的text if (!itemList.isEmpty()) {  // 繪制中間data  drawCenterText(canvas);  // 繪制上方data  for (int i = 1; i < SHOW_SIZE + 1; i++) {  drawOtherText(canvas, i, -1);  }  // 繪制下方data  for (int i = 1; i < SHOW_SIZE + 1; i++) {  drawOtherText(canvas, i, 1);  } } }  private void drawCenterText(Canvas canvas) { // text居中繪制,注意baseline的計算才能達到居中,y值是text中心坐標 float y = centerY + mMoveLen; FontMetricsInt fmi = selectPaint.getFontMetricsInt(); float baseline = (float) (y - (fmi.bottom / 2.0 + fmi.top / 2.0)); canvas.drawText(itemList.get(currentItem), centerX, baseline, selectPaint); }  /** * 繪制文本 * author LH * data 2016/9/4 11:10 * @param canvas 畫布 * @param position 距離mCurrentSelected的差值 * @param type 1表示向下繪制,-1表示向上繪制 */ private void drawOtherText(Canvas canvas, int position, int type) { int index = currentItem + type * position; if (index >= itemCount) {  index = index - itemCount; } if (index < 0) {  index = index + itemCount; } String text = itemList.get(index);  int itemHeight = getHeight() / (SHOW_SIZE * 2 + 1); float d = itemHeight * position + type * mMoveLen; float y = centerY + type * d;  FontMetricsInt fmi = mPaint.getFontMetricsInt(); float baseline = (float) (y - (fmi.bottom / 2.0 + fmi.top / 2.0)); canvas.drawText(text, centerX, baseline, mPaint); }  @Override public void setBackground(Drawable background) { background = new Drawable() {  @Override  public void draw(Canvas canvas) {  itemHeight = getHeight() / (SHOW_SIZE * 2 + 1);  int width = 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));  Rect topRect = new Rect(0, 0, width, itemHeight);  canvas.drawRect(topRect, centerLinePaint);  Rect bottomRect = new Rect(0, itemHeight * 2, width, itemHeight * 3);  canvas.drawRect(bottomRect, centerLinePaint);  }   @Override  public void setAlpha(int alpha) {   }   @Override  public void setColorFilter(ColorFilter cf) {   }   @Override  public int getOpacity() {  return 0;  } }; super.setBackground(background); }  @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getActionMasked()) {  case MotionEvent.ACTION_DOWN:  doDown(event);  break;  case MotionEvent.ACTION_MOVE:  doMove(event);  break;  case MotionEvent.ACTION_UP:  doUp();  break;  default:  break; } return true; }  private void doDown(MotionEvent event) { if (mTask != null) {  mTask.cancel();  mTask = null; } mLastDownY = event.getY(); }  private void doMove(MotionEvent event) {  mMoveLen += (event.getY() - mLastDownY); if (mMoveLen > itemHeight / 2) {  // 往下滑超過離開距離  mMoveLen = mMoveLen - itemHeight;  currentItem--;  if (currentItem < 0) {  currentItem = itemCount - 1;  } } else if (mMoveLen < -itemHeight / 2) {  // 往上滑超過離開距離  mMoveLen = mMoveLen + itemHeight;  currentItem++;  if (currentItem >= itemCount) {  currentItem = 0;  } }  mLastDownY = event.getY(); invalidate(); }  private void doUp() { // 抬起手后mCurrentSelected的位置由當前位置move到中間選中位置 if (Math.abs(mMoveLen) < 0.0001) {  mMoveLen = 0;  return; } if (mTask != null) {  mTask.cancel();  mTask = null; } if (null == timer) {  timer = new Timer(); } mTask = new MyTimerTask(updateHandler); timer.schedule(mTask, 0, 10); }  class MyTimerTask extends TimerTask { Handler handler;  public MyTimerTask(Handler handler) {  this.handler = handler; }  @Override public void run() {  handler.sendMessage(handler.obtainMessage()); }  }  private void performSelect() { if (mSelectListener != null) {  mSelectListener.onSelect(currentItem, itemList.get(currentItem)); } else {  Log.i(TAG, "null listener"); } }  public interface SelectListener { void onSelect(int index, String text); } }

2.然后是時間選擇控件的樣式工具類

/** * 時間選擇樣式 * author LH * data 2016/9/4 11:05 */public class WheelStyle {  public static final int minYear = 1980; public static final int maxYear = 2020;  /** * Wheel Style Hour */ public static final int STYLE_HOUR = 1; /** * Wheel Style Minute */ public static final int STYLE_MINUTE = 2; /** * Wheel Style Year */ public static final int STYLE_YEAR = 3; /** * Wheel Style Month */ public static final int STYLE_MONTH = 4; /** * Wheel Style Day */ public static final int STYLE_DAY = 5; /** * Wheel Style Simple Day */ public static final int STYLE_SIMPLE_DAY = 6; /** * Wheel Style Set Warn */ public static final int STYLE_SET_WARN = 7; /** * Wheel Style Work Answer */ public static final int STYLE_WORK_ANSWER = 8;  private WheelStyle() { }  public static List<String> getItemList(Context context, int Style) { if (Style == STYLE_HOUR) {  return createHourString(); } else if (Style == STYLE_MINUTE) {  return createMinuteString(); } else if (Style == STYLE_YEAR) {  return createYearString(); } else if (Style == STYLE_MONTH) {  return createMonthString(); } else if (Style == STYLE_DAY) {  return createDayString(); } else if (Style == STYLE_SIMPLE_DAY) {  return createSimpleDayString(); } else if (Style == STYLE_SET_WARN) {  return createSetWarnTimeString(); } else {  throw new IllegalArgumentException("style is illegal"); } }  private static List<String> createHourString() { List<String> wheelString = new ArrayList<>(); for (int i = 0; i < 24; i++) {  wheelString.add(String.format("%02d" + "時", i)); } return wheelString; }  private static List<String> createMinuteString() { List<String> wheelString = new ArrayList<>(); for (int i = 0; i < 60; i++) {  wheelString.add(String.format("%02d" + "分", i)); } return wheelString; }  private static List<String> createYearString() { List<String> wheelString = new ArrayList<>(); for (int i = minYear; i <= maxYear; i++) {  wheelString.add(Integer.toString(i)); } return wheelString; }  private static List<String> createMonthString() { List<String> wheelString = new ArrayList<>(); for (int i = 1; i <= 12; i++) {  wheelString.add(String.format("%02d" + "月", i)); } return wheelString; }  private static List<String> createDayString() { List<String> wheelString = new ArrayList<>(); for (int i = 1; i <= 31; i++) {  wheelString.add(String.format("%02d" + "日", i)); } return wheelString; }  private static List<String> createSimpleDayString() { List<String> wheelString = new ArrayList<>(); wheelString.add("一天后"); wheelString.add("兩天后"); wheelString.add("三天后"); return wheelString; }  private static List<String> createSetWarnTimeString() { List<String> wheelString = new ArrayList<>(); wheelString.add("30分鐘"); wheelString.add("60分鐘"); wheelString.add("90分鐘"); wheelString.add("120分鐘"); return wheelString; } /** * 計算閏月 * * @param month * @return */ private static boolean isLeapMonth(int month) { return month == 1 || month == 3 || month == 5 || month == 7  || month == 8 || month == 10 || month == 12; }  /** * 計算閏年 * * @param year * @return */ private static boolean isLeapYear(int year) { return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0; }}

3.使用的xml

<com.example.view.timeview.WheelView  android:id="@+id/select_time_simple_wheel"  android:layout_width="match_parent"  android:layout_height="150dp"  android:layout_marginLeft="20dp"  android:layout_marginRight="20dp"  android:layout_weight="1" />

4.在Java文件中設置mWheelView.setWheelStyle(WheelStyle.STYLE_YEAR);就可以顯示WheelStyle類中設置的類型了。這個類中的樣式種類讀者可以根據自己的需要自行添加。

5.獲取當前選擇的項也很簡單mWheelView.getCurrentItem();就能獲取到控件的當前選擇的項。獲取到所在的項以后剩下的就是邏輯操作了。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美福利视频在线| 一区二区欧美日韩视频| 播播国产欧美激情| 欧美电影在线观看完整版| 夜夜狂射影院欧美极品| 国产日韩一区在线| 国产91色在线|| 国产精品入口福利| 国产美女主播一区| 91国产精品视频在线| 成人免费视频在线观看超级碰| 精品久久久一区| 欧美精品久久久久久久免费观看| 亚洲影影院av| 性金发美女69hd大尺寸| 国产91在线播放九色快色| 国产美女久久精品| 亚洲成人av片在线观看| 日韩av日韩在线观看| 91老司机精品视频| 国产亚洲欧美日韩一区二区| 91午夜在线播放| 国产精品第3页| 国产成人久久久| 亚洲国产精品美女| 欧美一区二区三区精品电影| 亚洲国产一区二区三区四区| 亚洲精品久久久久久久久| 亚洲日本欧美中文幕| 福利精品视频在线| 亚洲精品久久久久久久久久久久久| 欧美国产亚洲视频| 欧美极品美女视频网站在线观看免费| 欧美日韩一区二区精品| 久久免费视频观看| 亚洲免费人成在线视频观看| 欧美日韩国产页| 色妞欧美日韩在线| 欧美一区二区三区艳史| 国产免费亚洲高清| 91久久久久久久久久久久久| 午夜精品免费视频| 日韩精品在线私人| 欧美大片在线免费观看| 在线视频日本亚洲性| 欧美理论电影在线播放| 2019中文字幕在线观看| 亚洲激情视频网站| 日本电影亚洲天堂| 91精品国产色综合| 亚洲午夜久久久影院| 国产精品高潮呻吟久久av黑人| 国产玖玖精品视频| 亚洲性无码av在线| 91成人精品网站| 欧美午夜精品久久久久久久| xxav国产精品美女主播| 久久97精品久久久久久久不卡| 北条麻妃一区二区三区中文字幕| 欧美激情精品久久久久久大尺度| 91久久久久久久久久久久久| 成人a视频在线观看| 亚洲精品白浆高清久久久久久| 久久久久久久97| 91亚洲国产成人精品性色| 欧美精品www在线观看| 成人在线中文字幕| 久久中国妇女中文字幕| 国精产品一区一区三区有限在线| 欧美成人免费在线观看| www.日韩视频| 日产日韩在线亚洲欧美| 欧美极品少妇全裸体| 26uuu亚洲伊人春色| 久久久久国产视频| 狠狠爱在线视频一区| 国产精品久久久91| 久99九色视频在线观看| 国产精品草莓在线免费观看| 成人激情av在线| 日韩高清中文字幕| 国产精品视频自在线| 日韩精品在线观看一区二区| 亚洲欧美制服另类日韩| 日韩欧美在线视频日韩欧美在线视频| 奇米四色中文综合久久| www.日本久久久久com.| 成年无码av片在线| 97人人模人人爽人人喊中文字| 一区二区三区 在线观看视| 国产精品美腿一区在线看| 国产欧美婷婷中文| 91高潮精品免费porn| 亚洲成人激情图| 亚洲欧美国产高清va在线播| 81精品国产乱码久久久久久| 精品美女久久久久久免费| 亚洲国产另类久久精品| 日韩免费在线观看视频| 成人写真福利网| 欧美孕妇孕交黑巨大网站| 欧美性生交大片免费| 亚洲国产精品视频在线观看| 久久久久久久久久久免费精品| 欧美激情在线观看视频| 一色桃子一区二区| 久久999免费视频| 中文字幕久热精品在线视频| 视频在线观看99| 久久久久国色av免费观看性色| 亚洲日本中文字幕| 日韩国产激情在线| 精品香蕉一区二区三区| 国产婷婷色综合av蜜臀av| 91精品中文在线| 国产97在线视频| 精品亚洲aⅴ在线观看| 亚洲一区二区三区在线免费观看| 久久影视三级福利片| 中文字幕精品久久| 亚洲精品网址在线观看| 92国产精品久久久久首页| 日韩在线视频线视频免费网站| 亚洲综合在线做性| 精品成人久久av| 日韩成人在线播放| 人人爽久久涩噜噜噜网站| 亚洲第一中文字幕| 亚洲精品动漫久久久久| 亚洲国产精品yw在线观看| 久久久久久久久久久成人| 精品色蜜蜜精品视频在线观看| 国产精品免费电影| 午夜精品福利视频| 欧美精品久久久久久久| 欧美黑人国产人伦爽爽爽| 久久精品视频中文字幕| 欧美日韩在线观看视频| 97久久伊人激情网| 久久亚洲一区二区三区四区五区高| 欧美视频在线观看 亚洲欧| 国内偷自视频区视频综合| 亚洲欧美www| 亚洲一二在线观看| 中文字幕日韩av电影| 亚洲成人性视频| 久久精品福利视频| 亚洲天堂成人在线视频| 91po在线观看91精品国产性色| 国产精品成人v| 91九色蝌蚪国产| 日韩成人高清在线| 久久久成人av| 国产一区二区三区三区在线观看| 成人免费淫片aa视频免费| 国产精品久久久久久久久久小说| 国产精品日韩欧美| 中文字幕av日韩| 国产精品国模在线| 日韩中文字幕在线免费观看| 日韩中文字幕网址| 成人激情黄色网| 欧美性感美女h网站在线观看免费| 日韩精品极品毛片系列视频|