当前位置: 移动技术网 > 移动技术>移动开发>Android > Android开发中实现IOS风格底部选择器(支持时间 日期 自定义)

Android开发中实现IOS风格底部选择器(支持时间 日期 自定义)

2019年07月24日  | 移动技术网移动技术  | 我要评论

本文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风格底部选择器(支持时间 日期 自定义),希望对大家有所帮助

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网