欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-03-01 08:09:40
本文github代码链接 https://github.com/androidmsky/andoirdiospicker 先上图吧: 这是笔者最近一个项目一直再...

本文github代码链接

https://github.com/androidmsky/andoirdiospicker

先上图吧:

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

这是笔者最近一个项目一直再用的一个选择器库,自己也在其中做了修改,并决定持续维护下去。

先看使用方法:

日期选择:

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