Android开发中实现IOS风格底部选择器(支持时间 日期 自定义)
程序员文章站
2024-02-28 15:09:04
本文github代码链接
https://github.com/androidmsky/andoirdiospicker
先上图吧:
这是笔者最近一个项目一直再...
本文github代码链接
https://github.com/androidmsky/andoirdiospicker
先上图吧:
这是笔者最近一个项目一直再用的一个选择器库,自己也在其中做了修改,并决定持续维护下去。
先看使用方法:
日期选择:
private void showdatedialog(list<integer> date) { datepickerdialog.builder builder = new datepickerdialog.builder(this); builder.setondateselectedlistener(new datepickerdialog.ondateselectedlistener() { @override public void ondateselected(int[] dates) { mtextview.settext(dates[0] + "-" + (dates[1] > 9 ? dates[1] : ("0" + dates[1])) + "-" + (dates[2] > 9 ? dates[2] : ("0" + dates[2]))); } @override public void oncancel() { } }) .setminyear(1900) .setmaxyear(2050) .setselectyear(date.get(0) - 1) .setselectmonth(date.get(1) - 1) .setselectday(date.get(2) - 1); builder.setmaxyear(dateutil.getyear()); builder.setmaxmonth(dateutil.getdateforstring(dateutil.gettoday()).get(1)); builder.setmaxday(dateutil.getdateforstring(dateutil.gettoday()).get(2)); datedialog = builder.create(); datedialog.show(); }
比较简单就不解释了
自定义选择:
先搞一个list
private list<string> list = new arraylist<>();
然后调用时候传入这个list就可以了
/** * choosedialog */ private void showchoosedialog(list<string> mlist) { datapickerdialog.builder builder = new datapickerdialog.builder(this); choosedialog = builder.setdata(mlist).setselection(1).settitle("取消") .setondataselectedlistener(new datapickerdialog.ondataselectedlistener() { @override public void ondataselected(string itemvalue, int position) { mtextview.settext(itemvalue); } @override public void oncancel() { } }).create(); choosedialog.show(); }
接下来我们就那timepick开刀简单分析下其中的原理,也方便我们做自定义的扩展。
首先打开timepickerdialog可见继承自dialog对自定义dialog还不熟悉的可以看:
安卓下builder模式解析+自定义dialog实战演练
http://blog.csdn.net/androidmsky/article/details/52982815
public class timepickerdialog extends dialog
肯定这中dialog都会使用builder模式,接下来看里面的字段
private static final class params { private boolean shadow = true; private boolean cancancel = true; private loopview loophour, loopmin; private ontimeselectedlistener callback; }
看到主力军是两个loopview来表示小时和分钟,接下来我们就要看loopview这类了,进去会发现比较庞大有一脸的参数。不用怕,我们直接来到它的两个最关键的方法,
protected void ondraw(canvas canvas)
可以看到就是在把文字画出来也不要怕反反复复就那么几个方法:
核心就是它 canvas.drawtext(as[j1], startx, h, paintb);
在几种情况下调用它,肯定就是12345个位置数字不同的样式
if (i2 <= n && h + i2 >= n) { canvas.save(); canvas.cliprect(0, 0, v, n - i2); canvas.drawtext(as[j1], startx, h, painta); canvas.restore(); canvas.save(); canvas.cliprect(0, n - i2, v, (int) ((float) h * l)); canvas.drawtext(as[j1], startx, h, paintb); canvas.restore(); } else if (i2 <= o && h + i2 >= o) { canvas.save(); canvas.cliprect(0, 0, v, o - i2); canvas.drawtext(as[j1], startx, h, paintb); canvas.restore(); canvas.save(); canvas.cliprect(0, o - i2, v, (int) ((float) h * l)); canvas.drawtext(as[j1], startx, h, painta); canvas.restore(); } else if (i2 >= n && h + i2 <= o) { canvas.cliprect(0, 0, v, (int) ((float) h * l)); canvas.drawtext(as[j1], startx, h, paintb); mselectitem = arraylist.indexof(as[j1]); } else { canvas.cliprect(0, 0, v, (int) ((float) h * l)); canvas.drawtext(as[j1], startx, h, painta); } canvas.restore();
下一个关键方法就是:
public boolean ontouchevent(motionevent motionevent)
通过手指的移动改变绘制的偏移值:
case motionevent.action_move: y = motionevent.getrawy(); z = x - y; x = y; totalscrolly = (int) ((float) totalscrolly + z); if (!isloop) { if (totalscrolly > (int) ((float) (-positon) * (l * (float) h))) { break; /* loop/switch isn't completed */ } totalscrolly = (int) ((float) (-positon) * (l * (float) h)); } break;
大概就是这种姿势去看开源自定义view了。
以上所述是小编给大家介绍的android开发中实现ios风格底部选择器(支持时间 日期 自定义),希望对大家有所帮助