当前位置: 编程技术>移动开发
本页文章导读:
▪技术-Java 技术---Java
怎样成为一名Android开发者hris(克里斯)是一位来自波兰的Android应用开发者,最为一名非著名的开发者他开发的应用在Android Market上免费提供下载,并通过广告获得收入,最近他在.........
▪ ListView 分段展示 ListView 分段显示
Android market里软件列表,每页显示10条记录,没有显示上一页,下一页的按钮,依靠手滑动动态加载数据,当向下滚动时,最下边显示 Loading… 。数据加载结束,Loading底栏消.........
▪ 中国阴历算法 中国农历算法
Java代码
/**
* ChineseCalendarGB.java
* Copyright (c) 1997-2002 by Dr. Herong Yang
* 中国农历算法 - 实用于公历 1901 年至 2100 年之间的 200 年
*/
import
.........
[1]技术-Java
来源: 互联网 发布时间: 2014-02-18
技术---Java
怎样成为一名Android开发者
hris(克里斯)是一位来自波兰的Android应用开发者,最为一名非著名的开发者他开发的应用在Android Market上免费提供下载,并通过广告获得收入,最近他在自己的博客上面分享了从事Android开发带来的收入情况,并通过自己的经历给予 Android开发入门者非常忠实的忠告。作为国内从事Android开发的同行,APP虎第一时间发现并翻译了他的文章,以与广大Android开发者和即将进入Android开发的人们分享。
很多人认为从事Android开发是一件赔本的买卖。 他们说,如果你想赚钱,你应该转向iPhone,iPad和所有其他的平台。但事实显然不是这样的,虽然从事Android开发并没有让我收入数千美元,但我的收入是稳定的,并且一直在增长。
尽管我并不是顶级的开发者,并且也没有任何应用被Android Market推荐过。 我只是成千上万名Android开发者之间默默无闻的一个,我的应用也不是那么的有名。 但这有什么好奇怪的呢?我所有的应用程序都是免费的,因为谷歌不允许来至我的国家(波兰)的开发者通过Android Market出售应用程序!
所以请你记住这些事实:
1 Android Market从来没有在Top的推荐位置推荐过我的应用程序
2 我只提供(主要是由于Android Market的限制)免费的应用程序
3 即使我能够在Android Market出售应用程序我也不会将它作为主要收入来源(我相信广告才是最主要的收入来源)
我所有的收入都来自应用程序中的广告。 这是它们在Android Market下载次数:
1 X-Ray Scanner(超过268000下载)
2 Cracked Screen(超过182000下载)
3 Virtual Drums (超过20000下载)
4 Daily Beauty Tips (超过11000下载)
5 Don’t push it (超过6 500下载)
6 WP Stats (超过4 000下载)
我从2010年4月开始学习Android应用开发。并且在5月份便发布了我的第一个Android应用——WP Stats,它带给我几美元的收入。虽然我一直期待这个应用是我最受欢迎的应用,可惜它不是。在我已经发布的几个应用程序中,有很多比它更受欢迎。这里是我这几个月通过Android应用的总收入明细:
• 2010年5月 – 4.92美元
• 2010年6月 – 138.87美元
• 2010年7月 – 538.26美元
• 2010年8月 – 920.00美元
• 2010年9月 – 1545.45美元
• 2010年10月 – 1059.31美元
十月份的收入看起来有所下降,但事实上发生这种情况是因为我没有着这一个月之内没有更新过应用程序。因此,大家可以看到,虽然收入不高,但是却是稳步增长的!并且这些收入全部来自广告。
即使这样,在我看来,从事Android开发给我带来的收入甚至远没有达到iPhone开发人员的水平。 但不管怎么说,从事Android开发是非常有前途的,特别是对于新的应用点子有很大的发展空间。下面这些问题是在成为一名开发者之前常常困扰我的,所以,如果你有兴趣让Android开发成为您每月一笔收入来源,这篇文章可能对你有帮助。
我应该熟练的掌握JAVA——事实并非如此!
有很多专家都会非常严肃的说:“你必须要熟练的掌握Java,否则您做梦都不要期望成为一名Android开发者!”。 以我的情况来看,事实并非如此,我仅仅只是对于PHP非常熟练。 至于Java,我一直计划着在空余时间好好的学习它,但是我几乎没有空闲时间,所以我只只是略知皮毛。虽然我购买了《 Thinking in Java 》,但不幸的是到目前为止我还没有看完第三章。 所以,非常基本的Java的基础知识,这就是你所需要的!
我必须先熟练的掌握一种IDE(Eclipse或NetBeans)——这也是错误的!
另外,专家们还会说会说:“你必须要先完美的掌握一种IDE,否则在学习一门新的语言之前你便会掉队!”。专家们总是这么耸人听闻,看来,我不是真正的专家。因为我是在学习 Java Dalvik ( Android apps开发语言) 的同时才开始使用IDE(Eclipse)的。 所以,事实是你只需要在需要使用的时候再开始学习它,而那些IDE专家撰写的有关书籍在大多数情况下是浪费时间和金钱。
我需要拥有一台基于Android的手机——这(再一次)是错误的!
如果你拥有一台Android手机,那当然最好。甚至,你最好能够几台不同系统版本的Android手机来测试你的应用——如果你准备让他们在所有的Android设备中正常工作! 但是事实上这并不能解决所有的问题。 虽然一台真正的Android手机有利于你测试自己的应用程序,但在大多数情况下Android模拟器(包含在Android SDK中)便已经足够了。
那么什么是你真正需要的?
在我看来,想要成为一名真正的Android开发者,你需要拥有这些东西:
• Java基本知识(或任何其他面向对象语言)
• 免费下载的Android SDK(包含Android模拟器)
• 免费的IDE (例如Eclipse)
• 免费的Android文档
还有一些并不是必要的,但可能非常有用的东西:
• 一部Android手机(我的选择是HTC Desire )
• 一本不错的Android开发入门书籍(我买了两本让我非常满意的书籍——《Hello, Android 》和 《Beginning Android 2》
所以,如果你真的想成为一名Android开发者——不要被砖家吓到。只要你肯努力学习它,你会惊奇地发现它是那么的容易!
来源:草根网(www.20ju.com) - 互联网界的读者文摘
怎样成为一名Android开发者
hris(克里斯)是一位来自波兰的Android应用开发者,最为一名非著名的开发者他开发的应用在Android Market上免费提供下载,并通过广告获得收入,最近他在自己的博客上面分享了从事Android开发带来的收入情况,并通过自己的经历给予 Android开发入门者非常忠实的忠告。作为国内从事Android开发的同行,APP虎第一时间发现并翻译了他的文章,以与广大Android开发者和即将进入Android开发的人们分享。
很多人认为从事Android开发是一件赔本的买卖。 他们说,如果你想赚钱,你应该转向iPhone,iPad和所有其他的平台。但事实显然不是这样的,虽然从事Android开发并没有让我收入数千美元,但我的收入是稳定的,并且一直在增长。
尽管我并不是顶级的开发者,并且也没有任何应用被Android Market推荐过。 我只是成千上万名Android开发者之间默默无闻的一个,我的应用也不是那么的有名。 但这有什么好奇怪的呢?我所有的应用程序都是免费的,因为谷歌不允许来至我的国家(波兰)的开发者通过Android Market出售应用程序!
所以请你记住这些事实:
1 Android Market从来没有在Top的推荐位置推荐过我的应用程序
2 我只提供(主要是由于Android Market的限制)免费的应用程序
3 即使我能够在Android Market出售应用程序我也不会将它作为主要收入来源(我相信广告才是最主要的收入来源)
我所有的收入都来自应用程序中的广告。 这是它们在Android Market下载次数:
1 X-Ray Scanner(超过268000下载)
2 Cracked Screen(超过182000下载)
3 Virtual Drums (超过20000下载)
4 Daily Beauty Tips (超过11000下载)
5 Don’t push it (超过6 500下载)
6 WP Stats (超过4 000下载)
我从2010年4月开始学习Android应用开发。并且在5月份便发布了我的第一个Android应用——WP Stats,它带给我几美元的收入。虽然我一直期待这个应用是我最受欢迎的应用,可惜它不是。在我已经发布的几个应用程序中,有很多比它更受欢迎。这里是我这几个月通过Android应用的总收入明细:
• 2010年5月 – 4.92美元
• 2010年6月 – 138.87美元
• 2010年7月 – 538.26美元
• 2010年8月 – 920.00美元
• 2010年9月 – 1545.45美元
• 2010年10月 – 1059.31美元
十月份的收入看起来有所下降,但事实上发生这种情况是因为我没有着这一个月之内没有更新过应用程序。因此,大家可以看到,虽然收入不高,但是却是稳步增长的!并且这些收入全部来自广告。
即使这样,在我看来,从事Android开发给我带来的收入甚至远没有达到iPhone开发人员的水平。 但不管怎么说,从事Android开发是非常有前途的,特别是对于新的应用点子有很大的发展空间。下面这些问题是在成为一名开发者之前常常困扰我的,所以,如果你有兴趣让Android开发成为您每月一笔收入来源,这篇文章可能对你有帮助。
我应该熟练的掌握JAVA——事实并非如此!
有很多专家都会非常严肃的说:“你必须要熟练的掌握Java,否则您做梦都不要期望成为一名Android开发者!”。 以我的情况来看,事实并非如此,我仅仅只是对于PHP非常熟练。 至于Java,我一直计划着在空余时间好好的学习它,但是我几乎没有空闲时间,所以我只只是略知皮毛。虽然我购买了《 Thinking in Java 》,但不幸的是到目前为止我还没有看完第三章。 所以,非常基本的Java的基础知识,这就是你所需要的!
我必须先熟练的掌握一种IDE(Eclipse或NetBeans)——这也是错误的!
另外,专家们还会说会说:“你必须要先完美的掌握一种IDE,否则在学习一门新的语言之前你便会掉队!”。专家们总是这么耸人听闻,看来,我不是真正的专家。因为我是在学习 Java Dalvik ( Android apps开发语言) 的同时才开始使用IDE(Eclipse)的。 所以,事实是你只需要在需要使用的时候再开始学习它,而那些IDE专家撰写的有关书籍在大多数情况下是浪费时间和金钱。
我需要拥有一台基于Android的手机——这(再一次)是错误的!
如果你拥有一台Android手机,那当然最好。甚至,你最好能够几台不同系统版本的Android手机来测试你的应用——如果你准备让他们在所有的Android设备中正常工作! 但是事实上这并不能解决所有的问题。 虽然一台真正的Android手机有利于你测试自己的应用程序,但在大多数情况下Android模拟器(包含在Android SDK中)便已经足够了。
那么什么是你真正需要的?
在我看来,想要成为一名真正的Android开发者,你需要拥有这些东西:
• Java基本知识(或任何其他面向对象语言)
• 免费下载的Android SDK(包含Android模拟器)
• 免费的IDE (例如Eclipse)
• 免费的Android文档
还有一些并不是必要的,但可能非常有用的东西:
• 一部Android手机(我的选择是HTC Desire )
• 一本不错的Android开发入门书籍(我买了两本让我非常满意的书籍——《Hello, Android 》和 《Beginning Android 2》
所以,如果你真的想成为一名Android开发者——不要被砖家吓到。只要你肯努力学习它,你会惊奇地发现它是那么的容易!
来源:草根网(www.20ju.com) - 互联网界的读者文摘
[2] ListView 分段展示
来源: 互联网 发布时间: 2014-02-18
ListView 分段显示
Android market里软件列表,每页显示10条记录,没有显示上一页,下一页的按钮,依靠手滑动动态加载数据,当向下滚动时,最下边显示 Loading… 。数据加载结束,Loading底栏消失。
关于ListView的分段显示,有现成的库可用,比如 cwac-endless, 这个库不好之处,就是底部Loading的View无法定制。还有一个在google code上的androidpageablelistview 这个可以实现基本的分页,有手动操作显示上一页,下一页的按钮。
实现思路如下:
自定义 footer view, list_footer.xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" > <LinearLayout android:gravity="center_vertical|center_horizontal" android:orientation="horizontal" android:id="@+id/loading_more" android:visibility="gone" android:layout_width="fill_parent" android:layout_height="?android:attr/listPreferredItemHeight" > <ProgressBar android:id="@+android:id/progress_large" android:layout_width="wrap_content" android:layout_height="wrap_content" android:indeterminate="true" > </ProgressBar> <TextView android:id="@+id/loading_msg" android:paddingLeft="6.0dip" android:paddingTop="2.0dip" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="1.0dip" android:text="@string/loading" > </TextView> </LinearLayout> </LinearLayout>
用到 ListView addFooterView/removeView 这两个函数。
伪代码 (Pseudocode):
private ListView mListView; private View mFooterView; private OnScrollListener mOnListViewScrollListener; mListView.addFooterView(mFooterView); mListView.removeView(mFooterView); mListView.setOnScrollListener(mOnListViewScrollListener); mOnListViewScrollListener = new OnScrollListener() { public void onScroll(AbsListView view, int firstCell, int cellCount, int itemCount) { if (firstCell != mFirstCell) { // balabala } } public void onScrollStateChanged(AbsListView view, int scrollState) { // Do nothing } };
在onScroll里要处理检查是否还有新的记录,如果有,调用addFooterView,添加记录到adapter, adapter调用 notifyDataSetChanged 更新数据;如果没有记录了, 把自定义的mFooterView去掉。这里没有重写onScrollStateChanged函数,那么在onScroll就需要一个外部变量mFirstCell记录滑动位置。
再看看QQ空间体验版 for Android 是如何实现的,不用多说,show me the code:
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { shouldRefresh = false; if (firstVisibleItem + visibleItemCount == totalItemCount) { if (bHaveMore()) { if (list.getFooterViewsCount() == 0) { addRefreshfoot(); } else { shouldRefresh = true; } } } } public void onScrollStateChanged(AbsListView view, int scrollState) { if (shouldRefresh && scrollState == OnScrollListener.SCROLL_STATE_IDLE) { if (isRefreshing == false) { isRefreshing = true; getMoreList(); } } }
转载:http://blog.lytsing.org/archives/322.html
[3] 中国阴历算法
来源: 互联网 发布时间: 2014-02-18
中国农历算法
/**
* ChineseCalendarGB.java
* Copyright (c) 1997-2002 by Dr. Herong Yang
* 中国农历算法 - 实用于公历 1901 年至 2100 年之间的 200 年
*/
import
java.text.*;
import
java.util.*;
class
ChineseCalendarGB {
private
int
gregorianYear;
private
int
gregorianMonth;
private
int
gregorianDate;
private
boolean
isGregorianLeap;
private
int
dayOfYear;
private
int
dayOfWeek;
// 周日一星期的第一天
private
int
chineseYear;
private
int
chineseMonth;
// 负数表示闰月
private
int
chineseDate;
private
int
sectionalTerm;
private
int
principleTerm;
private
static
char
[] daysInGregorianMonth =
{31
,
28
,
31
,
30
,
31
,
30
,
31
,
31
,
30
,
31
,
30
,
31
};
private
static
String[] stemNames =
{"甲"
,
"乙"
,
"丙"
,
"丁"
,
"戊"
,
"己"
,
"庚"
,
"辛"
,
"壬"
,
"癸"
};
private
static
String[] branchNames =
{"子"
,
"丑"
,
"寅"
,
"卯"
,
"辰"
,
"巳"
,
"午"
,
"未"
,
"申"
,
"酉"
,
"戌"
,
"亥"
};
private
static
String[] animalNames =
{"鼠"
,
"牛"
,
"虎"
,
"兔"
,
"龙"
,
"蛇"
,
"马"
,
"羊"
,
"猴"
,
"鸡"
,
"狗"
,
"猪"
};
public
static
void
main(String[] arg) {
ChineseCalendarGB c = new
ChineseCalendarGB();
String cmd = "day"
;
int
y =
1901
;
int
m =
1
;
int
d =
1
;
if
(arg.length>
0
) cmd = arg[
0
];
if
(arg.length>
1
) y = Integer.parseInt(arg[
1
]);
if
(arg.length>
2
) m = Integer.parseInt(arg[
2
]);
if
(arg.length>
3
) d = Integer.parseInt(arg[
3
]);
c.setGregorian(y,m,d);
c.computeChineseFields();
c.computeSolarTerms();
if
(cmd.equalsIgnoreCase(
"year"
)) {
String[] t = c.getYearTable();
for
(
int
i=
0
; i<t.length; i++) System.out.println(t[i]);
} else
if
(cmd.equalsIgnoreCase(
"month"
)) {
String[] t = c.getMonthTable();
for
(
int
i=
0
; i<t.length; i++) System.out.println(t[i]);
} else
{
System.out.println(c.toString());
}
}
public
ChineseCalendarGB() {
setGregorian(1901
,
1
,
1
);
}
public
void
setGregorian(
int
y,
int
m,
int
d) {
gregorianYear = y;
gregorianMonth = m;
gregorianDate = d;
isGregorianLeap = isGregorianLeapYear(y);
dayOfYear = dayOfYear(y,m,d);
dayOfWeek = dayOfWeek(y,m,d);
chineseYear = 0
;
chineseMonth = 0
;
chineseDate = 0
;
sectionalTerm = 0
;
principleTerm = 0
;
}
public
static
boolean
isGregorianLeapYear(
int
year) {
boolean
isLeap =
false
;
if
(year%
4
==
0
) isLeap =
true
;
if
(year%
100
==
0
) isLeap =
false
;
if
(year%
400
==
0
) isLeap =
true
;
return
isLeap;
}
public
static
int
daysInGregorianMonth(
int
y,
int
m) {
int
d = daysInGregorianMonth[m-
1
];
if
(m==
2
&& isGregorianLeapYear(y)) d++;
// 公历闰年二月多一天
return
d;
}
public
static
int
dayOfYear(
int
y,
int
m,
int
d) {
int
c =
0
;
for
(
int
i=
1
; i<m; i++) {
c = c + daysInGregorianMonth(y,i);
}
c = c + d;
return
c;
}
public
static
int
dayOfWeek(
int
y,
int
m,
int
d) {
int
w =
1
;
// 公历一年一月一日是星期一,所以起始值为星期日
y = (y-1
)%
400
+
1
;
// 公历星期值分部 400 年循环一次
int
ly = (y-
1
)/
4
;
// 闰年次数
ly = ly - (y-1
)/
100
;
ly = ly + (y-1
)/
400
;
int
ry = y -
1
- ly;
// 常年次数
w = w + ry; // 常年星期值增一
w = w + 2
*ly;
// 闰年星期值增二
w = w + dayOfYear(y,m,d);
w = (w-1
)%
7
+
1
;
return
w;
}
private
static
char
[] chineseMonths = {
// 农历月份大小压缩表,两个字节表示一年。两个字节共十六个二进制位数,
// 前四个位数表示闰月月份,后十二个位数表示十二个农历月份的大小。
0x00
,
0x04
,
0xad
,
0x08
,
0x5a
,
0x01
,
0xd5
,
0x54
,
0xb4
,
0x09
,
0x64
,
0x05
,
0x59
,
0x45
,
0x95
,
0x0a
,
0xa6
,
0x04
,
0x55
,
0x24
,
0xad
,
0x08
,
0x5a
,
0x62
,
0xda
,
0x04
,
0xb4
,
0x05
,
0xb4
,
0x55
,
0x52
,
0x0d
,
0x94
,
0x0a
,
0x4a
,
0x2a
,
0x56
,
0x02
,
0x6d
,
0x71
,
0x6d
,
0x01
,
0xda
,
0x02
,
0xd2
,
0x52
,
0xa9
,
0x05
,
0x49
,
0x0d
,
0x2a
,
0x45
,
0x2b
,
0x09
,
0x56
,
0x01
,
0xb5
,
0x20
,
0x6d
,
0x01
,
0x59
,
0x69
,
0xd4
,
0x0a
,
0xa8
,
0x05
,
0xa9
,
0x56
,
0xa5
,
0x04
,
0x2b
,
0x09
,
0x9e
,
0x38
,
0xb6
,
0x08
,
0xec
,
0x74
,
0x6c
,
0x05
,
0xd4
,
0x0a
,
0xe4
,
0x6a
,
0x52
,
0x05
,
0x95
,
0x0a
,
0x5a
,
0x42
,
0x5b
,
0x04
,
0xb6
,
0x04
,
0xb4
,
0x22
,
0x6a
,
0x05
,
0x52
,
0x75
,
0xc9
,
0x0a
,
0x52
,
0x05
,
0x35
,
0x55
,
0x4d
,
0x0a
,
0x5a
,
0x02
,
0x5d
,
0x31
,
0xb5
,
0x02
,
0x6a
,
0x8a
,
0x68
,
0x05
,
0xa9
,
0x0a
,
0x8a
,
0x6a
,
0x2a
,
0x05
,
0x2d
,
0x09
,
0xaa
,
0x48
,
0x5a
,
0x01
,
0xb5
,
0x09
,
0xb0
,
0x39
,
0x64
,
0x05
,
0x25
,
0x75
,
0x95
,
0x0a
,
0x96
,
0x04
,
0x4d
,
0x54
,
0xad
,
0x04
,
0xda
,
0x04
,
0xd4
,
0x44
,
0xb4
,
0x05
,
0x54
,
0x85
,
0x52
,
0x0d
,
0x92
,
0x0a
,
0x56
,
0x6a
,
0x56
,
0x02
,
0x6d
,
0x02
,
0x6a
,
0x41
,
0xda
,
0x02
,
0xb2
,
0xa1
,
0xa9
,
0x05
,
0x49
,
0x0d
,
0x0a
,
0x6d
,
0x2a
,
0x09
,
0x56
,
0x01
,
0xad
,
0x50
,
0x6d
,
0x01
,
0xd9
,
0x02
,
0xd1
,
0x3a
,
0xa8
,
0x05
,
0x29
,
0x85
,
0xa5
,
0x0c
,
0x2a
,
0x09
,
0x96
,
0x54
,
0xb6
,
0x08
,
0x6c
,
0x09
,
0x64
,
0x45
,
0xd4
,
0x0a
,
0xa4
,
0x05
,
0x51
,
0x25
,
0x95
,
0x0a
,
0x2a
,
0x72
,
0x5b
,
0x04
,
0xb6
,
0x04
,
0xac
,
0x52
,
0x6a
,
0x05
,
0xd2
,
0x0a
,
0xa2
,
0x4a
,
0x4a
,
0x05
,
0x55
,
0x94
,
0x2d
,
0x0a
,
0x5a
,
0x02
,
0x75
,
0x61
,
0xb5
,
0x02
,
0x6a
,
0x03
,
0x61
,
0x45
,
0xa9
,
0x0a
,
0x4a
,
0x05
,
0x25
,
0x25
,
0x2d
,
0x09
,
0x9a
,
0x68
,
0xda
,
0x08
,
0xb4
,
0x09
,
0xa8
,
0x59
,
0x54
,
0x03
,
0xa5
,
0x0a
,
0x91
,
0x3a
,
0x96
,
0x04
,
0xad
,
0xb0
,
0xad
,
0x04
,
0xda
,
0x04
,
0xf4
,
0x62
,
0xb4
,
0x05
,
0x54
,
0x0b
,
0x44
,
0x5d
,
0x52
,
0x0a
,
0x95
,
0x04
,
0x55
,
0x22
,
0x6d
,
0x02
,
0x5a
,
0x71
,
0xda
,
0x02
,
0xaa
,
0x05
,
0xb2
,
0x55
,
0x49
,
0x0b
,
0x4a
,
0x0a
,
0x2d
,
0x39
,
0x36
,
0x01
,
0x6d
,
0x80
,
0x6d
,
0x01
,
0xd9
,
0x02
,
0xe9
,
0x6a
,
0xa8
,
0x05
,
0x29
,
0x0b
,
0x9a
,
0x4c
,
0xaa
,
0x08
,
0xb6
,
0x08
,
0xb4
,
0x38
,
0x6c
,
0x09
,
0x54
,
0x75
,
0xd4
,
0x0a
,
0xa4
,
0x05
,
0x45
,
0x55
,
0x95
,
0x0a
,
0x9a
,
0x04
,
0x55
,
0x44
,
0xb5
,
0x04
,
0x6a
,
0x82
,
0x6a
,
0x05
,
0xd2
,
0x0a
,
0x92
,
0x6a
,
0x4a
,
0x05
,
0x55
,
0x0a
,
0x2a
,
0x4a
,
0x5a
,
0x02
,
0xb5
,
0x02
,
0xb2
,
0x31
,
0x69
,
0x03
,
0x31
,
0x73
,
0xa9
,
0x0a
,
0x4a
,
0x05
,
0x2d
,
0x55
,
0x2d
,
0x09
,
0x5a
,
0x01
,
0xd5
,
0x48
,
0xb4
,
0x09
,
0x68
,
0x89
,
0x54
,
0x0b
,
0xa4
,
0x0a
,
0xa5
,
0x6a
,
0x95
,
0x04
,
0xad
,
0x08
,
0x6a
,
0x44
,
0xda
,
0x04
,
0x74
,
0x05
,
0xb0
,
0x25
,
0x54
,
0x03
};
// 初始日,公历农历对应日期:
// 公历 1901 年 1 月 1 日,对应农历 4598 年 11 月 11 日
private
static
int
baseYear =
1901
;
private
static
int
baseMonth =
1
;
private
static
int
baseDate =
1
;
private
static
int
baseIndex =
0
;
private
static
int
baseChineseYear =
4598
-
1
;
private
static
int
baseChineseMonth =
11
;
private
static
int
baseChineseDate =
11
;
public
int
computeChineseFields() {
if
(gregorianYear<
1901
|| gregorianYear>
2100
)
return
1
;
int
startYear = baseYear;
int
startMonth = baseMonth;
int
startDate = baseDate;
chineseYear = baseChineseYear;
chineseMonth = baseChineseMonth;
chineseDate = baseChineseDate;
// 第二个对应日,用以提高计算效率
// 公历 2000 年 1 月 1 日,对应农历 4697 年 11 月 25 日
if
(gregorianYear >=
2000
) {
startYear = baseYear + 99
;
startMonth = 1
;
startDate = 1
;
chineseYear = baseChineseYear + 99
;
chineseMonth = 11
;
chineseDate = 25
;
}
int
daysDiff =
0
;
for
(
int
i=startYear; i<gregorianYear; i++) {
daysDiff += 365
;
if
(isGregorianLeapYear(i)) daysDiff +=
1
;
// leap year
}
for
(
int
i=startMonth; i<gregorianMonth; i++) {
daysDiff += daysInGregorianMonth(gregorianYear,i);
}
daysDiff += gregorianDate - startDate;
chineseDate += daysDiff;
int
lastDate = daysInChineseMonth(chineseYear, chineseMonth);
int
nextMonth = nextChineseMonth(chineseYear, chineseMonth);
while
(chineseDate>lastDate) {
if
(Math.abs(nextMonth)<Math.abs(chineseMonth)) chineseYear++;
chineseMonth = nextMonth;
chineseDate -= lastDate;
lastDate = daysInChineseMonth(chineseYear, chineseMonth);
nextMonth = nextChineseMonth(chineseYear, chineseMonth);
}
return
0
;
}
private
static
int
[] bigLeapMonthYears = {
// 大闰月的闰年年份
6
,
14
,
19
,
25
,
33
,
36
,
38
,
41
,
44
,
52
,
55
,
79
,
117
,
136
,
147
,
150
,
155
,
158
,
185
,
193
};
public
static
int
daysInChineseMonth(
int
y,
int
m) {
// 注意:闰月 m < 0
int
index = y - baseChineseYear + baseIndex;
int
v =
0
;
int
l =
0
;
int
d =
30
;
if
(
1
<=m && m<=
8
) {
v = chineseMonths[2
*index];
l = m - 1
;
if
( ((v>>l)&
0x01
)==
1
) d =
29
;
} else
if
(
9
<=m && m<=
12
) {
v = chineseMonths[2
*index+
1
];
l = m - 9
;
if
( ((v>>l)&
0x01
)==
1
) d =
29
;
} else
{
v = chineseMonths[2
*index+
1
];
v = (v>>4
)&
0x0F
;
if
(v!=Math.abs(m)) {
d = 0
;
} else
{
d = 29
;
for
(
int
i=
0
; i<bigLeapMonthYears.length; i++) {
if
(bigLeapMonthYears[i]==index) {
d = 30
;
break
;
}
}
}
}
return
d;
}
public
static
int
nextChineseMonth(
int
y,
int
m) {
int
n = Math.abs(m) +
1
;
if
(m>
0
) {
int
index = y - baseChineseYear + baseIndex;
int
v = chineseMonths[
2
*index+
1
];
v = (v>>4
)&
0x0F
;
if
(v==m) n = -m;
}
if
(n==
13
) n =
1
;
return
n;
}
private
static
char
[][] sectionalTermMap = {
{7
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
6
,
5
,
6
,
6
,
6
,
5
,
5
,
6
,
6
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
5
,
4
,
5
,
5
},
{5
,
4
,
5
,
5
,
5
,
4
,
4
,
5
,
5
,
4
,
4
,
4
,
4
,
4
,
4
,
4
,
4
,
3
,
4
,
4
,
4
,
3
,
3
,
4
,
4
,
3
,
3
,
3
},
{6
,
6
,
6
,
7
,
6
,
6
,
6
,
6
,
5
,
6
,
6
,
6
,
5
,
5
,
6
,
6
,
5
,
5
,
5
,
6
,
5
,
5
,
5
,
5
,
4
,
5
,
5
,
5
,
5
},
{5
,
5
,
6
,
6
,
5
,
5
,
5
,
6
,
5
,
5
,
5
,
5
,
4
,
5
,
5
,
5
,
4
,
4
,
5
,
5
,
4
,
4
,
4
,
5
,
4
,
4
,
4
,
4
,
5
},
{6
,
6
,
6
,
7
,
6
,
6
,
6
,
6
,
5
,
6
,
6
,
6
,
5
,
5
,
6
,
6
,
5
,
5
,
5
,
6
,
5
,
5
,
5
,
5
,
4
,
5
,
5
,
5
,
5
},
{6
,
6
,
7
,
7
,
6
,
6
,
6
,
7
,
6
,
6
,
6
,
6
,
5
,
6
,
6
,
6
,
5
,
5
,
6
,
6
,
5
,
5
,
5
,
6
,
5
,
5
,
5
,
5
,
4
,
5
,
5
,
5
,
5
},
{7
,
8
,
8
,
8
,
7
,
7
,
8
,
8
,
7
,
7
,
7
,
8
,
7
,
7
,
7
,
7
,
6
,
7
,
7
,
7
,
6
,
6
,
7
,
7
,
6
,
6
,
6
,
7
,
7
},
{8
,
8
,
8
,
9
,
8
,
8
,
8
,
8
,
7
,
8
,
8
,
8
,
7
,
7
,
8
,
8
,
7
,
7
,
7
,
8
,
7
,
7
,
7
,
7
,
6
,
7
,
7
,
7
,
6
,
6
,
7
,
7
,
7
},
{8
,
8
,
8
,
9
,
8
,
8
,
8
,
8
,
7
,
8
Java代码
相关
- 1 中国阴历算法java实现
- 2 阴历算法
- 3 阴历阴历阳历阴历
- 4 求公历转换为阴历算法解决办法
- 5 JS阴历
移动开发-热门移动开发-最新移动开发-其它
- 1 十分难缠的signal 11 (SIGSEGV)
- 2 Can't create handler inside thread that has not called Looper.prepare() 错误有关问题
- 3 Dex Loader Unable to execute Multiple dex files define解决办法
- 4 解决 Google Play下载施用 "Google Play Store 已停止运行"
- 5 WAP网页获得用户的手机号码
- 6 如何判断Activity是否在运行
- 7 SlidingMenu+ViewPager兑现侧滑菜单效果
- 8 makeKeyAndVisible的功用
- 9 关于Unable to execute dex: Java heap space 解决方法
- 10 RelativeLayout设置居中对齐有关问题
- 1 播发声音文件AVAudioPlayer
- 2 改变银屏显示方式已经加载图片
- 3 2013-十-31 TCP/IP 协议簇
- 4 Java I/零 总体框架图
- 5 拿碗的铠甲勇者
- 6 女友可能出轨 想知道在QQ和别人的聊天记录
- 7 objective C中的字符串(3)
- 8 java.lang.ClassNotFoundException: Didn't find class "Activity" on path: /da
- 9 LG Optimus G Pro 相干
- 10 怎么创建对话框
- 1 视图切换的形式
- 2 Tiledmap编辑操作技巧
- 3 实现默认文字统制的textview
- 4 用 lipo 下令裁剪出需要的 architecture
- 5 power键跟音量键组合实现截图功能
- 6 Andriod耗时操作的处置(音乐播放器欢迎界面)
- 7 疑惑为什么报错了
- 8 深入viewgroup.onintercepttouchevent1点
- 9 MGTemplateEngine模版发动机
- 10 BroadcastReceiver要领
- 上一篇: ListView 分段展示
- 下一篇: button selector 式样
最新技术文章: