Android之开源中国客户端源码分析(二)
1、 加载动画圈实现
<ProgressBar
android:id="@+id/main_head_progress"
style="@style/loading_small"
android:layout_toRightOf="@id/main_head_title"
android:layout_centerVertical="true"
android:layout_marginLeft="5.0dip"
android:visibility="gone"/>
@style/loading_small
<item name="android:indeterminateDrawable">@anim/loading</item>
@anim/loading
<?xml version="1.0" encoding="UTF-8"?>
<animation-list android:oneshot="false"
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:duration="100" android:drawable="@drawable/loading_0" />
<item android:duration="100" android:drawable="@drawable/loading_1" />
<item android:duration="100" android:drawable="@drawable/loading_2" />
<item android:duration="100" android:drawable="@drawable/loading_3" />
<item android:duration="100" android:drawable="@drawable/loading_4" />
<item android:duration="100" android:drawable="@drawable/loading_5" />
<item android:duration="100" android:drawable="@drawable/loading_6" />
<item android:duration="100" android:drawable="@drawable/loading_7" />
</animation-list>
显示:Progress.setVisibility(ProgressBar.VISIBLE);
消失:Progress.setVisibility(ProgressBar.GONE);
工具类StringUtil:
public class StringUtils
{
private final static Pattern emailer = Pattern.compile("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*");
//private final static SimpleDateFormat dateFormater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//private final static SimpleDateFormat dateFormater2 = new SimpleDateFormat("yyyy-MM-dd"); private final static ThreadLocal<SimpleDateFormat> dateFormater = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
}; private final static ThreadLocal<SimpleDateFormat> dateFormater2 = new ThreadLocal<SimpleDateFormat>() {
@Override
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd");
}
}; /**
* 将字符串转位日期类型
* @param sdate sdate的样式:2013-09-23 17:10:35
* @return
*/
public static Date toDate(String sdate) {
try {
return dateFormater.get().parse(sdate);
} catch (ParseException e) {
return null;
}
} /**
* 以友好的方式显示时间
* @param sdate
* @return
*/
public static String friendly_time(String sdate) {
Date time = toDate(sdate);
if(time == null) {
return "Unknown";
}
String ftime = "";
Calendar cal = Calendar.getInstance(); //判断是否是同一天
String curDate = dateFormater2.get().format(cal.getTime());
String paramDate = dateFormater2.get().format(time);
if(curDate.equals(paramDate)){
int hour = (int)((cal.getTimeInMillis() - time.getTime())/3600000);
if(hour == 0)
ftime = Math.max((cal.getTimeInMillis() - time.getTime()) / 60000,1)+"分钟前";
else
ftime = hour+"小时前";
return ftime;
} long lt = time.getTime()/86400000;
long ct = cal.getTimeInMillis()/86400000;
int days = (int)(ct - lt);
if(days == 0){
int hour = (int)((cal.getTimeInMillis() - time.getTime())/3600000);
if(hour == 0)
ftime = Math.max((cal.getTimeInMillis() - time.getTime()) / 60000,1)+"分钟前";
else
ftime = hour+"小时前";
}
else if(days == 1){
ftime = "昨天";
}
else if(days == 2){
ftime = "前天";
}
else if(days > 2 && days <= 10){
ftime = days+"天前";
}
else if(days > 10){
ftime = dateFormater2.get().format(time);
}
return ftime;
} /**
* 判断给定字符串时间是否为今日
* @param sdate
* @return boolean
*/
public static boolean isToday(String sdate){
boolean b = false;
Date time = toDate(sdate);
Date today = new Date();
if(time != null){
String nowDate = dateFormater2.get().format(today);
String timeDate = dateFormater2.get().format(time);
if(nowDate.equals(timeDate)){
b = true;
}
}
return b;
} /**
* 判断给定字符串是否空白串。
* 空白串是指由空格、制表符、回车符、换行符组成的字符串
* 若输入字符串为null或空字符串,返回true
* @param input
* @return boolean
*/
public static boolean isEmpty( String input )
{
if ( input == null || "".equals( input ) )
return true; for ( int i = 0; i < input.length(); i++ )
{
char c = input.charAt( i );
if ( c != ' ' && c != '\t' && c != '\r' && c != '\n' )
{
return false;
}
}
return true;
} /**
* 判断是不是一个合法的电子邮件地址
* @param email
* @return
*/
public static boolean isEmail(String email){
if(email == null || email.trim().length()==0)
return false;
return emailer.matcher(email).matches();
}
/**
* 字符串转整数
* @param str
* @param defValue
* @return
*/
public static int toInt(String str, int defValue) {
try{
return Integer.parseInt(str);
}catch(Exception e){}
return defValue;
}
/**
* 对象转整数
* @param obj
* @return 转换异常返回 0
*/
public static int toInt(Object obj) {
if(obj==null) return 0;
return toInt(obj.toString(),0);
}
/**
* 对象转整数
* @param obj
* @return 转换异常返回 0
*/
public static long toLong(String obj) {
try{
return Long.parseLong(obj);
}catch(Exception e){}
return 0;
}
/**
* 字符串转布尔值
* @param b
* @return 转换异常返回 false
*/
public static boolean toBool(String b) {
try{
return Boolean.parseBoolean(b);
}catch(Exception e){}
return false;
}
}
Android之开源中国客户端源码分析(二)的更多相关文章
- Android之开源中国客户端源码分析(一)
程序启动第一个界面类: net.oschina.app.AppStart功能描述:一张图片代码细节描述:一个透明度的动画效果,效果动画完成后自动启动新的Activity(Main) 基本BaseAct ...
- android 在线升级借助开源中国App源码
android 在线升级借助开源中国App源码 http://www.cnblogs.com/luomingui/p/3949429.html android 在线升级借助开源中国App源码分析如下: ...
- Fresco 源码分析(二) Fresco客户端与服务端交互(1) 解决遗留的Q1问题
4.2 Fresco客户端与服务端的交互(一) 解决Q1问题 从这篇博客开始,我们开始讨论客户端与服务端是如何交互的,这个交互的入口,我们从Q1问题入手(博客按照这样的问题入手,是因为当时我也是从这里 ...
- Android Small插件化框架源码分析
Android Small插件化框架源码分析 目录 概述 Small如何使用 插件加载流程 待改进的地方 一.概述 Small是一个写得非常简洁的插件化框架,工程源码位置:https://github ...
- Eureka 系列(04)客户端源码分析
Eureka 系列(04)客户端源码分析 [TOC] 0. Spring Cloud 系列目录 - Eureka 篇 在上一篇 Eureka 系列(01)最简使用姿态 中对 Eureka 的简单用法做 ...
- 开源MyBatisGenerator组件源码分析
开源MyBatisGenerator组件源码分析 看源码前,先了解Generator能做什么? MyBatisGenerator是用来生成mybatis的Mapper接口和xml文件的工具,提供多种启 ...
- Tomcat源码分析二:先看看Tomcat的整体架构
Tomcat源码分析二:先看看Tomcat的整体架构 Tomcat架构图 我们先来看一张比较经典的Tomcat架构图: 从这张图中,我们可以看出Tomcat中含有Server.Service.Conn ...
- Android笔记--View绘制流程源码分析(二)
Android笔记--View绘制流程源码分析二 通过上一篇View绘制流程源码分析一可以知晓整个绘制流程之前,在activity启动过程中: Window的建立(activit.attach生成), ...
- Vue源码分析(二) : Vue实例挂载
Vue源码分析(二) : Vue实例挂载 author: @TiffanysBear 实例挂载主要是 $mount 方法的实现,在 src/platforms/web/entry-runtime-wi ...
随机推荐
- Loadrunner上传文件解决办法(大文件)
Loadrunner上传文件解决办法(大文件) 最近再做一个跟海量存储相关的项目测试,需要通过LR模拟用户大量上传和下载文件,请求是Rest或Soap,同时还要模拟多种大小尺寸不一的文件 通常情况下, ...
- 百度地图API--Key的获得
[开年后花了半个月的时间学习了百度地图API开发,准备投入项目中,学习的过程中写了一些简单的总结,在部门内部做了一个简单的分享培训,这里希望将自己的仅有的一点点关于百度地图API的收获分享给社区,整个 ...
- 标准c库函数与Linux下系统函数库 区别 (即带不带缓冲区的学习)
我们都知道,C语言在UNIX/Linux系统下有一套系统调用(系统函数),比如文件操作open().close().write().read()等,而标准C语言的库函数中也有一套对文件的操作函数fop ...
- Win10 重装后,必须修改的设置
作为一个程序猿,系统易用性是相当重要,每次重装WIN10 都会遇到一头包的问题,比如不能远程,打开文件各种提示需要管理员权限(mlgb很想骂人,我明明是管理员权限) ,然后开了管理员权限,结果又不能用 ...
- BZOJ 2726: [SDOI2012]任务安排 [斜率优化DP 二分 提前计算代价]
2726: [SDOI2012]任务安排 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 868 Solved: 236[Submit][Status ...
- Java输入输出入门 A+B
描述 求两个整数之和. 输入 输入数据只包括两个整数A和B. 输出 两个整数的和. 样例输入 1 2 样例输出 3 import java.util.Scanner; public class Mai ...
- 关于django Class-based views的理解
django是mvt模式,其中v就是这个显示逻辑部分,简单来讲,view函数可以说是接收request,然后处理,返回response的主体函数. 对于一些简单的逻辑关系,可以用直接用函数模式来进行处 ...
- 洛谷P2746 USACO5.1 校园网
题目描述 一些学校连入一个电脑网络.那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”).注意即使 B 在 A 学校的分发列表中, A 也不一定在 B 学校的列表中. 你要写 ...
- Window 下安装
Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases Redis 支持 32 位和 64 位.这个需要根据你系统平台的实际情况选择, ...
- 简单的文件上传html+ashx
前台页面:<form action="upload.ashx" method="post" enctype="multipart/form-da ...