Android底部日期控件,Android开发中实现IOS风格底部选择器(支持时间 日期 自定义)...
本文Github代码链接
先上图吧:
这是笔者最近一个项目一直再用的一个选择器库,自己也在其中做了修改,并决定持续维护下去。
先看使用方法:
日期选择:
private void showDateDialog(List 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 list = new ArrayList<>();
然后调用时候传入这个list就可以了
/**
* chooseDialog
*/
private void showChooseDialog(List 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风格底部选择器(支持时间 日期 自定义),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
Android底部日期控件,Android开发中实现IOS风格底部选择器(支持时间 日期 自定义)...相关推荐
- android遥控杆控件,Android自定义滑杆控件SeekBar多功能版本
在应用开发中有没有遇到过通过滑杆控件选择一些区间条件实现参数变化?今天我们就来自定义View实现一个多功能又实用的版本SeekBar. Paste_Image.png ](http://upload- ...
- android studio 画控件,Android Studio 基础控件使用
TextView android:gravity="center" //文字对其方式 top bottom left right center android:textColor= ...
- extjs 获取日期控件的值_Extjs的datefield怎么获取当前系统时间所属月月初到月末...
匿名用户 1级 2016-10-14 回答 日期控件: new Ext.form.DateField( { fieldLabel : '开始日期', id : 'beginDate', width : ...
- android 怎么固定控件,Android中如何使控件保持固定宽高比
我们在android开发过程中可能会遇到一种情况,一个组件需要保持固定的宽高比,但是组件本身大小却不定.尤其在android屏幕碎片化的情况下,很多时候我们需要让一个组件宽度与屏幕宽度一致,这样就无法 ...
- android design包控件,Android Design包之TextInputLayout和TextInputEditText的组合使用【原创】...
在Android的日常开发中,EditText是个不可或缺的控件之一,作为输入框,用法也没什么太多值得可说的,拿一个简单的登录界面为例,平时差不多是这样的布局: 一般来说是这样,EditText里面的 ...
- android 条码扫描控件,Android Zxing条码扫描自定义控件(附代码)
团队要做一个项目,里面要用到条码扫描,搜了一下,知道了Zxing.这是一个开源的条码扫描程序.官方网站有完整的Android程序可下载.但是,如果想将扫描功能融合在自己开发的程序里,则需要理清设计的思 ...
- android日历价格控件,Android 自定义价格日历控件
介绍 上个星期项目有一个日历价格的需求,类似一个商品在不同的日期价格可能会不同,由于时间给得特别紧所以打算找个合适的开源项目进行修改.参考了网上大多数是通过继承view直接draw一个monthVie ...
- android基础ui控件,Android基础——基础UI控件
日历,时钟,计时器 package com.example.mybaseuii; import androidx.appcompat.app.AppCompatActivity; import and ...
- android显示网络图片控件,Android控件之ImageView(二)
前言 在上一篇文章中,我们讲解了如何加载本地图片,那么在实际项目中 ImageView 大多数使用场景是加载网络图片,网络图片其实就是存储在服务器上的文件,我们需要从服务器获取到文件的二进制输入流 I ...
最新文章
- angularjs php上传文件,AngularJS 文件上传 的功能你了解的多少?几分钟就让你了解angularjs的文件上传...
- 微信小程序项目,实现图书搜索组件完善
- excel 打开显示安装office自定义项 安装期间出错
- 单变量线性回归程序实现
- (022)[工具软件]图片浏览 JPEGView
- 学习Windows编程遇到的问题
- 【转】ctypes库的使用整理
- android:id = @+id 用法,@+id/android:list和@android:id/list的写法
- 【HTML5】页面传递参数给下一个页面
- C#把Xml转换为DataSet的两种方法
- linux shell pattern,shell 三剑客之 sed pattern 详解
- js正则判断域名和IP的端口路径是否正确
- 十二烷基硫酸钠(SDS)将Fe3O4磁性纳米粒子定量地修饰到多壁碳纳米管|化学试剂
- frp内网穿透SSH
- 探索Java中empty()与isEmpty()的区别
- 单片机实例2——模拟开关灯(硬件电路图+汇编程序+C语言程序)
- python带你制作随机点名系统,超级简单
- ntp计算机系统时间总是跳,电脑时间老是自动跳的解决方法 电脑时间每小时自动校准方法的图文教程...
- 第一章cp2102 USB to UART controller 的安装
- EasyNVR如何设置视频录像保存在30天以上?
热门文章
- 数据库原理(一)—— 关系代数(二)
- 也谈压缩感知(compressive sensing)
- 自学python买什么书比较好-python官方推荐30本面向初学者的书籍!你看过几本?...
- python是什么意思中文、好学吗-爬虫Python入门好学吗?学什么?
- 学python后到底能干什么-学Python后到底能干什么
- python利器-python利器app下载-python利器手机版 _5577安卓网
- python入门经典100例-【python】编程语言入门经典100例--25
- 国外巨头鏖战的新领域——语音识别
- 语音自训练平台技术详解,快速训练专属语音识别模型
- java后端面试经验(自用收藏)