() {
@Override
protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd");
}
};
/**
* 时间戳转特定格式时间
* @param dataFormat
* @param timeStamp
* @return
*/
public static String formatData(String dataFormat, long timeStamp) {
if (timeStamp == 0) {
return "";
}
timeStamp = timeStamp * 1000;
SimpleDateFormat format = new SimpleDateFormat(dataFormat);
return format.format(new Date(timeStamp));
}
/**
* 将毫秒转换成秒
*
* @param time
* @return
*/
public static int convertToSecond(Long time) {
Date date = new Date();
date.setTime(time);
return date.getSeconds();
}
/**
* 描述:String类型的日期时间转化为Date类型.
*
* @param strDate String形式的日期时间
* @param format 格式化字符串,如:"yyyy-MM-dd HH:mm:ss"
* @return Date Date类型日期时间
*/
public static Date getDateByFormat(String strDate, String format) {
SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);
Date date = null;
try {
date = mSimpleDateFormat.parse(strDate);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
/**
* 描述:获取偏移之后的Date.
*
* @param date 日期时间
* @param calendarField Calendar属性,对应offset的值, 如(Calendar.DATE,表示+offset天,Calendar.HOUR_OF_DAY,表示+offset小时)
* @param offset 偏移(值大于0,表示+,值小于0,表示-)
* @return Date 偏移之后的日期时间
*/
public Date getDateByOffset(Date date, int calendarField, int offset) {
Calendar c = new GregorianCalendar();
try {
c.setTime(date);
c.add(calendarField, offset);
} catch (Exception e) {
e.printStackTrace();
}
return c.getTime();
}
/**
* 描述:获取指定日期时间的字符串(可偏移).
*
* @param strDate String形式的日期时间
* @param format 格式化字符串,如:"yyyy-MM-dd HH:mm:ss"
* @param calendarField Calendar属性,对应offset的值, 如(Calendar.DATE,表示+offset天,Calendar.HOUR_OF_DAY,表示+offset小时)
* @param offset 偏移(值大于0,表示+,值小于0,表示-)
* @return String String类型的日期时间
*/
public static String getStringByOffset(String strDate, String format, int calendarField, int offset) {
String mDateTime = null;
try {
Calendar c = new GregorianCalendar();
SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);
c.setTime(mSimpleDateFormat.parse(strDate));
c.add(calendarField, offset);
mDateTime = mSimpleDateFormat.format(c.getTime());
} catch (ParseException e) {
e.printStackTrace();
}
return mDateTime;
}
/**
* 描述:Date类型转化为String类型(可偏移).
*
* @param date the date
* @param format the format
* @param calendarField the calendar field
* @param offset the offset
* @return String String类型日期时间
*/
public static String getStringByOffset(Date date, String format, int calendarField, int offset) {
String strDate = null;
try {
Calendar c = new GregorianCalendar();
SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);
c.setTime(date);
c.add(calendarField, offset);
strDate = mSimpleDateFormat.format(c.getTime());
} catch (Exception e) {
e.printStackTrace();
}
return strDate;
}
/**
* from yyyy-MM-dd HH:mm:ss to MM-dd HH:mm
*/
public static String formatDate(String before) {
String after;
try {
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
.parse(before);
after = new SimpleDateFormat("MM-dd HH:mm", Locale.getDefault()).format(date);
} catch (ParseException e) {
return before;
}
return after;
}
/**
* 描述:Date类型转化为String类型.
*
* @param date the date
* @param format the format
* @return String String类型日期时间
*/
public static String getStringByFormat(Date date, String format) {
SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);
String strDate = null;
try {
strDate = mSimpleDateFormat.format(date);
} catch (Exception e) {
e.printStackTrace();
}
return strDate;
}
/**
* 描述:获取指定日期时间的字符串,用于导出想要的格式.
*
* @param strDate String形式的日期时间,必须为yyyy-MM-dd HH:mm:ss格式
* @param format 输出格式化字符串,如:"yyyy-MM-dd HH:mm:ss"
* @return String 转换后的String类型的日期时间
*/
public static String getStringByFormat(String strDate, String format) {
String mDateTime = null;
try {
Calendar c = new GregorianCalendar();
SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);
c.setTime(mSimpleDateFormat.parse(strDate));
SimpleDateFormat mSimpleDateFormat2 = new SimpleDateFormat(format);
mDateTime = mSimpleDateFormat2.format(c.getTime());
} catch (Exception e) {
e.printStackTrace();
}
return mDateTime;
}
/**
* 描述:获取milliseconds表示的日期时间的字符串.
*
* @param format 格式化字符串,如:"yyyy-MM-dd HH:mm:ss"
* @return String 日期时间字符串
*/
public static String getStringByFormat(long milliseconds, String format) {
String thisDateTime = null;
try {
SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);
thisDateTime = mSimpleDateFormat.format(milliseconds);
} catch (Exception e) {
e.printStackTrace();
}
return thisDateTime;
}
/**
* 描述:获取表示当前日期时间的字符串.
*
* @param format 格式化字符串,如:"yyyy-MM-dd HH:mm:ss"
* @return String String类型的当前日期时间
*/
public static String getCurrentDate(String format) {
String curDateTime = null;
try {
SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);
Calendar c = new GregorianCalendar();
curDateTime = mSimpleDateFormat.format(c.getTime());
} catch (Exception e) {
e.printStackTrace();
}
return curDateTime;
}
//获取当前系统当天日期
public static String getCurrentDay() {
String curDateTime = null;
try {
SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(dateFormat);
Calendar c = new GregorianCalendar();
c.add(Calendar.DAY_OF_MONTH, 0);
curDateTime = mSimpleDateFormat.format(c.getTime());
} catch (Exception e) {
e.printStackTrace();
}
return curDateTime;
}
//获取当前系统当天日期
public static String getCurrentDay2() {
String curDateTime = null;
try {
SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(dateFormatYMDHMS);
Calendar c = new GregorianCalendar();
c.add(Calendar.DAY_OF_MONTH, 0);
curDateTime = mSimpleDateFormat.format(c.getTime());
} catch (Exception e) {
e.printStackTrace();
}
return curDateTime;
}
//获取当前系统前后第几天
public static String getNextDay(int i) {
String curDateTime = null;
try {
SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(dateFormat);
Calendar c = new GregorianCalendar();
c.add(Calendar.DAY_OF_MONTH, i);
curDateTime = mSimpleDateFormat.format(c.getTime());
} catch (Exception e) {
e.printStackTrace();
}
return curDateTime;
}
//获取当前系统前后第几小时
public static String getNextHour(int i) {
String curDateTime = null;
try {
SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(dateFormat);
Calendar c = new GregorianCalendar();
c.add(Calendar.HOUR_OF_DAY, i);
curDateTime = mSimpleDateFormat.format(c.getTime());
} catch (Exception e) {
e.printStackTrace();
}
return curDateTime;
}
/**
* 描述:获取表示当前日期时间的字符串(可偏移).
*
* @param format 格式化字符串,如:"yyyy-MM-dd HH:mm:ss"
* @param calendarField Calendar属性,对应offset的值, 如(Calendar.DATE,表示+offset天,Calendar.HOUR_OF_DAY,表示+offset小时)
* @param offset 偏移(值大于0,表示+,值小于0,表示-)
* @return String String类型的日期时间
*/
public static String getCurrentDateByOffset(String format, int calendarField, int offset) {
String mDateTime = null;
try {
SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);
Calendar c = new GregorianCalendar();
c.add(calendarField, offset);
mDateTime = mSimpleDateFormat.format(c.getTime());
} catch (Exception e) {
e.printStackTrace();
}
return mDateTime;
}
/**
* 描述:计算两个日期所差的天数.
*
* @param date1 第一个时间的毫秒表示
* @param date2 第二个时间的毫秒表示
* @return int 所差的天数
*/
public static int getOffectDay(long date1, long date2) {
Calendar calendar1 = Calendar.getInstance();
calendar1.setTimeInMillis(date1);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTimeInMillis(date2);
//先判断是否同年
int y1 = calendar1.get(Calendar.YEAR);
int y2 = calendar2.get(Calendar.YEAR);
int d1 = calendar1.get(Calendar.DAY_OF_YEAR);
int d2 = calendar2.get(Calendar.DAY_OF_YEAR);
int maxDays = 0;
int day = 0;
if (y1 - y2 > 0) {
maxDays = calendar2.getActualMaximum(Calendar.DAY_OF_YEAR);
day = d1 - d2 + maxDays;
} else if (y1 - y2 < 0) {
maxDays = calendar1.getActualMaximum(Calendar.DAY_OF_YEAR);
day = d1 - d2 - maxDays;
} else {
day = d1 - d2;
}
return day;
}
/**
* 描述:计算两个日期所差的小时数.
*
* @param date1 第一个时间的毫秒表示
* @param date2 第二个时间的毫秒表示
* @return int 所差的小时数
*/
public static int getOffectHour(long date1, long date2) {
Calendar calendar1 = Calendar.getInstance();
calendar1.setTimeInMillis(date1);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTimeInMillis(date2);
int h1 = calendar1.get(Calendar.HOUR_OF_DAY);
int h2 = calendar2.get(Calendar.HOUR_OF_DAY);
int h = 0;
int day = getOffectDay(date1, date2);
h = h1 - h2 + day * 24;
return h;
}
/**
* 描述:计算两个日期所差的分钟数.
*
* @param date1 第一个时间的毫秒表示
* @param date2 第二个时间的毫秒表示
* @return int 所差的分钟数
*/
public static int getOffectMinutes(long date1, long date2) {
Calendar calendar1 = Calendar.getInstance();
calendar1.setTimeInMillis(date1);
Calendar calendar2 = Calendar.getInstance();
calendar2.setTimeInMillis(date2);
int m1 = calendar1.get(Calendar.MINUTE);
int m2 = calendar2.get(Calendar.MINUTE);
int h = getOffectHour(date1, date2);
int m = 0;
m = m1 - m2 + h * 60;
return m;
}
/**
* 描述:获取本周一.
*
* @param format the format
* @return String String类型日期时间
*/
public static String getFirstDayOfWeek(String format) {
return getDayOfWeek(format, Calendar.MONDAY);
}
/**
* 描述:获取本周日.
*
* @param format the format
* @return String String类型日期时间
*/
public static String getLastDayOfWeek(String format) {
return getDayOfWeek(format, Calendar.SUNDAY);
}
/**
* 描述:获取本周的某一天.
*
* @param format the format
* @param calendarField the calendar field
* @return String String类型日期时间
*/
private static String getDayOfWeek(String format, int calendarField) {
String strDate = null;
try {
Calendar c = new GregorianCalendar();
SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);
int week = c.get(Calendar.DAY_OF_WEEK);
if (week == calendarField) {
strDate = mSimpleDateFormat.format(c.getTime());
} else {
int offectDay = calendarField - week;
if (calendarField == Calendar.SUNDAY) {
offectDay = 7 - Math.abs(offectDay);
}
c.add(Calendar.DATE, offectDay);
strDate = mSimpleDateFormat.format(c.getTime());
}
} catch (Exception e) {
e.printStackTrace();
}
return strDate;
}
/**
* 描述:获取本月第一天.
*
* @param format the format
* @return String String类型日期时间
*/
public static String getFirstDayOfMonth(String format) {
String strDate = null;
try {
Calendar c = new GregorianCalendar();
SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);
//当前月的第一天
c.set(GregorianCalendar.DAY_OF_MONTH, 1);
strDate = mSimpleDateFormat.format(c.getTime());
} catch (Exception e) {
e.printStackTrace();
}
return strDate;
}
/**
* 描述:获取本月最后一天.
*
* @param format the format
* @return String String类型日期时间
*/
public static String getLastDayOfMonth(String format) {
String strDate = null;
try {
Calendar c = new GregorianCalendar();
SimpleDateFormat mSimpleDateFormat = new SimpleDateFormat(format);
// 当前月的最后一天
c.set(Calendar.DATE, 1);
c.roll(Calendar.DATE, -1);
strDate = mSimpleDateFormat.format(c.getTime());
} catch (Exception e) {
e.printStackTrace();
}
return strDate;
}
/**
* 描述:获取表示当前日期的0点时间毫秒数.
*
* @return the first time of day
*/
public static long getFirstTimeOfDay() {
Date date = null;
try {
String currentDate = getCurrentDate(dateFormatYMD);
date = getDateByFormat(currentDate + " 00:00:00", dateFormatYMDHMS);
return date.getTime();
} catch (Exception e) {
}
return -1;
}
/**
* 描述:获取表示当前日期24点时间毫秒数.
*
* @return the last time of day
*/
public static long getLastTimeOfDay() {
Date date = null;
try {
String currentDate = getCurrentDate(dateFormatYMD);
date = getDateByFormat(currentDate + " 24:00:00", dateFormatYMDHMS);
return date.getTime();
} catch (Exception e) {
}
return -1;
}
/**
* 描述:判断是否是闰年()
* (year能被4整除 并且 不能被100整除) 或者 year能被400整除,则该年为闰年.
*
* @param year 年代(如2012)
* @return boolean 是否为闰年
*/
public static boolean isLeapYear(int year) {
if ((year % 4 == 0 && year % 400 != 0) || year % 400 == 0) {
return true;
} else {
return false;
}
}
/**
* 描述:根据时间返回几天前或几分钟的描述.
*
* @param strDate the str date
* @return the string
*/
public static String formatDateStr2Desc(String strDate, String outFormat) {
DateFormat df = new SimpleDateFormat(dateFormatYMDHM);
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
try {
c2.setTime(df.parse(strDate));
c1.setTime(new Date());
int d = getOffectDay(c1.getTimeInMillis(), c2.getTimeInMillis());
if (d == 0) {
int h = getOffectHour(c1.getTimeInMillis(), c2.getTimeInMillis());
if (h > 0) {
return h + "小时前";
} else if (h < 0) {
return Math.abs(h) + "小时后";
} else if (h == 0) {
int m = getOffectMinutes(c1.getTimeInMillis(), c2.getTimeInMillis());
if (m > 0) {
return m + "分钟前";
} else if (m < 0) {
return Math.abs(m) + "分钟后";
} else {
return "刚刚";
}
}
} else if (d > 0) {
if (d == 1) {
return "昨天";
} else if (d == 2) {
return "前天";
}
} else if (d < 0) {
if (d == -1) {
return "明天";
} else if (d == -2) {
return "后天";
}
return Math.abs(d) + "天后";
}
String out = getStringByFormat(strDate, outFormat);
if (!TextUtils.isEmpty(out)) {
return out;
}
} catch (Exception e) {
}
return strDate;
}
/**
* 取指定日期为星期几
*
* @param strDate 指定日期
* @param inFormat 指定日期格式
* @return String 星期几
*/
public static String getWeekNumber(String strDate, String inFormat) {
String week = "星期日";
Calendar calendar = new GregorianCalendar();
DateFormat df = new SimpleDateFormat(inFormat);
try {
calendar.setTime(df.parse(strDate));
} catch (Exception e) {
return "错误";
}
int intTemp = calendar.get(Calendar.DAY_OF_WEEK) - 1;
switch (intTemp) {
case 0:
week = "星期日";
break;
case 1:
week = "星期一";
break;
case 2:
week = "星期二";
break;
case 3:
week = "星期三";
break;
case 4:
week = "星期四";
break;
case 5:
week = "星期五";
break;
case 6:
week = "星期六";
break;
}
return week;
}
/**
* 将字符串转位日期类型
*
* @param sdate
* @return
*/
private static Date toDate(String sdate) {
try {
return dateFormater.get().parse(sdate);
} catch (ParseException e) {
return null;
}
}
/**
* 以友好的方式显示时间
*
* @param ms
* @return
*/
public static String getfriendlyTime(Long ms) {
if (ms == null) return "";
// Date time = toDate(sdate);
Date time = new Date();
time.setTime(ms);
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) {
if (((cal.getTimeInMillis() - time.getTime()) / 60000) < 1) {
ftime = "刚刚";
} else {
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 dateStr
* @return
*/
@SuppressLint("SimpleDateFormat")
public static int getExpiredHour(String dateStr) {
int ret = -1;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date;
try {
date = sdf.parse(dateStr);
Date dateNow = new Date();
long times = date.getTime() - dateNow.getTime();
if (times > 0) {
ret = ((int) (times / ONE_HOUR_MILLISECONDS));
} else {
ret = -1;
}
} catch (ParseException e) {
e.printStackTrace();
}
return ret;
}
/**
* 过了多少个小时
* @param dateStr
* @return
*/
@SuppressLint("SimpleDateFormat")
public static int getExpiredHour2(String dateStr) {
int ret = -1;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date sendDate;
try {
sendDate = sdf.parse(dateStr);
Date dateNow = new Date(System.currentTimeMillis());
Log.e("JPush","date="+sendDate);
long times = dateNow.getTime() - sendDate.getTime();
Log.e("JPush","date.getTime()="+sendDate.getTime());
if (times > 0) {
ret = ((int) (times / ONE_HOUR_MILLISECONDS));
int sdqf =(int) Math.floor(times /ONE_HOUR_MILLISECONDS);
} else {
ret = -1;
}
} catch (ParseException e) {
e.printStackTrace();
}
Log.e("JPush","ret="+ret);
return ret;
}
/**
* 判断给定字符串时间是否为今日
*
* @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;
}
/**
* 判断给定字符串时间是否为今日
*
* @param sdate
* @return boolean
*/
public static boolean isToday(long sdate) {
boolean b = false;
Date time = new Date(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;
}
/**
* 根据用户生日计算年龄
*/
public static int getAgeByBirthday(Date birthday) {
Calendar cal = Calendar.getInstance();
if (cal.before(birthday)) {
throw new IllegalArgumentException(
"The birthDay is before Now.It's unbelievable!");
}
int yearNow = cal.get(Calendar.YEAR);
int monthNow = cal.get(Calendar.MONTH) + 1;
int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH);
cal.setTime(birthday);
int yearBirth = cal.get(Calendar.YEAR);
int monthBirth = cal.get(Calendar.MONTH) + 1;
int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH);
int age = yearNow - yearBirth;
if (monthNow <= monthBirth) {
if (monthNow == monthBirth) {
// monthNow==monthBirth
if (dayOfMonthNow < dayOfMonthBirth) {
age--;
}
} else {
// monthNow>monthBirth
age--;
}
}
return age;
}
/**
* 友好显示时间差
*
* @param diff 毫秒
* @return
*/
public static String getFriendTimeOffer(long diff) {
int day = (int) (diff / (24 * 60 * 60 * 1000));
if (day > 0)
return day + "天";
int time = (int) (diff / (60 * 60 * 1000));
if (time > 0)
return time + "小时";
int min = (int) (diff / (60 * 1000));
if (min > 0)
return min + "分钟";
int sec = (int) diff / 1000;
if (sec > 0)
return sec + "秒";
return "1秒";
}
/**
* 友好的时间间隔
*
* @param duration 秒
* @return
*/
public static String getFriendlyDuration(long duration) {
String str = "";
long tmpDuration = duration;
str += (tmpDuration / 60 > 10 ? tmpDuration / 60 : "0" + tmpDuration / 60) + ":";
tmpDuration %= 60;
str += (tmpDuration / 1 >= 10 ? tmpDuration / 1 : "0" + tmpDuration / 1);
tmpDuration %= 1;
return str;
}
/**
* 友好的时间间隔2
*
* @param duration 秒
* @return
*/
public static String getFriendlyDuration2(long duration) {
String str = "";
long tmpDuration = duration;
str += (tmpDuration / 60>0?tmpDuration / 60+"'":"");
tmpDuration %= 60;
str += (tmpDuration / 1>=10?tmpDuration / 1+"''":"0"+tmpDuration / 1+"''");
tmpDuration %= 1;
return str;
}
public static String getFriendlyMusicDuration(long duration) {
String str = "-";
int tmpDuration = (int) (duration / 1000);//秒
str += (tmpDuration / 3600 > 10 ? tmpDuration / 3600 : "0" + tmpDuration / 3600) + ":";
tmpDuration %= 3600;
str += (tmpDuration / 60 > 10 ? tmpDuration / 60 : "0" + tmpDuration / 60) + ":";
tmpDuration %= 60;
str += (tmpDuration / 1 >= 10 ? tmpDuration / 1 : "0" + tmpDuration / 1);
tmpDuration %= 1;
return str;
}
/**
* 通过日期来确定星座
*
* @param mouth
* @param day
* @return
*/
public static String getStarSeat(int mouth, int day) {
String starSeat = null;
if ((mouth == 3 && day >= 21) || (mouth == 4 && day <= 19)) {
starSeat = "白羊座";
} else if ((mouth == 4 && day >= 20) || (mouth == 5 && day <= 20)) {
starSeat = "金牛座";
} else if ((mouth == 5 && day >= 21) || (mouth == 6 && day <= 21)) {
starSeat = "双子座";
} else if ((mouth == 6 && day >= 22) || (mouth == 7 && day <= 22)) {
starSeat = "巨蟹座";
} else if ((mouth == 7 && day >= 23) || (mouth == 8 && day <= 22)) {
starSeat = "狮子座";
} else if ((mouth == 8 && day >= 23) || (mouth == 9 && day <= 22)) {
starSeat = "处女座";
} else if ((mouth == 9 && day >= 23) || (mouth == 10 && day <= 23)) {
starSeat = "天秤座";
} else if ((mouth == 10 && day >= 24) || (mouth == 11 && day <= 22)) {
starSeat = "天蝎座";
} else if ((mouth == 11 && day >= 23) || (mouth == 12 && day <= 21)) {
starSeat = "射手座";
} else if ((mouth == 12 && day >= 22) || (mouth == 1 && day <= 19)) {
starSeat = "摩羯座";
} else if ((mouth == 1 && day >= 20) || (mouth == 2 && day <= 18)) {
starSeat = "水瓶座";
} else {
starSeat = "双鱼座";
}
return starSeat;
}
/**
* 返回聊天时间
* @return
*/
public static String getChatTimeForShow(long time){
if(TimeUtil.isToday(time)){
return TimeUtil.getStringByFormat(time, TimeUtil.dateFormatHMofChinese);
}else{
return TimeUtil.getStringByFormat(time, TimeUtil.dateFormatMDHMofChinese);
}
}
/**
* 获取指定时间的毫秒值
*/
public static long getDatelongMills(String fomat, String dateStr){
SimpleDateFormat sdf = new SimpleDateFormat(fomat);
Date date = null;
try {
date = sdf.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
long longDate = date.getTime();
return longDate;
}
/**
* 两个日期比较
* @param DATE1
* @param DATE2
* @return
*/
public static int compare_date(String DATE1, String DATE2) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.CHINA);
try {
Date dt1 = df.parse(DATE1);
Date dt2 = df.parse(DATE2);
if (dt1.getTime() - dt2.getTime()>0) {//date1>date2
return 1;
} else {
return -1;
}
} catch (Exception exception) {
exception.printStackTrace();
}
return 0;
}
}
================================================
FILE: LiveCircle/app/src/main/java/com/lvr/livecircle/utils/ToastUitl.java
================================================
package com.lvr.livecircle.utils;
import android.content.Context;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.lvr.livecircle.R;
import com.lvr.livecircle.base.BaseApplication;
/**
* Toast统一管理类
*/
public class ToastUitl {
private static Toast toast;
private static Toast toast2;
private static Toast initToast(CharSequence message, int duration) {
if (toast == null) {
toast = Toast.makeText(BaseApplication.getAppContext(), message, duration);
} else {
toast.setText(message);
toast.setDuration(duration);
}
return toast;
}
/**
* 短时间显示Toast
*
* @param message
*/
public static void showShort(CharSequence message) {
initToast(message, Toast.LENGTH_SHORT).show();
}
/**
* 短时间显示Toast
*
* @param strResId
*/
public static void showShort(int strResId) {
// Toast.makeText(context, strResId, Toast.LENGTH_SHORT).show();
initToast(BaseApplication.getAppContext().getResources().getText(strResId), Toast.LENGTH_SHORT).show();
}
/**
* 长时间显示Toast
*
* @param message
*/
public static void showLong(CharSequence message) {
initToast(message, Toast.LENGTH_LONG).show();
}
/**
* 长时间显示Toast
*
* @param strResId
*/
public static void showLong(int strResId) {
initToast(BaseApplication.getAppContext().getResources().getText(strResId), Toast.LENGTH_LONG).show();
}
/**
* 自定义显示Toast时间
*
* @param message
* @param duration
*/
public static void show(CharSequence message, int duration) {
initToast(message, duration).show();
}
/**
* 自定义显示Toast时间
*
* @param context
* @param strResId
* @param duration
*/
public static void show(Context context, int strResId, int duration) {
initToast(context.getResources().getText(strResId), duration).show();
}
/**
* 显示有image的toast
*
* @param tvStr
* @param imageResource
* @return
*/
public static Toast showToastWithImg(final String tvStr, final int imageResource) {
if (toast2 == null) {
toast2 = new Toast(BaseApplication.getAppContext());
}
View view = LayoutInflater.from(BaseApplication.getAppContext()).inflate(R.layout.toast_custom, null);
TextView tv = (TextView) view.findViewById(R.id.toast_custom_tv);
tv.setText(TextUtils.isEmpty(tvStr) ? "" : tvStr);
ImageView iv = (ImageView) view.findViewById(R.id.toast_custom_iv);
if (imageResource > 0) {
iv.setVisibility(View.VISIBLE);
iv.setImageResource(imageResource);
} else {
iv.setVisibility(View.GONE);
}
toast2.setView(view);
toast2.setGravity(Gravity.CENTER, 0, 0);
toast2.show();
return toast2;
}
}
================================================
FILE: LiveCircle/app/src/main/java/com/lvr/livecircle/video/VideoFragment.java
================================================
package com.lvr.livecircle.video;
import com.lvr.livecircle.R;
import com.lvr.livecircle.base.BaseFragment;
/**
* Created by lvr on 2017/2/6.
*/
public class VideoFragment extends BaseFragment {
@Override
protected int getLayoutResource() {
return R.layout.fragment_video;
}
@Override
protected void initView() {
}
}
================================================
FILE: LiveCircle/app/src/main/java/com/lvr/livecircle/widget/ClassicRefreshHeaderView.java
================================================
package com.lvr.livecircle.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.aspsine.irecyclerview.RefreshTrigger;
import com.lvr.livecircle.R;
public class ClassicRefreshHeaderView extends RelativeLayout implements RefreshTrigger {
private ImageView ivArrow;
private ImageView ivSuccess;
private TextView tvRefresh;
private ProgressBar progressBar;
private Animation rotateUp;
private Animation rotateDown;
private boolean rotated = false;
private int mHeight;
public ClassicRefreshHeaderView(Context context) {
this(context, null);
}
public ClassicRefreshHeaderView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ClassicRefreshHeaderView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
inflate(context, R.layout.layout_irecyclerview_classic_refresh_header_view, this);
tvRefresh = (TextView) findViewById(R.id.tvRefresh);
ivArrow = (ImageView) findViewById(R.id.ivArrow);
ivSuccess = (ImageView) findViewById(R.id.ivSuccess);
progressBar = (ProgressBar) findViewById(R.id.progressbar);
rotateUp = AnimationUtils.loadAnimation(context, R.anim.rotate_up);
rotateDown = AnimationUtils.loadAnimation(context, R.anim.rotate_down);
}
@Override
public void onStart(boolean automatic, int headerHeight, int finalHeight) {
this.mHeight = headerHeight;
progressBar.setIndeterminate(false);
}
@Override
public void onMove(boolean isComplete, boolean automatic, int moved) {
if (!isComplete) {
ivArrow.setVisibility(VISIBLE);
progressBar.setVisibility(GONE);
ivSuccess.setVisibility(GONE);
if (moved <= mHeight) {
if (rotated) {
ivArrow.clearAnimation();
ivArrow.startAnimation(rotateDown);
rotated = false;
}
tvRefresh.setText("下拉刷新");
} else {
tvRefresh.setText("释放刷新");
if (!rotated) {
ivArrow.clearAnimation();
ivArrow.startAnimation(rotateUp);
rotated = true;
}
}
}
}
@Override
public void onRefresh() {
ivSuccess.setVisibility(GONE);
ivArrow.clearAnimation();
ivArrow.setVisibility(GONE);
progressBar.setVisibility(VISIBLE);
tvRefresh.setText("正在刷新");
}
@Override
public void onRelease() {
}
@Override
public void onComplete() {
rotated = false;
ivSuccess.setVisibility(VISIBLE);
ivArrow.clearAnimation();
ivArrow.setVisibility(GONE);
progressBar.setVisibility(GONE);
tvRefresh.setText("刷新完成");
}
@Override
public void onReset() {
rotated = false;
ivSuccess.setVisibility(GONE);
ivArrow.clearAnimation();
ivArrow.setVisibility(GONE);
progressBar.setVisibility(GONE);
}
}
================================================
FILE: LiveCircle/app/src/main/java/com/lvr/livecircle/widget/ItemDragHelperCallback.java
================================================
/*
* Copyright (c) 2016 咖枯
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.lvr.livecircle.widget;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.support.v7.widget.helper.ItemTouchHelper;
public class ItemDragHelperCallback extends ItemTouchHelper.Callback {
private OnItemMoveListener mOnItemMoveListener;
private boolean mIsLongPressEnabled;
public void setLongPressEnabled(boolean longPressEnabled) {
mIsLongPressEnabled = longPressEnabled;
}
public interface OnItemMoveListener {
boolean onItemMove(int fromPosition, int toPosition);
}
//相当于 set 设置监听 传入ChannelAdapter中的OnItemMoveListener对象
public ItemDragHelperCallback(OnItemMoveListener onItemMoveListener) {
mOnItemMoveListener = onItemMoveListener;
}
//返回true 允许拖拽
@Override
public boolean isLongPressDragEnabled() {
return mIsLongPressEnabled;
}
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
//根据recyclerView的布局,进行设置拖拽的方向
int dragFlags = setDragFlags(recyclerView);
//不允许进行滑动
int swipeFlags = 0;
return makeMovementFlags(dragFlags, swipeFlags);
}
private int setDragFlags(RecyclerView recyclerView) {
int dragFlags;
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (layoutManager instanceof GridLayoutManager || layoutManager instanceof StaggeredGridLayoutManager) {
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
} else {
dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
}
return dragFlags;
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
return mOnItemMoveListener.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
}
}
================================================
FILE: LiveCircle/app/src/main/java/com/lvr/livecircle/widget/LoadMoreFooterView.java
================================================
package com.lvr.livecircle.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import com.lvr.livecircle.R;
public class LoadMoreFooterView extends FrameLayout {
private Status mStatus;
private View mLoadingView;
private View mErrorView;
private View mTheEndView;
private OnRetryListener mOnRetryListener;
public LoadMoreFooterView(Context context) {
this(context, null);
}
public LoadMoreFooterView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public LoadMoreFooterView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
LayoutInflater.from(context).inflate(R.layout.layout_irecyclerview_load_more_footer_view, this, true);
mLoadingView = findViewById(R.id.loadingView);
mErrorView = findViewById(R.id.errorView);
mTheEndView = findViewById(R.id.theEndView);
mErrorView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mOnRetryListener != null) {
mOnRetryListener.onRetry(LoadMoreFooterView.this);
}
}
});
setStatus(Status.GONE);
}
public void setOnRetryListener(OnRetryListener listener) {
this.mOnRetryListener = listener;
}
public Status getStatus() {
return mStatus;
}
public void setStatus(Status status) {
this.mStatus = status;
change();
}
public boolean canLoadMore() {
return mStatus == Status.GONE || mStatus == Status.ERROR;
}
private void change() {
switch (mStatus) {
case GONE:
mLoadingView.setVisibility(GONE);
mErrorView.setVisibility(GONE);
mTheEndView.setVisibility(GONE);
break;
case LOADING:
mLoadingView.setVisibility(VISIBLE);
mErrorView.setVisibility(GONE);
mTheEndView.setVisibility(GONE);
break;
case ERROR:
mLoadingView.setVisibility(GONE);
mErrorView.setVisibility(VISIBLE);
mTheEndView.setVisibility(GONE);
break;
case THE_END:
mLoadingView.setVisibility(GONE);
mErrorView.setVisibility(GONE);
mTheEndView.setVisibility(VISIBLE);
break;
}
}
public enum Status {
GONE, LOADING, ERROR, THE_END
}
public interface OnRetryListener {
void onRetry(LoadMoreFooterView view);
}
}
================================================
FILE: LiveCircle/app/src/main/java/com/lvr/livecircle/widget/LoadingDialog.java
================================================
package com.lvr.livecircle.widget;
import android.app.Activity;
import android.app.Dialog;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.lvr.livecircle.R;
public class LoadingDialog {
/** 加载数据对话框 */
private static Dialog mLoadingDialog;
/**
* 显示加载对话框
* @param context 上下文
* @param msg 对话框显示内容
* @param cancelable 对话框是否可以取消
*/
public static Dialog showDialogForLoading(Activity context, String msg, boolean cancelable) {
View view = LayoutInflater.from(context).inflate(R.layout.dialog_loading, null);
TextView loadingText = (TextView)view.findViewById(R.id.id_tv_loading_dialog_text);
loadingText.setText(msg);
mLoadingDialog = new Dialog(context, R.style.CustomProgressDialog);
mLoadingDialog.setCancelable(cancelable);
mLoadingDialog.setCanceledOnTouchOutside(false);
mLoadingDialog.setContentView(view, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
mLoadingDialog.show();
return mLoadingDialog;
}
public static Dialog showDialogForLoading(Activity context) {
View view = LayoutInflater.from(context).inflate(R.layout.dialog_loading, null);
TextView loadingText = (TextView)view.findViewById(R.id.id_tv_loading_dialog_text);
loadingText.setText("加载中...");
mLoadingDialog = new Dialog(context, R.style.CustomProgressDialog);
mLoadingDialog.setCancelable(true);
mLoadingDialog.setCanceledOnTouchOutside(false);
mLoadingDialog.setContentView(view, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));
mLoadingDialog.show();
return mLoadingDialog;
}
/**
* 关闭加载对话框
*/
public static void cancelDialogForLoading() {
if(mLoadingDialog != null) {
mLoadingDialog.cancel();
}
}
}
================================================
FILE: LiveCircle/app/src/main/java/com/lvr/livecircle/widget/LoadingTip.java
================================================
package com.lvr.livecircle.widget;
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.lvr.livecircle.R;
/**
* 加载页面内嵌提示
*/
public class LoadingTip extends LinearLayout {
private ImageView img_tip_logo;
private ProgressBar progress;
private TextView tv_tips;
private Button bt_operate;
private String errorMsg;
private onReloadListener onReloadListener;
public LoadingTip(Context context) {
super(context);
initView(context);
}
public LoadingTip(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public LoadingTip(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public LoadingTip(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
initView(context);
}
//分为服务器失败,网络加载失败、数据为空、加载中、完成四种状态
public static enum LoadStatus {
sereverError,error, empty, loading,finish
}
private void initView(Context context) {
View.inflate(context, R.layout.dialog_loading_tip, this);
img_tip_logo = (ImageView) findViewById(R.id.img_tip_logo);
progress = (ProgressBar) findViewById(R.id.progress);
tv_tips = (TextView) findViewById(R.id.tv_tips);
bt_operate = (Button) findViewById(R.id.bt_operate);
//重新尝试
bt_operate.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
if(onReloadListener!=null){
onReloadListener.reload();
}
}
});
setVisibility(View.GONE);
}
public void setTips(String tips){
if(tv_tips!=null){
tv_tips.setText(tips);
}
}
/**
* 根据状态显示不同的提示
* @param loadStatus
*/
public void setLoadingTip(LoadStatus loadStatus){
switch (loadStatus){
case empty:
setVisibility(View.VISIBLE);
img_tip_logo.setVisibility(View.VISIBLE);
progress.setVisibility(View.GONE);
tv_tips.setText(getContext().getText(R.string.empty).toString());
img_tip_logo.setImageResource(R.drawable.no_content_tip);
break;
case sereverError:
setVisibility(View.VISIBLE);
img_tip_logo.setVisibility(View.VISIBLE);
progress.setVisibility(View.GONE);
if (TextUtils.isEmpty(errorMsg)){
tv_tips.setText(getContext().getText(R.string.net_error).toString());
}else {
tv_tips.setText(errorMsg);
}
img_tip_logo.setImageResource(R.drawable.ic_wrong);
break;
case error:
setVisibility(View.VISIBLE);
img_tip_logo.setVisibility(View.VISIBLE);
progress.setVisibility(View.GONE);
if (TextUtils.isEmpty(errorMsg)){
tv_tips.setText(getContext().getText(R.string.net_error).toString());
}else {
tv_tips.setText(errorMsg);
}
img_tip_logo.setImageResource(R.drawable.ic_wifi_off);
break;
case loading:
setVisibility(View.VISIBLE);
img_tip_logo.setVisibility(View.GONE);
progress.setVisibility(View.VISIBLE);
tv_tips.setText(getContext().getText(R.string.loading).toString());
break;
case finish:
setVisibility(View.GONE);
break;
}
}
public void setOnReloadListener(onReloadListener onReloadListener){
this.onReloadListener=onReloadListener;
}
/**
* 重新尝试接口
*/
public interface onReloadListener{
void reload();
}
}
================================================
FILE: LiveCircle/app/src/main/java/com/lvr/livecircle/widget/ScrollAwareFABBehavior.java
================================================
/*
* Copyright (c) 2016 咖枯
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.lvr.livecircle.widget;
import android.content.Context;
import android.support.design.widget.CoordinatorLayout;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.view.View;
public class ScrollAwareFABBehavior extends FloatingActionButton.Behavior {
public ScrollAwareFABBehavior(Context context, AttributeSet attrs) {
super();
}
@Override
public boolean onStartNestedScroll(final CoordinatorLayout coordinatorLayout, final FloatingActionButton child,
final View directTargetChild, final View target, final int nestedScrollAxes) {
// Ensure we react to vertical scrolling
return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL
|| super.onStartNestedScroll(coordinatorLayout, child, directTargetChild, target, nestedScrollAxes);
}
@Override
public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child,
View target, int dxConsumed, int dyConsumed, int dxUnconsumed,
int dyUnconsumed) {
super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed);
if (dyConsumed > 0 && child.getVisibility() == View.VISIBLE) {
child.setVisibility(View.INVISIBLE);
} else if (dyConsumed < 0 && child.getVisibility() ==View.INVISIBLE) {
child.setVisibility(View.VISIBLE);
}
}
}
================================================
FILE: LiveCircle/app/src/main/java/com/lvr/livecircle/widget/StatusBarView.java
================================================
package com.lvr.livecircle.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
/**
* Created by Jaeger on 16/6/8.
*
* Email: chjie.jaeger@gmail.com
* GitHub: https://github.com/laobie
*/
public class StatusBarView extends View {
public StatusBarView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public StatusBarView(Context context) {
super(context);
}
}
================================================
FILE: LiveCircle/app/src/main/java/com/lvr/livecircle/widget/URLImageGetter.java
================================================
/*
* Copyright (c) 2016 咖枯
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.lvr.livecircle.widget;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.Html;
import android.widget.TextView;
import com.lvr.livecircle.R;
import com.lvr.livecircle.api.ApiService;
import com.lvr.livecircle.app.AppApplication;
import com.lvr.livecircle.client.RetrofitClient;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;
import okhttp3.ResponseBody;
/**
* @author 咖枯
* @version 1.0 2016/6/19
*/
public class URLImageGetter implements Html.ImageGetter {
private TextView mTextView;
private int mPicWidth;
private String mNewsBody;
private int mPicCount;
private int mPicTotal;
private static final String mFilePath = AppApplication.getAppContext().getCacheDir().getAbsolutePath();
public Disposable mDisposable;
public URLImageGetter(TextView textView, String newsBody, int picTotal) {
mTextView = textView;
mPicWidth = mTextView.getWidth();
mNewsBody = newsBody;
mPicTotal = picTotal;
}
@Override
public Drawable getDrawable(final String source) {
Drawable drawable;
File file = new File(mFilePath, source.hashCode() + "");
if (file.exists()) {
mPicCount++;
drawable = getDrawableFromDisk(file);
} else {
drawable = getDrawableFromNet(source);
}
return drawable;
}
@Nullable
private Drawable getDrawableFromDisk(File file) {
Drawable drawable = Drawable.createFromPath(file.getAbsolutePath());
if (drawable != null) {
int picHeight = calculatePicHeight(drawable);
drawable.setBounds(0, 0, mPicWidth, picHeight);
}
return drawable;
}
private int calculatePicHeight(Drawable drawable) {
float imgWidth = drawable.getIntrinsicWidth();
float imgHeight = drawable.getIntrinsicHeight();
float rate = imgHeight / imgWidth;
return (int) (mPicWidth * rate);
}
@NonNull
private Drawable getDrawableFromNet(final String source) {
RetrofitClient retrofitClient = RetrofitClient.getInstance(AppApplication.getAppContext(), ApiService.NEWS_BASE_URL);
ApiService api = retrofitClient.create(ApiService.class);
api.getNewsBodyHtmlPhoto(source)
.unsubscribeOn(Schedulers.io())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.map(new Function() {
@Override
public Boolean apply(ResponseBody body) throws Exception {
return WritePicToDisk(body, source);
}
})
.subscribe(new Observer() {
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
@Override
public void onSubscribe(Disposable d) {
mDisposable = d;
}
@Override
public void onNext(Boolean isLoadSuccess) {
mPicCount++;
if (isLoadSuccess && (mPicCount == mPicTotal - 1)) {
mTextView.setText(Html.fromHtml(mNewsBody, URLImageGetter.this, null));
}
}
});
return createPicPlaceholder();
}
@NonNull
private Boolean WritePicToDisk(ResponseBody response, String source) {
File file = new File(mFilePath, source.hashCode() + "");
InputStream in = null;
FileOutputStream out = null;
try {
in = response.byteStream();
out = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
return true;
} catch (Exception e) {
return false;
} finally {
try {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
} catch (IOException e) {
}
}
}
@SuppressWarnings("deprecation")
@NonNull
private Drawable createPicPlaceholder() {
Drawable drawable;
int color = R.color.white;
drawable = new ColorDrawable(AppApplication.getAppContext().getResources().getColor(color));
drawable.setBounds(0, 0, mPicWidth, mPicWidth / 3);
return drawable;
}
}
================================================
FILE: LiveCircle/app/src/main/res/anim/act_fade_in_center.xml
================================================