[TOC]
第一步 在 build.gradle(Project:XXXX) 的 repositories 添加::
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
第二步 在 build.gradle(Module:app) 的 dependencies 添加:
dependencies {
implementation 'com.github.vivitale:BaseCore:latest.release'
}
第三步 使用方法,在Application中初始化:
Tool.init(this, BuildConfig.DEBUG);
// 已经整合进入BaseCore中的库
api 'com.android.support:support-v4:28.0.0'
api 'com.android.support:appcompat-v7:28.0.0'
api 'com.android.support:design:28.0.0'
api 'com.android.support:recyclerview-v7:28.0.0'
api 'com.android.support:cardview-v7:28.0.0'
api 'com.android.support:percent:28.0.0'
api 'com.android.support.constraint:constraint-layout:1.1.3'
// json相关
api 'com.google.code.gson:gson:2.8.5'
// Knife
api 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1' //Java 的butterknife注解处理器
// RxJava
api 'io.reactivex.rxjava2:rxjava:2.1.14'
api 'io.reactivex.rxjava2:rxandroid:2.0.2'
api 'com.jakewharton.rxbinding2:rxbinding:2.0.0'
api 'com.trello.rxlifecycle2:rxlifecycle-components:2.1.0' // 包含android库和基础库
api 'com.trello.rxlifecycle2:rxlifecycle-kotlin:2.1.0' // 支持Kotlin语法的RxLifecycle基础库
api 'com.trello.rxlifecycle2:rxlifecycle-android-lifecycle-kotlin:2.1.0' //支持Kotlin语法的Android库
// EventBus
api 'org.greenrobot:eventbus:3.1.1'
//沉浸式
api 'com.readystatesoftware.systembartint:systembartint:1.0.4'
// 动画
api 'com.nineoldandroids:library:2.4.0'
api 'com.github.florent37:viewanimator:1.0.5'
//腾讯MMKV 取代sp
api 'com.tencent:mmkv:1.0.11'
// 依据项目情况需自行整合的库
// 网络请求
provided 'com.lzy.net:okgo:3.0.4' //可以单独使用,不需要依赖下方的扩展包
provided 'com.lzy.net:okrx2:2.0.2' //RxJava扩展支持,根据需要添加
provided 'com.lzy.net:okserver:2.0.5' //版本号使用 + 可以自动引用最新版
provided 'com.squareup.okhttp3:okhttp:3.8.1'
provided 'com.squareup.okio:okio:1.13.0'
// 图片工具glide
provided 'com.github.bumptech.glide:glide:4.7.1'
annotationProcessor 'com.github.bumptech.glide:compiler:4.7.1'
provided 'com.github.bumptech.glide:okhttp3-integration:4.7.1'
// RecyclerView适配器工具
provided 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.40'
provided 'cn.bingoogolapple:bga-baseadapter:1.2.9@aar'
// 轮播图
provided 'cn.bingoogolapple:bga-banner:2.2.4@aar'
// 二维码,一维码工具
provided 'cn.bingoogolapple:bga-qrcode-zxing:1.2.1'
provided 'cn.bingoogolapple:bga-qrcode-zbar:1.2.1'
// 图片选择、预览、九宫格图片控件、拖拽排序九宫格图片控件,需要同时选择 bga-baseadapter
provided 'cn.bingoogolapple:bga-photopicker:1.2.8@aar'
// 日历控件
// provided 'com.squareup:android-times-square:1.6.5@aar'
| 库名 | 简单说明 | GitHub | 使用方法 |
|---|---|---|---|
| Okgo | 网络请求框架 | Github | 使用方法 |
| ViewAnimator | 给View添加动画效果 | Github | 使用方法 |
| BaseRecyclerViewAdapterHelper | RecyclerView适配器简单化库 | Github | 使用方法 |
| BGABaseAdapter | AdapterView 和 RecyclerView 中通用的 Adapter 和 ViewHolder | Github | |
| BGABanner | 轮播图 | Github | |
| BGAQRCode | 条码工具库 | Github | |
| BGAPhotoPicker | 图片选择、预览等 | Github | |
| android-times-square | 日历工具 | Github |
- TODO 编辑MVP框架使用方法
| 方法名 | 说明 |
|---|---|
| addActivity | 添加Activity 到栈 |
| removeActivity | Activity退栈 |
| currentActivity | 获取当前的Activity(堆栈中最后一个压入的) |
| finishActivity | 结束当前Activity(堆栈中最后一个压入的) |
| finishAllActivity | 结束所有的Activity |
| AppExit | 退出当前APP |
| getActivityStack | 获取Activity栈 |
| isExistActivity | 判断是否存在指定Activity |
| isActivityExistsInStack | 打开的栈中是否存在指定Activity |
| launchActivity | 打开指定的Activity |
| skipActivity | 跳转到指定Activity |
| skipActivityAndFinish | 跳转到指定Activity并关闭当前Activity |
| skipActivityAndFinishAll | 跳转后Finish之前所有的Activity |
| skipActivityForResult | activityForResult封装 |
| getLauncherActivity | 获取launcher activity |
| 方法名 | 说明 |
|---|---|
| animationColorGradient | 颜色渐变动画 |
| cardFilpAnimation | 卡片翻转动画 |
| zoomIn | 缩小动画 |
| zoomOut | 放大动画 |
| ScaleUpDowm | 缩小放大动画 |
| animateHeight | 高度变化动画 |
| popup | 透明,大小,从0-1 |
| popout | 透明,大小,从1-0 |
| setAnimationListener | 设置动画结束监听事件 |
| 方法名 | 说明 |
|---|---|
| InstallAPK | 安装APK |
| installApp | 安装App(支持7.0) |
| installAppSilent | 静默安装App |
| uninstallApp | 卸载App |
| uninstallAppSilent | 静默卸载App |
| isAppRoot | 判断App是否有root权限 |
| launchApp | 打开App |
| getAppPackageName | 获取App包名 |
| getAppDetailsSettings | 获取App具体设置 |
| getAppName | 获取App名称 |
| getAppIcon | 获取App图标 |
| getAppPath | 获取App路径 |
| getAppVersionName | 获取App版本号 |
| getAppVersionCode | 获取App版本码 |
| isSystemApp | 判断App是否是系统应用 |
| isAppDebug | 判断App是否是Debug版本 |
| getAppSignature | 获取App签名 |
| getAppSignatureSHA1 | 获取应用签名的的SHA1值 |
| isInstallApp | 判断App是否安装 |
| getAppInfo | 获取当前App信息 |
| getBean | 得到AppInfo的Bean |
| getAllAppsInfo | 获取所有已安装App信息 |
| isAppBackground | 判断当前App处于前台还是后台 |
| relaunchApp | 重启APP |
| 方法名 | 说明 |
|---|---|
| setTransparentStatusBar | 设置透明状态栏(>=19) |
| hideStatusBar | 隐藏状态栏 |
| noTitle | 隐藏Title |
| FLAG_FULLSCREEN | 设置全屏 |
| getStatusBarHeight | 获取状态栏高度 |
| isStatusBarExists | 判断状态栏是否存在 |
| getActionBarHeight | 获取ActionBar高度 |
| showNotificationBar | 显示通知栏 |
| hideNotificationBar | 隐藏通知栏 |
| invokePanels | 反射唤醒通知栏 |
| transparencyBar | 修改状态栏为全透明(>=19) |
| setStatusBarColor | 修改状态栏颜色(>=19) |
| StatusBarLightMode | 设置状态栏黑色字体图标,适配4.4以上版本MIUIV、Flyme和6.0以上版本其他Android |
| StatusBarDarkMode | 清除MIUI或flyme或6.0以上版本状态栏黑色字体 |
| FlymeSetStatusBarLightMode | 设置状态栏图标为深色和魅族特定的文字风格 |
| MIUISetStatusBarLightMode | 设置状态栏字体图标为深色,需要MIUIV6以上 |
| 方法名 | 说明 |
|---|---|
| 图片转换 | |
| bitmap2Bytes | bitmap转byteArr |
| bytes2Bitmap | byteArr转bitmap |
| drawable2Bitmap | drawable转bitmap |
| bitmap2Drawable | bitmap转drawable |
| drawable2Bytes | drawable转byteArr |
| bytes2Drawable | byteArr转drawable |
| bitmap2Base64 | Bitmap转Base64 |
| base642Bitmap | Base64转Bitmap |
| view2Bitmap | View 转 Bitmap |
| 图片处理 | |
| getBitmap | 获取bitmap |
| scale | 缩放图片 |
| clip | 裁剪图片 |
| skew | 倾斜图片 |
| rotate | 旋转图片 |
| fillet | 指定图片的切边,对图片进行圆角处理 |
| getRotateDegree | 获取图片旋转角度 |
| toRound | 转为圆形图片 |
| toRoundCorner | 转为圆角图片 |
| fastBlur | 快速模糊 |
| renderScriptBlur | renderScript模糊图片(API大于17) |
| stackBlur | stack模糊图片 |
| addFrame | 添加颜色边框 |
| addReflection | 添加倒影 |
| addTextWatermark | 添加文字水印 |
| addImageWatermark | 添加图片水印 |
| toAlpha | 转为alpha位图 |
| toGray | 转为灰度图片 |
| getThumb | 获取缩略图 |
| zoomImage | 缩放图片 |
| copyCenterBitmap | 按指定宽高截取中间一段图片 |
| resourceIdToUri | 将资源ID转为Uri |
| resizeBitmap | 重新计算图片的最大尺寸 |
| 图片保存 | |
| save | 保存图片 |
| saveBitmap2FileZIP | 保存图片 |
| saveBitmap2File | 保存图片 |
| 图片压缩有关 | |
| compressByScale | 按缩放压缩 |
| compressByQuality | 按质量压缩 |
| compressBySampleSize | 按采样大小压缩 |
| compressImage | 压缩图片 |
| 其他 | |
| GetLocalOrNetBitmap | 得到本地或者网络上的bitmap |
| getBitmapByUrl | 下载图片 |
| calculateInSampleSize | 计算采样大小 |
| isImage | 根据文件名判断文件是否为图片 |
| getImageType | 获取图片类型 |
| 方法名 | 说明 |
|---|---|
| isAutoBrightnessEnabled | 判断是否开启自动调节亮度 |
| setAutoBrightnessEnabled | 设置是否开启自动调节亮度 |
| getBrightness | 获取屏幕亮度 |
| setBrightness | 设置屏幕亮度 |
| setWindowBrightness | 设置窗口亮度 |
| getWindowBrightness | 获取窗口亮度 |
| 方法名 | 说明 |
|---|---|
| initRegisterReceiverNetWork | 注册监听网络状态的广播 |
| 方法名 | 说明 |
|---|---|
| openFlashLight | 打开闪光灯 |
| closeFlashLight | 关闭闪光灯 |
| 方法名 | 说明 |
|---|---|
| copyText | 复制文本到剪贴板 |
| getText | 获取剪贴板的文本 |
| copyUri | 复制uri到剪贴板 |
| getUri | 获取剪贴板的uri |
| copyIntent | 复制意图到剪贴板 |
| getIntent | 获取剪贴板的意图 |
项目地址:https://github.com/android-notes/Cockroach
| 方法名 | 说明 |
|---|---|
| getColorById | 通过color的资源id获取Color的int |
| getColorByInt | int转Color的int |
| changeColorAlpha | 修改颜色透明度 |
| getAlphaPercent | 获取透明度 0.0 ~ 1.0 |
| adjustAlpha | 调整颜色的透明度 |
| colorAtLightness | 获取更加明亮的颜色 |
| lightnessOfColor | 获取更加明亮的颜色 |
| getHexString | 16进制的颜色值 |
| 方法名 | 说明 |
|---|---|
| 存储相关常量 | |
| BYTE | Byte与Byte的倍数 |
| KB | KB与Byte的倍数 |
| MB | MB与Byte的倍数 |
| GB | GB与Byte的倍数 |
| 时间相关常量 | |
| MSEC | 毫秒与毫秒的倍数 |
| SEC | 秒与毫秒的倍数 |
| MIN | 分与毫秒的倍数 |
| HOUR | 时与毫秒的倍数 |
| DAY | 天与毫秒的倍数 |
| 正则相关常量 | |
| REGEX_MOBILE_SIMPLE | 手机号(简单) |
| REGEX_MOBILE_EXACT | 手机号(精确) |
| REGEX_TEL | 电话号码 |
| REGEX_IDCARD15 | 身份证号码15位 |
| REGEX_IDCARD18 | 身份证号码18位 |
| REGEX_EMAIL | 邮箱 |
| REGEX_URL | URL |
| REGEX_CHZ | 汉字 |
| REGEX_USERNAME | 用户名,取值范围为a-z,A-Z,0-9,"",汉字,不能以""结尾,用户名必须是6-20位 |
| REGEX_DATE | yyyy-MM-dd格式的日期校验,已考虑平闰年 |
| REGEX_IP | IP地址 |
程序发生异常,会将异常信息保存到本地文件夹
| 方法名 | 说明 |
|---|---|
| cleanInternalCache | 清除本应用内部缓存(/data/data/com.xxx.xxx/cache) |
| cleanDatabases | 清除本应用所有数据库(/data/data/com.xxx.xxx/databases) |
| cleanSharedPreference | 清除本应用SharedPreference(/data/data/com.xxx.xxx/shared_prefs) |
| cleanDatabaseByName | 按名字清除本应用数据库 |
| cleanFiles | 清除/data/data/com.xxx.xxx/files下的内容 |
| cleanExternalCache | 清除外部cache下的内容(/mnt/sdcard/android/data/com.xxx.xxx/cache) |
| cleanCustomCache | 清除自定义路径下的文件,使用需小心,请不要误删。 |
| cleanApplicationData | 清除本应用所有的数据 |
| clearWebViewCache | 清理Webview缓存数据库 |
| getTotalCacheSize | 获取缓存大小 |
| clearAllCache | 清除缓存 |
| getFolderSize | 获取文件大小 |
| getFormatSize | 格式化单位 |
| 方法名 | 说明 |
|---|---|
| 数据转换 | |
| string2Int | 字符串 转 整数 -转换失败将会 return 0; |
| string2Ints | 字符串 转 整型数组 |
| string2Long | 字符串 转 long -转换失败将会 return 0; |
| string2Double | 字符串 转 double -转换失败将会 return 0; |
| string2Float | 字符串 转 float -转换失败将会 return 0; |
| string2InputStream | 字符串 转 InputStream |
| input2OutputStream | inputStream 转 outputStream |
| output2InputStream | outputStream 转 inputStream |
| inputStream2Bytes | inputStream 转 byteArr |
| bytes2InputStream | byteArr 转 inputStream |
| outputStream2Bytes | outputStream 转 byteArr |
| bytes2OutputStream | outputStream 转 byteArr |
| inputStream2String | inputStream 转 string按编码 |
| string2InputStream | string 转 inputStream按编码 |
| outputStream2String | outputStream 转 string按编码 |
| string2OutputStream | string 转 outputStream按编码 |
| bytes2HexString | byteArr 转 hexString |
| bytes2HexStringWithBlank | byteArr 转 hexString |
| hexString2Bytes | hexString 转 byteArr |
| bytes2String | byteArr 转 对应内容 |
| bytes2Int | int 转 byte[] |
| int2Bytes | byte[] 转 int |
| hex2Dec | hexChar 转 int |
| chars2Bytes | charArr 转 byteArr |
| bytes2Chars | byteArr 转 charArr |
| resId2Uri | 资源id 转 Uri |
| byte2Size | 字节数 转 以unit为单位的size |
| size2Byte | 以unit为单位的size 转 字节数 |
| byte2FitSize | 字节数 转 合适大小 |
| hexString2BitCode | 将16进制转为区位码 |
| string2Unicode | 将汉字转Unicode(汉字 -> \u6c49\u5b57) |
| unicode2String | 将Unicode转汉字(\u6c49\u5b57 -> 汉字) |
| string2URL | 字符串 转 URL字符串(汉字 -> %e6%b1%89%e5%ad%97) |
| URL2String | URL字符串 转 字符串(%e6%b1%89%e5%ad%97 -> 汉字) |
| toASCII | 将字符编码转换成US-ASCII码 |
| toISO_8859_1 | 将字符编码转换成ISO-8859-1码 |
| toUTF_8 | 将字符编码转换成UTF-8码 |
| toUTF_16BE | 将字符编码转换成UTF-16BE码 |
| toUTF_16LE | 将字符编码转换成UTF-16LE码 |
| toUTF_16 | 将字符编码转换成UTF-16码 |
| toGBK | 将字符编码转换成GBK码 |
| changeCharset | 字符串编码转换 |
| toDBC | 转化为半角字符 |
| toSBC | 转化为全角字符 |
| oneCn2ASCII | 单个汉字转成ASCII码 |
| oneCn2PY | 单个汉字转成拼音 |
| 数据处理 | |
| getAstro | 根据日期判断获取对应星座 |
| hideMobilePhone4 | 隐藏手机中间4位号码 130****0000 |
| formatCard | 格式化银行卡 加* 3749 **** **** 330 |
| formatCardEnd4 | 获取银行卡后四位 |
| format2Decimals | 将字符串格式化为带两位小数的字符串 |
| upperFirstLetter | 首字母大写 |
| lowerFirstLetter | 首字母小写 |
| reverse | 反转字符串 |
| getPYFirstLetter | 获得第一个汉字首字母 |
| cn2PY | 中文转拼音 |
| getAmountValue | 金额格式化 ###,###,###,##0.00 |
| getPercentValue | 获取百分比 new BigDecimal(0.21) - 21% |
| intsGetSum | 整型数组求和 |
| getRoundUp | 四舍五入 |
| getNotNull | 若输入为null,则返回空字符串;否则返回字符串自身 |
| getOrDefault | 如果为空则返回默认值 |
| stringToString | 字符串的转义(处理特殊字符) |
| deleteBlank | 去除字符串中的空格,回车制表 符等。。。\t \r \n |
| deleteHTMLTag | 去除String中的HTML标签 |
| 方法名 | 说明 |
|---|---|
| exportDb2Sdcard | 数据库导出到sdcard. |
| 方法名 | 说明 |
|---|---|
| 屏幕相关 | |
| getScreenHeight | 得到屏幕的高 |
| getScreenWidth | 得到屏幕的宽 |
| getScreenWidths | 得到设备屏幕的宽度 |
| getScreenHeights | 得到设备屏幕的高度 |
| getScreenDensity | 得到设备的密度 |
| setLandscape | 设置屏幕为横屏 |
| setPortrait | 设置屏幕为竖屏 |
| isLandscape | 判断是否横屏 |
| isPortrait | 判断是否竖屏 |
| getScreenRotation | 获取屏幕旋转角度 |
| captureWithStatusBar | 获取当前屏幕截图,包含状态栏 |
| captureWithoutStatusBar | 获取当前屏幕截图,不包含状态栏 |
| getDisplayMetrics | 获取DisplayMetrics对象 |
| isScreenLock | 判断是否锁屏 |
| 硬件信息相关 | |
| getUniqueSerialNumber | 获取手机唯一标识序列号 |
| getIMEI | 获取设备的IMEI |
| getIMSI | 获取设备的IMSI |
| getDeviceSoftwareVersion | 获取设备的软件版本号 |
| getLine1Number | 获取手机号 |
| getNetworkCountryIso | 获取ISO标准的国家码,即国际长途区号 |
| getNetworkOperator | 获取设备的 MCC + MNC |
| getNetworkOperatorName | 获取(当前已注册的用户)的名字 |
| getNetworkType | 获取当前使用的网络类型 |
| getPhoneType | 获取手机类型 |
| getSimCountryIso | 获取SIM卡的国家码 |
| getSimOperator | 获取SIM卡提供的移动国家码和移动网络码.5或6位的十进制数字 |
| getSimOperatorName | 获取服务商名称 |
| getSimSerialNumber | 获取SIM卡的序列号 |
| getSimState | 获取SIM的状态信息 |
| getSubscriberId | 获取唯一的用户ID |
| getVoiceMailNumber | 获取语音邮件号码 |
| getAndroid_id | 获取ANDROID ID |
| getBuildBrandModel | 获取设备型号,如MI2SC |
| getBuildBrand | 获取设备品牌名称 |
| getBuildMANUFACTURER | 获取设备厂商,如Xiaomi |
| getSerialNumber | 获取序列号 |
| checkPermission | 检查权限 |
| getDeviceInfo | 获取设备信息 |
| ThroughArray | 遍历LOG输出HashMap |
| getMacAddress | 获取设备MAC地址 |
| getLocalIpAddress | GPS获取IP |
| getIpAddressWifi | wifi获取IP |
| getIpAddressOperator | 3G/4g网络IP |
| getIpAddress | 获取本机的ip地址(上面3种方法都包括) |
| app相关信息 | |
| getAppInfo | 获取包信息 |
| getAppVersionNo | 获取App版本号 |
| getAppVersionName | 获取App版本名称 |
| reboot | 重启 |
| reboot2Recovery | 重启到 recovery |
| reboot2Bootloader | 重启到 bootloader |
| 手机操作相关 | |
| isPhone | 判断设备是否是手机 |
| getPhoneStatus | 获取手机状态信息 |
| dial | 跳至填充好phoneNumber的拨号界面 |
| callPhone | 拨打电话 |
| sendSms | 发送短信 |
| getAllContactInfo | 获取手机联系人 |
| getContantNum | 打开手机联系人界面点击联系人后便获取该号码 |
| getAllSMS | 获取手机短信并保存到xml中 |
| 方法名 | 说明 |
|---|---|
| dp2px | dp转px |
| dip2px | dip转px |
| px2dp | px转dp |
| px2dip | px转dip |
| sp2px | sp转px |
| px2sp | px转sp |
// ----------- 下载相关 -----------
@SuppressLint("SdCardPath")
public static final String path = "/mnt/sdcard/Download";// 保存到SD卡的文件夹
private String localfile = "";// 文件下载之后的本地真实地址
public String host = "http://daodao.zhiyoubao.com";//下载服务器的地址
private String dowonloadUrl = "";// 文件的最终下载地址
private static final String threadcount = "4";// 设置下载线程数为4
private DownloaderService downloader;
private Handler mHandler = new Handler()
{
public void handleMessage(Message msg)
{
if (msg.what == 5478)
{
String url = (String) msg.obj;
int length = msg.arg1;
// 设置进度条按读取的length长度更新
mProgressBar.incrementProgressBy(length);
mTVProgress.setText(getPercent(mProgressBar.getProgress(), mProgressBar.getMax()));
if (mProgressBar.getProgress() == mProgressBar.getMax())
{
// 下载完成!
// 下载完成后清除进度条并将map中的数据清空
downloader.delete(url);
downloader.reset();
...
}
}
}
};
/** 响应开始下载按钮的点击事件 */
private void startDownload()
{
dowonloadUrl = host + mUpdateAppInfo.getFilePath();
String fileName = context.getPackageName() + mUpdateAppInfo.getVersion() + ".apk";
localfile = path + fileName;
DownloadTask downloadTask = new DownloadTask();
downloadTask.execute(dowonloadUrl, localfile, threadcount);
}
/** 响应暂停下载按钮的点击事件 */
private void pauseDownload()
{
if (downloader != null)
{
downloader.pause();
}
}
/** 显示进度条 */
private void showProgress(DownloadInfoDetail downloadInfoDetail)
{
mProgressBar.setMax(downloadInfoDetail.getFileSize());
mProgressBar.setProgress(downloadInfoDetail.getComplete());
}
/** 获取当前进度的百分比 */
private String getPercent(int now, int max)
{
float percent = (float) now / (float) max * 100;
DecimalFormat df = new DecimalFormat("#0.00");
return df.format(percent) + "%";
}
/** 下载任务 */
private class DownloadTask extends AsyncTask<String, Integer, DownloadInfoDetail>
{
String urlstr = null;
@Override
protected void onPreExecute()
{
}
@Override
protected DownloadInfoDetail doInBackground(String... params)
{
urlstr = params[0];
String localfile = params[1];
int threadcount = Integer.parseInt(params[2]);
// 初始化一个downloader下载器
if (downloader == null)
{
downloader = new DownloaderService(urlstr, localfile,
threadcount, context, mHandler);
}
if (downloader.isdownloading())
{
return null;
}
// 得到下载信息类的个数组成集合
return downloader.getDownloaderInfors();
}
@Override
protected void onPostExecute(DownloadInfoDetail downloadInfoDetail)
{
if (downloadInfoDetail != null)
{
// 显示进度条
showProgress(downloadInfoDetail);
// 调用方法开始下载
downloader.download();
}
}
}
| 方法名 | 说明 |
|---|---|
| setInhibitInputSpeChat | 禁止EditText输入特殊字符 |
| setEditShowPass | 设置editText是否显示密码 |
| lockEdit | 使editText不可编辑 |
| limitInput | 限制输入为中英文 |
| setEdTwoDecimal | 限制输入为两位小数 |
| setEdDecimal | 设置最多几位小数 |
| setEditNumberAuto | 设置指定格式输入数字 |
| 方法名 | 说明 |
|---|---|
| urlEncode | URL编码 |
| urlDecode | URL解码 |
| base64Encode | Base64编码 |
| base64Encode2String | Base64编码 |
| base64Decode | Base64解码 |
| base64UrlSafeEncode | Base64URL安全编码 |
| htmlEncode | Html编码 |
| htmlDecode | Html解码 |
| 方法名 | 说明 |
|---|---|
| 哈希加密相关 | |
| encryptMD2ToString | MD2加密 |
| encryptMD2 | MD2加密 |
| encryptMD5ToString | MD5加密 |
| encryptMD5 | MD5加密 |
| encryptMD5File2String | MD5加密文件 |
| encryptMD5File | MD5加密文件 |
| encryptSHA1ToString | SHA1加密 |
| encryptSHA1 | SHA1加密 |
| encryptSHA224ToString | SHA224加密 |
| encryptSHA224 | SHA224加密 |
| encryptSHA256ToString | SHA256加密 |
| encryptSHA256 | SHA256加密 |
| encryptSHA384ToString | SHA384加密 |
| encryptSHA384 | SHA384加密 |
| encryptSHA512ToString | SHA512加密 |
| encryptSHA512 | SHA512加密 |
| encryptAlgorithm | 对data进行algorithm算法加密 |
| DES加密相关 | |
| DESTemplet | DES加密 |
| encryptDES | DES加密 |
| encryptDES2Base64 | DES加密后转为Base64编码 |
| encryptDES2HexString | DES加密后转为16进制 |
| decryptBase64DES | DES解密Base64编码密文 |
| decryptHexStringDES | DES解密16进制密文 |
| decryptDES | DES解密 |
| 3DES加密相关 | |
| encrypt3DES2Base64 | 3DES加密后转为Base64编码 |
| encrypt3DES2HexString | 3DES加密后转为16进制 |
| encrypt3DES | 3DES加密 |
| decryptBase64_3DES | 3DES解密Base64编码密文 |
| decryptHexString3DES | 3DES解密16进制密文 |
| decrypt3DES | 3DES解密 |
| AES加密相关 | |
| encryptAES2Base64 | AES加密后转为Base64编码 |
| encryptAES2HexString | AES加密后转为16进制 |
| encryptAES | AES加密 |
| decryptBase64AES | AES解密Base64编码密文 |
| decryptHexStringAES | AES解密16进制密文 |
| decryptAES | AES解密 |
| 方法名 | 说明 |
|---|---|
| writeLatLonIntoJpeg | 将经纬度信息写入JPEG图片文件里 |
| 方法名 | 说明 |
|---|---|
| showFragment | 动态显示Fragment |
| 方法名 | 说明 |
|---|---|
| SD卡操作 | |
| getRootPath | 得到SD卡根目录 |
| getCecheFolder | 获取本应用图片缓存目录 |
| isSDCardEnable | 判断SD卡是否打开 |
| getSDCardPath | 获取SD卡路径 |
| getDataPath | 获取SD卡Data路径 |
| getFreeSpace | 获取SD卡剩余空间 |
| sdCardIsAvailable | SD卡是否可用 |
| 文件操作 | |
| fileExists | 文件或者文件夹是否存在 |
| delAllFile | 删除指定文件夹下所有文件, 不保留文件夹. |
| copy | 文件复制(文件路径) |
| copyFile | 复制文件(文件/InputStream流) |
| copyFolder | 复制整个文件夹内 |
| renameFile | 重命名文件 |
| getSDCardAvailaleSize | 获取磁盘可用空间 |
| getDirSize | 获取某个目录可用大小 |
| getFileAllSize | 获取文件或者文件夹大小 |
| initFile | 创建一个文件 |
| initDirectory | 创建一个文件夹 |
| saveFile | 保存InputStream流到文件 |
| saveFileUTF8 | 用UTF8保存一个文件 |
| getFileUTF8 | 用UTF8读取一个文件 |
| getFileIntent | 得到一个文件Intent |
| getDiskCacheDir | 获取缓存目录 |
| getDiskFileDir | 获取缓存视频文件目录 |
| mergeFiles | 多个文件拼接合并 |
| getNativeM3u | 将在线的m3u8替换成本地的m3u8 |
| write | 将字符串 保存成 文件 |
| TextToFile | 传入文件名以及字符串, 将字符串信息保存到文件中 |
| GetAllFileName | 获取 搜索的路径 下的 所有 后缀 的文件 |
| readFileByLines | 以行为单位读取文件,常用于读面向行的格式化文件 |
| getFileByPath | 根据文件路径获取文件 |
| isFileExists | 判断文件是否存在 |
| isDir | 判断是否是目录 |
| isFile | 判断是否是文件 |
| createOrExistsDir | 判断目录是否存在,不存在则判断是否创建成功 |
| createOrExistsFile | 判断文件是否存在,不存在则判断是否创建成功 |
| createFileByDeleteOldFile | 判断文件是否存在,存在则在创建之前删除 |
| copyOrMoveDir | 复制或移动目录 |
| copyOrMoveFile | 复制或移动文件 |
| copyDir | 复制目录 |
| copyFile | 复制文件 |
| moveDir | 移动目录 |
| moveFile | 移动文件 |
| deleteDir | 删除目录 |
| deleteFile | 删除文件 |
| listFilesInDir | 获取目录下所有文件 |
| listFilesInDirWithFilter | 获取目录下所有后缀名为suffix的文件 |
| searchFileInDir | 获取目录下指定文件名的文件包括子目录 |
| writeFileFromIS | 将输入流写入文件 |
| writeFileFromString | 将字符串写入文件 |
| readFile2List | 指定编码按行读取文件到List |
| readFile2String | 指定编码按行读取文件到字符串中 |
| readFile2Bytes | 指定编码按行读取文件到字符数组中 |
| getFileCharsetSimple | 简单获取文件编码格式 |
| getFileLines | 获取文件行数 |
| getFileSize | 获取文件大小 |
| getFileMD5 | 获取文件的MD5校验码 |
| closeIO | 关闭IO |
| getDirName | 获取全路径中的最长目录 |
| getFileName | 获取全路径中的文件名 |
| getFileNameNoExtension | 获取全路径中的不带拓展名的文件名 |
| getFileExtension | 获取全路径中的文件拓展名 |
| 清除数据 | |
| cleanInternalCache | 清除内部缓存 |
| cleanInternalFiles | 清除内部文件 |
| cleanInternalDbs | 清除内部数据库 |
| cleanInternalDbByName | 根据名称清除数据库 |
| cleanInternalSP | 清除内部SP |
| cleanExternalCache | 清除外部缓存 |
| cleanCustomCache | 清除自定义目录下的文件 |
| 方法名 | 说明 |
|---|---|
| loadImg | 加载图片(设置占位图,调整图片宽高,自定义) |
| loadImgCenterCrop | 缩放宽和高都到达View的边界,有一个参数在边界上,另一个参数可能在边界上,也可能超过边界 |
| loadImgCenterInside | 如果宽和高都在View的边界内,那就不缩放,否则缩放宽和高都进入View的边界,有一个参数在边界上,另一个参数可能在边界上,也可能在边界内 |
| loadImgFitCenter | 缩放宽和高都进入View的边界,有一个参数在边界上,另一个参数可能在边界上,也可能在边界内 |
| loadImgCircleCrop | 加载圆形图片 |
| loadImgRoundedCorners | 加载圆角图片 |
| loadImgNoCache | 加载图片并且不缓存 |
| loadImageSimpleTarget | 加载图片返回Bitmap |
| getBitmap | 获取图片,或者图片路径 |
| clean | 清空图片缓存 |
| 方法名 | 说明 |
|---|---|
| getInstallAppIntent | 获取安装App(支持7.0)的意图 |
| getUninstallAppIntent | 获取卸载App的意图 |
| getLaunchAppItent | 获取打开App的意图 |
| getAppInfoIntent | 获取App信息的意图,App设置页面 |
| getShareInfoIntent | 获取App信息分享的意图 |
| getIntentByPackageName | 根据包名获取意图 |
| getComponentNameIntent | 获取其他应用的Intent |
| getShareTextIntent | 获取分享文字的意图 |
| getShareImageIntent | 获取分享图片的意图 |
| getShutdownIntent | 关机重启的意图 |
| getDialIntent | 拨号的意图 |
| getCallIntent | 打电话的意图 |
| getSendSmsIntent | 发送短信的意图 |
| getCaptureIntent | 调用系统相机的意图 |
| getOpenCameraIntent | 获取打开照程序界面的Intent |
| getWebIntent | 获取打开网页的意图 |
| getImagePickerIntent | 获取[跳转至相册选择界面,并跳转至裁剪界面,可以指定是否缩放裁剪区域]的Intent |
| getCameraIntent | 获取[跳转至相册选择界面,并跳转至裁剪界面,默认可缩放裁剪区域]的Intent |
| getCropImageIntent | 获取[跳转至裁剪界面]的Intent |
| getChoosedImage | 获得选中相册的图片 |
| getChoosedImagePath | 获得选中相册的图片路径 |
| getTakePictureFile | 获取拍照之后的照片文件(JPG格式) |
| 方法名 | 说明 |
|---|---|
| getObject | 将数据解析成指定泛型并返回 |
| getJsonString | 将指定类变成Json型数据返回 |
| getMapFromJson | 将json字符串解析成Map |
| getMapFromObj | 将object解析成Map |
| 方法名 | 说明 |
|---|---|
| hideSoftInput | 动态隐藏软键盘 |
| hideKeyboard | 点击隐藏软键盘 |
| showSoftInput | 动态显示软键盘 |
| toggleSoftInput | 切换键盘显示与否状态 |
| clickBlankArea2HideSoftInput | 点击屏幕空白区域隐藏软键盘(方法1) |
| clickBlankArea2HideSoftInput1 | 点击屏幕空白区域隐藏软键盘(方法2) |
| isSoftInputVisible | 判断软键盘是否可见 |
| registerSoftInputChangedListener | 注册软键盘改变监听器 |
| unregisterSoftInputChangedListener | 注销软键盘改变监听器 |
| fixSoftInputLeaks | 修复软键盘内存泄漏 |
| 方法名 | 说明 |
|---|---|
| isGpsEnabled | 判断Gps是否可用 |
| isLocationEnabled | 判断定位是否可用 |
| openGpsSettings | 打开Gps设置界面 |
| registerLocation | 注册Location |
| unRegisterLocation | 注销Location |
| getAddress | 根据经纬度获取地理位置 |
| getCountryName | 根据经纬度获取所在国家 |
| getLocality | 根据经纬度获取所在地 |
| getStreet | 根据经纬度获取所在街道 |
| gpsToDegree | GPS坐标 转换成 角度(例如 113.202222 转换成 113°12′8″) |
| GPS84ToGCJ02 | 国际 GPS84 坐标系 转换成 [国测局坐标系] 火星坐标系 (GCJ-02) |
| GCJ02ToGPS84 | [国测局坐标系] 火星坐标系 (GCJ-02) 转换成 国际 GPS84 坐标系 |
| GCJ02ToBD09 | 火星坐标系 (GCJ-02) 转换成 百度坐标系 (BD-09) |
| BD09ToGCJ02 | 百度坐标系 (BD-09) 转换成 火星坐标系 (GCJ-02) |
| BD09ToGPS84 | 百度坐标系 (BD-09) 转换成 国际 GPS84 坐标系 |
| outOfChina | 判断经纬度是否在中国范围内 |
| getLastLocation | 获取最后一个已知经纬度 |
| 方法名 | 说明 |
|---|---|
| getConfig | 获取 log 配置 |
| Config.setLogSwitch | 设置 log 总开关 |
| Config.setConsoleSwitch | 设置 log 控制台开关 |
| Config.setGlobalTag | 设置 log 全局 tag |
| Config.setLogHeadSwitch | 设置 log 头部信息开关 |
| Config.setLog2FileSwitch | 设置 log 文件开关 |
| Config.setDir | 设置 log 文件存储目录 |
| Config.setFilePrefix | 设置 log 文件前缀 |
| Config.setBorderSwitch | 设置 log 边框开关 |
| Config.setSingleTagSwitch | 设置 log 单一 tag 开关(为美化 AS 3.1 的 Logcat) |
| Config.setConsoleFilter | 设置 log 控制台过滤器 |
| Config.setFileFilter | 设置 log 文件过滤器 |
| Config.setStackDeep | 设置 log 栈深度 |
| Config.setStackOffset | 设置 log 栈偏移 |
| log | 自定义 tag 的 type 日志 |
| v | tag 为类名的 Verbose 日志 |
| pv | 打印 Verbose 日志 |
| d | tag 为类名的 Debug 日志 |
| pd | 打印 Debug 日志 |
| i | tag 为类名的 Info 日志 |
| pi | 打印 Info 日志 |
| w | tag 为类名的 Warn 日志 |
| pw | 打印 Warn 日志 |
| e | tag 为类名的 Error 日志 |
| pe | 打印 Error 日志 |
| a | tag 为类名的 Assert 日志 |
| pa | 打印 Assert 日志 |
| file | log 到文件 |
| json | log 字符串之 json |
| xml | log 字符串之 xml |
| 方法名 | 说明 |
|---|---|
| gaodeNaviActivity | 启动高德App进行导航 |
| gaodeWeb | 启动高德地图Web |
| baiduNaviActivity | 启动百度App进行导航 |
| baiduMapActivity | 启动百度App显示位置 |
| baiduMapWeb | 启动百度Web |
| googleNaviActivity | 启动谷歌地图App进行导航 |
| googleMapActivity | 启动谷歌地图App |
| googleNaviWeb | 打开google Web地图导航 |
| isInstallByRead | 根据包名检测某个APP是否安装 |
| isInstallGaode | 是否安装高德地图 |
| isInstallBaidu | 是否安装百度地图 |
| isInstallGoogle | 是否安装谷歌地图 |
| 方法名 | 说明 |
|---|---|
| add | 加 返回double |
| sub | 减 返回double |
| mul | 乘 返回double |
| div | 除 返回double |
| round | 小数位四舍五入 返回double |
| roundStr | 小数位四舍五入 返回String |
| 方法名 | 说明 |
|---|---|
| NetPingTool | 初始化方法,传入网址,端口和回调方法 |
| startGetDelay | 开始监听 |
| release | 释放 |
| setmDomain | 设置网址 |
| setmPort | 设置端口号 |
| setDuration | 设置延迟,多久发送一次ping |
| 方法名 | 说明 |
|---|---|
| ping | 判断是否有外网连接 |
| isWifiEnabled | 判断WIFI是否打开 |
| is3rd | 判断是否为3G网络 |
| isWifi | 判断网络连接方式是否为WIFI |
| isNetworkAvailable | 判断网络连接是否可用 |
| isGpsEnabled | GPS是否打开 |
| getNetWork | 获取当前网络状态 |
| openWirelessSettings | 打开网络设置界面 |
| getActiveNetworkInfo | 获取活动网络信息 |
| isAvailable | 判断网络是否可用 |
| isConnected | 判断网络是否连接 |
| is4G | 判断网络是否是4G |
| isWifiConnected | 判断wifi是否连接状态 |
| getNetworkOperatorName | 获取移动网络运营商名称 |
| getPhoneType | 获取移动终端类型 |
| getNetWorkType | 获取当前的网络类型 |
| getNetWorkTypeName | 获取当前的网络类型名称 |
| 方法名 | 说明 |
|---|---|
| sendSysNotification | 发送系统消息的消息 |
| clearNotification | 取消指定id的消息 |
| 方法名 | 说明 |
|---|---|
| getPermissions | 获取程序中使用的权限列表 |
| isGranted | 返回某些权限是否已经获取 |
PermissionTool
.permission(PermissionConstants.PHONE, PermissionConstants.STORAGE)
.rationale(new PermissionTool.OnRationaleListener()
{
@Override public void rationale(final ShouldRequest shouldRequest)
{
PermissionHelper.showRationaleDialog(shouldRequest);
}
})
.callback(new PermissionTool.FullCallback()
{
@Override public void onGranted(List<String> permissionsGranted)
{
}
@Override public void onDenied(List<String> permissionsDeniedForever, List<String> permissionsDenied)
{
if(!permissionsDeniedForever.isEmpty())
{
PermissionHelper.showOpenAppSettingDialog();
}
}
})
.theme(new PermissionTool.ThemeCallback()
{
@Override public void onActivityCreate(Activity activity)
{
PermissionHelper.setFullScreen(activity);
}
})
.request();
| 方法名 | 说明 |
|---|---|
| requestCamera | 获取相机权限 |
| requestStorage | 获取内存卡权限 |
| requestPhone | 获取电话权限 |
| requestSms | 获取短信权限 |
| requestLocation | 获取地理位置权限 |
| requestCalendar | 获取日历权限 |
| requestContacts | 获取联系人权限 |
| requestMicrophone | 获取麦克风权限 |
| requestSensors | 获取人体传感器权限 |
| request | 获取权限 |
| showOpenAppSettingDialog | 显示一个打开APP设置来获取权限的Dialog |
| showRationaleDialog | 显示一个获取权限的提示 |
| launchAppDetailsSettings | 打开App的设置界面 |
| setFullScreen | activity设置全屏 |
PermissionHelper.requestStorage(new PermissionTool.FullCallback()
{
@Override public void onGranted(List<String> permissionsGranted)
{
}
@Override public void onDenied(List<String> permissionsDeniedForever, List<String> permissionsDenied)
{
if(!permissionsDeniedForever.isEmpty())
{
PermissionHelper.showOpenAppSettingDialog();
}
}
});
| 方法名 | 说明 |
|---|---|
| openCameraImage | 调用系统相机 |
| openLocalImage | 调用系统相册 |
| cropImage | 裁剪图片 |
| createImagePathUri | 创建一条图片地址uri,用于保存拍照后的照片 |
| getRealFilePath | 获取图片uri的真实文件地址(4.4以下) |
| getImageAbsolutePath | 根据Uri获取图片绝对路径,解决Android4.4以上版本Uri转换 |
| 方法名 | 说明 |
|---|---|
| getForegroundProcessName | 获取前台线程包名 |
| getAllBackgroundProcesses | 获取后台服务进程 |
| killAllBackgroundProcesses | 杀死所有后台服务进程 |
| killBackgroundProcesses | 杀死后台服务进程 |
| 方法名 | 说明 |
|---|---|
| isNullString | 判断字符串是否为空 为空即true |
| isEmpty | 判断对象是否为空 为空即true |
| isNotEmpty | 判断对象是否不为空 |
| isEquals | 是否相同 |
| isInteger | 判断字符串是否是整数 |
| isDouble | 判断字符串是否是浮点数 |
| isNumber | 判断字符串是否是数字 |
| isMobileSimple | 验证手机号(简单) |
| isMobileExact | 验证手机号(精确) |
| isTel | 验证电话号码 |
| isBankCard | 验证银卡卡号 |
| isIDCard | 15位和18位身份证号码的正则表达式 身份证验证 |
| isIDCard15 | 验证身份证号码15位 |
| isIDCard18 | 验证身份证号码18位 |
| isEmail | 验证邮箱 |
| isURL | 验证URL |
| isChz | 验证汉字 |
| isUsername | 验证用户名 |
| isDate | 验证yyyy-MM-dd格式的日期校验,已考虑平闰年 |
| isIP | 验证IP地址 |
| isMatch | string是否匹配regex |
| stringFormat | String.Format方法的封装 |
| 方法名 | 说明 |
|---|---|
| isServiceRunning | 获取服务是否开启 |
| getAllRunningServices | 获取所有运行中的服务 |
| 方法名 | 说明 |
|---|---|
| isRoot | 判断设备是否root |
| execCmd | 执行命令 |
| 方法名 | 说明 |
|---|---|
| create | 播放语音文件 |
| dismisSoundPool | 释放播放池 |
| 方法名 | 说明 |
|---|---|
| init | 初始化 |
| getString | 获取String |
| saveString | 保存String |
| getObject | 获取Object |
| saveObject | 保存Object |
| getBoolean | 获取boolean |
| saveBoolean | 保存boolean |
| getInt | 获取int |
| saveInt | 保存int |
| getLong | 获取long |
| saveLong | 保存long |
| getFloat | 获取float |
| saveFloat | 保存float |
| getAll | 获取所有的键值对 |
| contains | 是否包含某key |
| remove | 移除 |
| clear | 清除所有数据 |
TextTool.getBuilder("")
.setBold().setAlign(Layout.Alignment.ALIGN_CENTER)
.append("测试").append("Url\n").setUrl(URL_VONTOOLS)
.append("列表项\n").setBullet(60, getResources().getColor(R.color.baby_blue))
.append(" 测试引用\n").setQuoteColor(getResources().getColor(R.color.baby_blue))
.append("首行缩进\n").setLeadingMargin(30, 50)
.append("测试").append("上标").setSuperscript().append("下标\n").setSubscript()
.append("测试").append("点击事件\n").setClickSpan(clickableSpan)
.append("测试").append("serif 字体\n").setFontFamily("serif")
.append("测试").append("图片\n").setResourceId(R.drawable.logo)
.append("测试").append("前景色").setForegroundColor(Color.GREEN).append("背景色\n").setBackgroundColor(getResources().getColor(R.color.baby_blue))
.append("测试").append("删除线").setStrikethrough().append("下划线\n").setUnderline()
.append("测试").append("sans-serif 字体\n").setFontFamily("sans-serif")
.append("测试").append("2倍字体\n").setProportion(2)
.append("测试").append("monospace字体\n").setFontFamily("monospace")
.append("测试").append("普通模糊效果字体\n").setBlur(3, BlurMaskFilter.Blur.NORMAL)
.append("测试").append(" 粗体 ").setBold().append(" 斜体 ").setItalic().append(" 粗斜体 \n").setBoldItalic()
.append("测试").append("横向2倍字体\n").setXProportion(2)
.append("\n测试正常对齐\n").setAlign(Layout.Alignment.ALIGN_NORMAL)
.append("测试居中对齐\n").setAlign(Layout.Alignment.ALIGN_CENTER)
.append("测试相反对齐\n").setAlign(Layout.Alignment.ALIGN_OPPOSITE)
.into(mTvAboutSpannable);
| 方法名 | 说明 |
|---|---|
| ThreadPoolTool | 初始化创建一个线程池 |
| execute | 在未来某个时间执行给定的命令 |
| shutDown | 待以前提交的任务执行完毕后关闭线程池 |
| shutDownNow | 试图停止所有正在执行的活动任务 |
| isShutDown | 判断线程池是否已关闭 |
| isTerminated | 关闭线程池后判断所有任务是否都已完成 |
| awaitTermination | 请求关闭、发生超时或者当前线程中断 |
| submit | 提交一个Callable任务用于执行 |
| invokeAll | 执行给定的任务 |
| invokeAny | 执行给定的任务 |
| schedule | 延迟执行Runnable命令scheduleWithFixedRate |
| 方法名 | 说明 |
|---|---|
| milliseconds2String | 将时间戳转为时间字符串 |
| string2Milliseconds | 将时间字符串转为时间戳 |
| string2Date | 将时间字符串转为Date类型 |
| date2String | 将Date类型转为时间字符串 |
| date2Milliseconds | 将Date类型转为时间戳 |
| milliseconds2Date | 将时间戳转为Date类型 |
| milliseconds2Unit | 毫秒时间戳单位转换 |
| getIntervalTime | 获取两个时间差 |
| getCurTimeMills | 获取当前时间戳 |
| getCurTimeString | 获取当前时间字符串 |
| getCurTimeDate | 获取当前时间 |
| getIntervalByNow | 获取与当前时间的差 |
| isLeapYear | 判断闰年 |
| getCurrentDateTime | 获取当前日期时间 |
| getYestoryDate | 得到昨天的日期 |
| formatTime | 视频时间 转换成 "mm:ss" |
| formatSeconds | "mm:ss" 转换成 视频时间 |
| getDaysByYearMonth | 根据年,月 获取对应的月份天数 |
| stringForWeek | 判断当前日期是星期几 |
| changeFormat | 修改日期格式 |
| getDateInt | 返回int型的日期 yyyyMMdd |
| getTimeInt | 返回int型的时间 HHmmss |
| nDaysAfter | 推迟N天的日期 |
| isInDate | 判断时间是否在时间段内 |
| changeDateHMS | 修改日期的时间段格式 |
| isAEarlier | A的时间是不是比B早 |
| getDateStart | 获取某日的开始时间 |
| getDateEnd | 获取某日的结束时间 |
| 方法名 | 说明 |
|---|---|
| init | 初始化工具类 |
| uninstall | 结束工具类 |
| 方法名 | 说明 |
|---|---|
| vibrateOnce | 简单震动一次 |
| vibrateComplicated | 复杂的震动 |
| vibrateStop | 停止震动 |
| 方法名 | 说明 |
|---|---|
| setWebData | 简单震动一次 |
原项目地址:https://github.com/hanks-zyh/AnimateCheckBox
| 方法名 | 说明 |
|---|---|
| setCircleColor | 设置圆的颜色 |
| setLineColor | 设置对号的颜色 |
| setUnCheckColor | 设置未选中时的颜色 |
| setOnCheckedChangeListener | 设置状态改变监听 |
| isChecked | 返回当前选中状态 |
| setChecked | 设置当前选中状态 |
原项目地址:https://github.com/pedant/sweet-alert-dialog
public static final int NORMAL_TYPE = 0; // 普通模式
public static final int ERROR_TYPE = 1; // 显示错误框
public static final int SUCCESS_TYPE = 2; // 显示成功框
public static final int WARNING_TYPE = 3; // 显示警告
public static final int CUSTOM_IMAGE_TYPE = 4; // 显示图片
public static final int PROGRESS_TYPE = 5; // 显示圆形进度条
RxDialogChooseImage dialogChooseImage = new RxDialogChooseImage(mContext, TITLE);
dialogChooseImage.show();
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)
{
when (requestCode)
{
PhotoTool.GET_IMAGE_FROM_PHONE ->
{ //选择相册之后的处理
if (resultCode == RESULT_OK)
{
PhotoTool.cropImage(this@VerifyActivity, data?.data, 16, 11, 320, 220) // 裁剪图片
}
}
PhotoTool.GET_IMAGE_BY_CAMERA ->
{ //选择相册之后的处理
if (resultCode == RESULT_OK)
{
PhotoTool.cropImage(this@VerifyActivity, PhotoTool.imageUriFromCamera, 16, 11, 320, 220) // 裁剪图片
}
}
PhotoTool.CROP_IMAGE ->
{
Glide.with(this@VerifyActivity)
.load(PhotoTool.cropImageUri)
.into(mIvPicture)
}
}
super.onActivityResult(requestCode, resultCode, data)
}
final RxDialogEditSureCancel rxDialogEditSureCancel = new RxDialogEditSureCancel(mContext);//提示弹窗
rxDialogEditSureCancel.getTitleView().setBackgroundResource(R.drawable.logo);
rxDialogEditSureCancel.getSureView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
rxDialogEditSureCancel.cancel();
}
});
rxDialogEditSureCancel.getCancelView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
rxDialogEditSureCancel.cancel();
}
});
rxDialogEditSureCancel.show();
RxDialogScaleView rxDialogScaleView = new RxDialogScaleView(mContext);
rxDialogScaleView.setImage(...);
rxDialogScaleView.show();
RxDialogSure rxDialogSure = new RxDialogSure(mContext);
rxDialogSure.getLogoView().setImageResource(R.drawable.logo);
rxDialogSure.getSureView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
rxDialogSure.cancel();
}
});
rxDialogSure.show();
RxDialogSureCancel rxDialogSureCancel = new RxDialogSureCancel(mContext);
rxDialogSureCancel.getTitleView().setBackgroundResource(R.drawable.logo);
rxDialogSureCancel.getSureView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
rxDialogSureCancel.cancel();
}
});
rxDialogSureCancel.getCancelView().setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
rxDialogSureCancel.cancel();
}
});
rxDialogSureCancel.show();
| 方法名 | 说明 |
|---|---|
| shake | 抖动 |
| setAfterChangedListener | 设置文字变化以后的事件 |
| 方法名 | 说明 |
|---|---|
| setHeightRatio | 设置ImageView的宽高尺寸比例 |
| getHeightRatio | 获取设置的宽高比例 |
| 方法名 | 说明 |
|---|---|
| setMovieResource | 设置gif的id |
原项目地址:https://github.com/davemorrissey/subsampling-scale-image-view
| 方法名 | 说明 |
|---|---|
| setPopListener | 设置监听POP显示隐藏的事件 |
// 显示一个简单文本的pop
PopLayout popLayout = PopLayout(MainActivity.this, "厉害了")
// 显示一个自定义View的pop
PopLayout popLayout = PopLayout(MainActivity.this, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, R.layout.activity_main)
//pop显示
popLayout.show(mBtn1)
PopListView popListView = new PopListView(this,
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
popListView.addAction(new ActionItem("标清"));
popListView.addAction(new ActionItem("高清"));
popListView.addAction(new ActionItem("超清"));
popListView.setColorItemText(0);
// popListView.setmAdapter();//给listView设置adapter来实现列表项目格式自定义
popListView.setItemOnClickListener(new PopListView.OnItemOnClickListener(){
@Override public void onItemClick(ActionItem item, int position)
{
}
});
popListView.show(view, 0);
| 类名 | 说明 |
|---|---|
| DividerGridItemDecoration | 设置Grid下RecyleView的间隔 |
| DividerItemDecoration | 设置List下RecyleView的间隔 |
| FullyGridLayoutManager | 使RecyclerView使用GridLayoutManager嵌套在ScrollView中 |
| FullyLinearLayoutManager | 使RecyclerView使用LinearLayoutManager嵌套在ScrollView中 |
| FullyStaggeredGridLayoutManager | 使RecyclerView使用瀑布流嵌套在ScrollView中 |
| SampleFooter | 简单实现的没有更多底部栏 |
| SampleHeader | 简单实现的没有数据栏 |
| 方法名 | 说明 |
|---|---|
| initTime | 初始化时间 秒 |
| reStart | 重新启动计时 秒 |
| onPause | 暂停计时 |
| onResume | 继续计时 |
| setTimeFormat | 设置时间格式 |
| setOnTimeCompleteListener | 计时结束时的事件 |
原项目地址:https://github.com/grantland/android-autofittextview
自动修改文字大小以适应View的宽度
| 方法名 | 说明 |
|---|---|
| setFormat | 设置时间格式 |
原项目地址:https://github.com/zzhoujay/RichText 在此项目中集成的是老版本的RichText,单一个类文件,如需扩展Markdown等新功能请前往Github集成最新项目
| 方法名 | 说明 |
|---|---|
| setRichText | 设置富文本内容 |
| setPlaceHolder | 设置站位图片 |
| setErrorImage | 设置错误图片 |
| setOnImageClickListener | 设置图片点击事件 |
ArrayList<String> titleList = new ArrayList<String>();
titleList.add("测试轮播消息1");
...
mRxTextViewVertical.setTextList(titleList);
mRxTextViewVertical.setText(26, 5, 0xff766156);//设置属性
mRxTextViewVertical.setTextStillTime(3000);//设置停留时长间隔
mRxTextViewVertical.setAnimTime(300);//设置进入和退出的时间间隔
mRxTextViewVertical.setOnItemClickListener(new RxTextViewVertical.OnItemClickListener() {
@Override
public void onItemClick(int position) {
RxToast.success(mContext, "点击了 : " + titleList.get(position), Toast.LENGTH_SHORT, true).show();
}
});
List<View> views = new ArrayList<>();
viewsviews.add(VIEW);
...
mRxTextViewVerticalMore.setViews(views);
原项目地址:https://github.com/niniloveyou/StateButton
| Attribute | default value | xml | java |
|---|---|---|---|
| normalTextColor | original text color | normalTextColor | setNormalTextColor(int color) |
| pressedTextColor | original text color | pressedTextColor | setPressedTextColor(int color) |
| unableTextColor | original text color | unableTextColor | setUnableTextColor(int color) |
| strokeDashWidth | 0 | strokeDashWidth | setStrokeDash(int dashWidth, int dashGap) |
| strokeDashGap | 0 | strokeDashGap | setStrokeDash(int dashWidth, int dashGap) |
| normalStrokeWidth | 0 | normalStrokeWidth | setNormalStrokeWidth(int widht) |
| pressedStrokeWidth | 0 | pressedStrokeWidth | setPressedStrokeWidth(int widht) |
| unableStrokeWidth | 0 | unableStrokeWidth | setUnableStrokeWidth(int widht) |
| normalStrokeColor | 0 | normalStrokeColor | setNormalStrokeColor(int color) |
| pressedStrokeColor | 0 | pressedStrokeColor | setPressedStrokeColor(int color) |
| unableStrokeColor | 0 | unableStrokeColor | setUnableStrokeColor(int color) |
| normalBackgroundColor | 0 | normalBackgroundColor | setNormalBackgroundColor(int color) |
| pressedBackgroundColor | 0 | pressedBackgroundColor | setPressedBackgroundColor(int color) |
| unableBackgroundColor | 0 | unableBackgroundColor | setUnableBackgroundColor(int color) |
| radius | 0 | radius | setRadius(int radius) / setRadius(float[] radii) |
| round | false | round | setRound(boolean round) |
| animationDuration | 0ms | animationDuration | setAnimationDuration(int duration) |
xml中定义了以下属性
- Define
xmlns:app="http://schemas.android.com/apk/res-auto"on root of your xml file
<talex.zsw.basecore.view.textview.StateButton
android:id="@+id/stateButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="StateButton"
app:radius="5dp"
app:round="true"
app:animationDuration="200"
app:strokeDashGap="2dp"
app:strokeDashWidth="5dp"
app:normalStrokeWidth="2dp"
app:pressedStrokeWidth="2dp"
app:unableStrokeWidth="2dp"
app:normalStrokeColor="@android:color/white"
app:pressedStrokeColor="@android:color/white"
app:unableStrokeColor="@android:color/white"
app:normalTextColor="@android:color/white"
app:pressedTextColor="@android:color/white"
app:unableTextColor="@android:color/white"
app:normalBackgroundColor="@color/colorPrimaryDark"
app:pressedBackgroundColor="@color/colorPrimaryDark"
app:unableBackgroundColor="@color/colorPrimaryDark"/>
<string name="timespan_now">刚刚</string>
<plurals name="timespan_years">
<item quantity="other">%d年前</item>
</plurals>
<plurals name="timespan_months">
<item quantity="other">%d个月前</item>
</plurals>
<plurals name="timespan_weeks">
<item quantity="other">%d周前</item>
</plurals>
<plurals name="timespan_days">
<item quantity="other">%d天前</item>
</plurals>
<plurals name="timespan_hours">
<item quantity="other">%d小时前</item>
</plurals>
<plurals name="timespan_minutes">
<item quantity="other">%d分钟前</item>
</plurals>
<plurals name="timespan_seconds">
<item quantity="other">%d秒前</item>
</plurals>
<plurals name="timespan_years_abbr">
<item quantity="other">%d年</item>
</plurals>
<plurals name="timespan_months_abbr">
<item quantity="other">%d月</item>
</plurals>
<plurals name="timespan_weeks_abbr">
<item quantity="other">%d周</item>
</plurals>
<plurals name="timespan_days_abbr">
<item quantity="other">%d天</item>
</plurals>
<plurals name="timespan_hours_abbr">
<item quantity="other">%d小时</item>
</plurals>
<plurals name="timespan_minutes_abbr">
<item quantity="other">%d分钟</item>
</plurals>
<plurals name="timespan_seconds_abbr">
<item quantity="other">%d秒</item>
</plurals>
在Activity中处理的方法
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener()
{
@Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
{
}
@Override public void onPageSelected(int position)
{
mViewPager.resetHeight(position);
}
@Override public void onPageScrollStateChanged(int state)
{
}
});
mViewPager.resetHeight(0);
/** 获取当前选中的Tab */
public int getCurr()
{
return mViewPager.getCurrentItem();
}
/** 设置ViewPsger的存放的View和对应的position,此方法必须等View绘制完毕以后调用,如果是Fragment,则在onViewCreated之后调用 */
public void setObjectForPosition(View view, int position)
{
mViewPager.setObjectForPosition(view, position);
}
在Fragment中处理的方法
((CompanyDetailActivity) getActivity()).setObjectForPosition(mView, position);
| 方法名 | 说明 |
|---|---|
| resetHeight | 在切换tab的时候,重置ViewPager的高度 |
| setObjectForPosition | 设置ViewPsger的存放的View和对应的position,此方法必须等View绘制完毕以后调用,如果是Fragment,则在onViewCreated之后调用 |
高度会自行计算的WebView
原项目地址:https://github.com/bingoogolapple/BGABadgeView-Android
该项目的老版本控件,不需使用注入的方式,直接调用对应的控件即可 BGABadgeView BGADragBadgeView BGABadgeTextView BGABadgeImageView BGABadgeRadioButton BGABadgeFrameLayout BGABadgeLinearLayout BGABadgeRelativeLayout
| 方法名 | 说明 |
|---|---|
| showCirclePointBadge | 显示圆点徽章 |
| showTextBadge | 显示文字徽章 |
| hiddenBadge | 隐藏徽章 |
| showDrawableBadge | 显示图像徽章 |
| setDragDismissDelegage | 设置拖动删除徽章的代理 |
| isShowBadge | 是否正在显示徽章 |
| isDraggable | 是否可拖拽 |
| isDragging | 是否正在拖动 |
| 属性名 | 说明 | 默认值 |
|---|---|---|
| badge_bgColor | 徽章背景色 | Color.RED |
| badge_textColor | 徽章文本的颜色 | Color.WHITE |
| badge_textSize | 徽章文本字体大小 | 10sp |
| badge_verticalMargin | 徽章背景与宿主控件上下边缘间距离 | 4dp |
| badge_horizontalMargin | 徽章背景与宿主控件左右边缘间距离 | 4dp |
| badge_padding | 徽章文本边缘与徽章背景边缘间的距离 | 4dp |
| badge_gravity | 徽章在宿主控件中的位置 | BGABadgeImageView和BGABadgeRadioButton是右上方,其他控件是右边垂直居中 |
| badge_draggable | 是否开启拖拽删除徽章 | false |
| badge_isResumeTravel | 拖拽徽章超出轨迹范围后,再次放回到轨迹范围时,是否恢复轨迹 | false |
| badge_borderWidth | 徽章描边宽度 | 0dp |
| badge_borderColor | 徽章描边颜色 | Color.WHITE |
| badge_dragExtra | 触发开始拖拽徽章事件的扩展触摸距离 | 4dp |
原项目地址:https://github.com/dongjunkun/DropDownMenu
相比原项目增加了更多可自定义项目,使用方法基本一致
原项目地址:https://github.com/hongyangAndroid/FlowLayout
<talex.zsw.basecore.view.other.flowlayout.TagFlowLayout
android:id="@+id/mFlowLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:FL_max_select="1"/>
// 设置适配器
mFlowLayout.setAdapter(new TagAdapter<String>(mVals)
{
@Override
public View getView(FlowLayout parent, int position, String s)
{
TextView tv = (TextView) mInflater.inflate(R.layout.tv,
mFlowLayout, false);
tv.setText(s);
return tv;
}
});
// 点击事件
mFlowLayout.setOnTagClickListener(new TagFlowLayout.OnTagClickListener()
{
@Override
public boolean onTagClick(View view, int position, FlowLayout parent)
{
Toast.makeText(getActivity(), mVals[position], Toast.LENGTH_SHORT).show();
return true;
}
});
// Tag选中的回调事件
mFlowLayout.setOnSelectListener(new TagFlowLayout.OnSelectListener()
{
@Override
public void onSelected(Set<Integer> selectPosSet)
{
getActivity().setTitle("choose:" + selectPosSet.toString());
}
});
mFlowLayout.setMaxSelectCount(1)// 设置最大选中数量
flowAdapter?.setSelectedList(1)// 设置选中的列表
| 属性名 | 说明 | 默认值 |
|---|---|---|
| FL_max_select | -1为不限制选择数量,>=1的数字为控制选择tag的数量 | -1 |
| 属性 | 说明 |
|---|---|
| android:text | 设置TextView文本 |
| android:textSize | 设置TextView文字大小 |
| IT_text_selected_color | 设置TextView选中时的颜色 |
| IT_text_unselected_color | 设置TextView未选中时的颜色 |
| IT_icon_selected | 设置ImageView选中时的图片 |
| IT_icon_unselected | 设置ImageView未选中的图片 |
| IT_icon_width | 设置ImageView的宽度 |
| IT_icon_height | 设置ImageView的高度 |
| IT_icon_wrap | 设置ImageView的高度是否自适应,默认true |
| IT_selected_background | 设置选中时的背景色 |
| IT_unselected_background | 设置未选中时的背景色 |
| IT_padding | 设置控件上下的padding |
| IT_match | 设置控件的高度是否充满,默认false |
| IT_badge_text | 设置badge的文本 |
| IT_badge_text_show | 设置badge的文本是否显示 |
| IT_badge_icon_show | 设置badge的icon是否显示 |
| IT_selected | 设置控件是否为选中状态 |
原项目地址:https://github.com/arcadefire/nice-spinner
NiceSpinner niceSpinner = (NiceSpinner) findViewById(R.id.nice_spinner);
List<String> dataset = new LinkedList<>(Arrays.asList("One", "Two", "Three", "Four", "Five"));
niceSpinner.attachDataSource(dataset);
| 方法名 | 说明 |
|---|---|
| setCount | 设置圆圈数量 |
| generatePageControl | 设置当前选中圆圈 |
| setSelectRes | 设置选中圆圈资源id |
| setUnSelectRes | 设置未选中圆圈资源id |
| 方法名 | 说明 |
|---|---|
| Toast 替代方法 :立即显示无需等待 | |
| normal | 普通提示(深灰) |
| warning | 警告提示(黄) |
| info | 信息提示(蓝) |
| success | 成功提示(绿) |
| error | 错误提示(红) |
| warning | 警告提示(黄) |
| 系统 Toast 替代方法 | |
| showToast | 显示系统toast |
| showToastShort | 显示系统toast(短) |
| showToastLong | 显示系统toast(短) |
| doubleClickExit | 点击两次退出 |
原项目地址:https://github.com/jjobes/SlideDateTimePicker
相比原项目,增加了一些新的设置选项,优化了项目布局
SlideDateTimeListener startListener = new SlideDateTimeListener(){
@Override public void onDateTimeSet(Date date)
{
}
};
// Fragment中则使用getChildFragmentManager()
new SlideDateTimePicker.Builder(getSupportFragmentManager())
.setListener(startListener)
.setInitialDate(startDate)
.setMinDate(minDate)
.setMaxDate(maxDate)
.setIndicatorColor(Color.parseColor("#990000"))
.setShowTime(false)
.setThemeColor(Color.parseColor("#FFFF00"))
.setTitleColor(Color.parseColor("#FF0000"))
.build()
.show()
原项目地址:https://github.com/Aspsine/SwipeToLoadLayout
相比原项目功能增加了可设置固定头部的功能
<talex.zsw.baselibrary.view.SwipeToLoadLayout.SwipeToLoadLayout
android:id="@+id/mSwipeToLoadLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
app:swipe_style="scale">
<include
android:id="@id/swipe_refresh_header"
layout="@layout/layout_twitter_header"/>
<LinearLayout
android:layout_width="match_parent"
android:id="@id/swipe_head"
android:background="@color/aqua"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="测试测试"/>
</LinearLayout>
<android.support.v7.widget.RecyclerView
android:id="@id/swipe_target"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clipToPadding="false"
android:clipToPadding="false"
android:overScrollMode="never"
android:scrollbars="none"/>
<include
android:id="@id/swipe_load_more_footer"
layout="@layout/layout_classic_footer"/>
</talex.zsw.baselibrary.view.SwipeToLoadLayout.SwipeToLoadLayout>
可用已定义的下拉刷新头部
layout_gif_header
layout_google_hook_header
layout_google_header
layout_jd_header
layout_twitter_header
layout_yalantis_header
可用已定义的上拉加载底部
layout_classic_footer
layout_google_hook_footer
layout_google_footer
1.在清单文件中添加开机启动的服务和广播
<!-- 开机启动 -->
<service
android:name="talex.zsw.basecore.service.BootService">
</service>
<receiver android:name="talex.zsw.basecore.receiver.BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<category android:name="android.intent.category.HOME" />
</intent-filter>
</receiver>
2.在清单文件中添加开机启动的权限
<!--开机启动服务-->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
3.在MyApplication中接收开机启动的事件
@Subscribe public void onEvent(BootEvent event)
{
Intent intentMainActivity = new Intent(this, MainActivity.class);
intentMainActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intentMainActivity);
}
1.在清单文件中添加获取地理位置的服务
<!-- 地理位置 -->
<service
android:name="talex.zsw.basecore.service.LocationService">
</service>
2.代码中启动服务
private boolean isBind = false;
private LocationService mLocationService = null;
private ServiceConnection mLocationServiceConnection = new ServiceConnection(){
@Override public void onServiceConnected(ComponentName name, IBinder service)
{
isBind = true;
mLocationService = ((LocationService.LocationBinder)service).getService();
mLocationService.setOnGetLocationListener(new LocationService.OnGetLocationListener(){
@Override
public void getLocation(String lastLatitude, String lastLongitude, String latitude, String longitude, String country, String locality, String street)
{
runOnUiThread(new Runnable(){
@Override public void run()
{
}
});
}
});
}
@Override public void onServiceDisconnected(ComponentName name)
{
mLocationService = null;
}
};
private void bindService()
{
PermissionHelper.requestLocation(new PermissionTool.FullCallback()
{
@Override public void onGranted(List<String> permissionsGranted)
{
Intent intent = new Intent(BaseMVPActivity.this, LocationService.class);
bindService(intent, mLocationServiceConnection, Context.BIND_AUTO_CREATE);
}
@Override public void onDenied(List<String> permissionsDeniedForever, List<String> permissionsDenied)
{
PermissionHelper.showOpenAppSettingDialog();
}
});
}
private void unBindService()
{
isBind = false;
unbindService(mLocationServiceConnection);
}
1.在清单文件中添加获取地理位置的服务
<!-- ping服务器 -->
<service
android:name="talex.zsw.basecore.service.PingService">
</service>
2.代码中启动服务
private PingService mPingService;
private ServiceConnection mPingServiceConnection = new ServiceConnection()
{
@Override public void onServiceConnected(ComponentName name, IBinder service)
{
LogTool.nv("onServiceConnected");
mPingService = ((PingService.PingBinder) service).getService();
mPingService.startPing("www.baidu.com", new NetPingTool.IOnNetPingListener()
{
@Override public void ontDelay(long log)
{
LogTool.ni("延迟 "+log+" ms");
}
@Override public void onError()
{
LogTool.ne("错误,网络不通");
}
});
}
@Override public void onServiceDisconnected(ComponentName name)
{
LogTool.nv("onServiceDisconnected");
mPingService = null;
}
};
private void bindPingService()
{
LogTool.nv("bindPingService");
Intent intent = new Intent(this, PingService.class);
bindService(intent, mPingServiceConnection, Context.BIND_AUTO_CREATE);
}
private void unBindPingService()
{
unbindService(mPingServiceConnection);
i}
以下文章与项目给予的极大灵感和支持
https://www.jianshu.com/u/46702d5c6978
https://github.com/vondear/RxTools
https://github.com/Blankj/AndroidUtilCode
https://github.com/zzhoujay/RichText
https://github.com/florent37/ViewAnimator
https://github.com/pedant/sweet-alert-dialog
https://github.com/Aspsine/SwipeToLoadLayout
https://github.com/grantland/android-autofittextview
https://github.com/bingoogolapple
https://github.com/dongjunkun/DropDownMenu
https://github.com/jjobes/SlideDateTimePicker
https://github.com/davemorrissey/subsampling-scale-image-view
https://github.com/hanks-zyh/AnimateCheckBox
https://github.com/square/android-times-square