var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-20738293-1']); _gaq.push(['_trackPageview']); (function() { var ga = document.createElement('script')"/>

          jutleo
          歡迎走進(jìn)有風(fēng)的地方~~
          posts - 63,  comments - 279,  trackbacks - 0
          最近有點(diǎn)亂糟糟,還是繼續(xù)寫完剩下的:
          根據(jù) 黑莓開發(fā)學(xué)習(xí)入門系列,自己動手實(shí)現(xiàn)一個(gè)日歷軟件(二)實(shí)現(xiàn)一個(gè)黑莓應(yīng)用程序最基本的結(jié)構(gòu),我們真正的可以實(shí)現(xiàn)日歷了:
          新建一個(gè)工程 calender:作為日歷的完整工程開始實(shí)現(xiàn)一個(gè)日歷小程序 
          創(chuàng)建類CalendarMain.java 作為日歷的入口
          創(chuàng)建日歷布局外觀類:CalenderLayout.java,作為主要的日歷布局
          CalendarMain類的應(yīng)該如下結(jié)構(gòu):
          package org.bulktree.calender;

          import net.rim.device.api.ui.UiApplication;
          import net.rim.device.api.ui.container.MainScreen;

          public class CalendarMain extends UiApplication {

              
          public static void main(String[] args) {
                  CalendarMain theApp 
          = new CalendarMain();
                  theApp.enterEventDispatcher();
              }

              
          public CalendarMain() {
                  MainScreen mainScreen 
          = new MainScreen();
                  CalenderLayout calender 
          = new CalenderLayout();
                  mainScreen.add(calender.calLayout());
                  pushScreen(mainScreen);
              }
          }
          黑莓程序入口總是先實(shí)現(xiàn)當(dāng)前的屏幕pushScreen(mainScreen)壓入當(dāng)前屏幕隊(duì)列,然后維護(hù)主應(yīng)用程序事件線程。
          對于屏幕布局就很簡單了:先畫一個(gè)布局圖 
          我用Excel模擬出一個(gè)日歷,不同的顏色區(qū)域(當(dāng)前日歷紅色除外),把整個(gè)日歷作為分成三塊,如果按照BlackBerry程序的方式,分為三個(gè)布局管理器,最上面是一個(gè)HorizontalFieldManager,日歷的周那個(gè)區(qū)域也是HorizontalFieldManager,日期區(qū)域每行看成一個(gè)HorizontalFieldManager,整體看成一個(gè)VerticalFieldManager,而整個(gè)日歷可看成一個(gè)VerticalFieldManager去規(guī)范里面的布局。這樣一個(gè)完整的日歷就出來了。具體實(shí)現(xiàn)如下:
          package org.bulktree.calender;

          import java.util.Calendar;

          import net.rim.device.api.ui.Field;
          import net.rim.device.api.ui.FocusChangeListener;
          import net.rim.device.api.ui.Font;
          import net.rim.device.api.ui.Manager;
          import net.rim.device.api.ui.component.LabelField;
          import net.rim.device.api.ui.container.HorizontalFieldManager;
          import net.rim.device.api.ui.container.VerticalFieldManager;

          public class CalenderLayout {
              
              
          private static String[] wks = {""""""""""""""};
              
              
          private LabelField ax = null;
              
              
          public Manager calLayout() {
                  Manager calender 
          = new VerticalFieldManager();
                  
          //日歷頭
                  Manager calHeader = new HorizontalFieldManager();
                  Calendar cale 
          = Calendar.getInstance();
                  ChineseCalendar chin 
          = new ChineseCalendar(cale);
                  String calHeaderString 
          = "陰歷:" + CalendarUtil.getCurrentYear() + "年 " + chin.getChineseCalendarMonth() + "月 "+ chin.getChinaDayString() + "日{(diào)" + chin.getCyclical() + "-" + chin.getAnimalsYear() + "年}";
                  ax 
          = new LabelField(calHeaderString, LabelField.HCENTER);
                  setFont(ax, 
          131);
                  calHeader.add(ax);
                  LabelField ay 
          = new LabelField("  陽歷:" + CalendarUtil.getCurrentMonth() + "");
                  setFont(ay, 
          131);
                  calHeader.add(ay);
                  
                  calender.add(calHeader);
                  
          //星期頭
                  Manager weakHeader = new HorizontalFieldManager();
                  CalenderField whf 
          = null;
                  
                  
          for (int i = 0; i < 7; i++) {
                      whf 
          = new CalenderField(wks[i], CalenderField.RECTANGLE, CalenderField.NON_FOCUSABLE, 1);
                      setFont(whf, 
          151);
                      weakHeader.add(whf);
                  }
                  calender.add(weakHeader);
                  
                  
          //日歷體
                  int a = CalendarUtil.getWeekCurrntMonthFirstDay();
          //        int a = CalendarUtil.getWeekMonthFirstDay(2011, 1);
                  int b = CalendarUtil.getCurrentDaysOfMonth();
          //        int b = CalendarUtil.getDaysOfMonth(2011, 1);
                  Manager calBody = new HorizontalFieldManager();
                  calBody.setBorder(
          1111);
                  
          for (int i = 0; i < a; i++) {
                      calBody.add(
          new CalenderField("", CalenderField.RECTANGLE, CalenderField.NON_FOCUSABLE, 1));
                  }
                  CalenderField yac 
          = null;
                  CalenderField yc 
          = null;
                  
          for (int i = 1; i <= b; i++) {
                      Manager cellManger 
          = new VerticalFieldManager();
                      yac 
          = new CalenderField(i + "", CalenderField.HCENTER, CalenderField.FOCUSABLE, 1);
                      setFont(yac, 
          150);
                      cellManger.add(yac);
                      Calendar cx 
          = Calendar.getInstance();
                      cx.set(Calendar.DATE, i);
                      
          final ChineseCalendar chines = new ChineseCalendar(cx);
                      yc 
          = new CalenderField(chines.getChinaDayString(), CalenderField.HCENTER, CalenderField.NON_FOCUSABLE, 1);
                      setFont(yc, 
          100);
                      
                      yac.setFocusListener(
          new FocusChangeListener() {
                          
          public void focusChanged(Field field, int eventType) {
                              String text 
          = "陰歷:" + chines.getChineseCalenderYear() + "年 " + chines.getChineseCalendarMonth() + "月 "+ chines.getChinaDayString() + "日{(diào)" + chines.getCyclical() + "-" + chines.getAnimalsYear() + "年}";
                              updateCalendarHeader(text);
                          }
                      });
                      
                      
          if (Calendar.getInstance().get(Calendar.DATE) == i) {
                          setFont(yac, 
          151);
                          setFont(yc, 
          101);
                      }
                      cellManger.add(yc);
                      calBody.add(cellManger);
                      
          if ((i + a) % 7 ==0) {
                          calender.add(calBody); 
                          calBody 
          = new HorizontalFieldManager();
                      }
                  }
                  calender.add(calBody);
                  
                  
          return calender;
              }

              
          /**
               * 設(shè)置字體風(fēng)格
               * 
          @param obj
               * 
          @param size
               * 
          @param isBlod 是否加粗, 1加粗, 0 正常
               
          */
              
          private void setFont(Field obj, int size, int isBlod) {
                  
          int fontStyle = isBlod == 1 ? Font.BOLD : Font.PLAIN;
                  obj.setFont(Font.getDefault().derive(fontStyle, size));
              }
              
              
          private void updateCalendarHeader(String text) {
                  ax.setText(text);
              }
          }
          這里面用到CalendarUtil工具類,ChineseCalendar農(nóng)歷工具類,CalenderField自定義的UI(上篇專門說明過)?,F(xiàn)貼出代碼如下:
          package org.bulktree.calender;

          import java.util.Calendar;

          /**
           * 日歷工具類
           * 
           * 
          @author Administrator
           * 
           
          */
          public class CalendarUtil {

              
          private static Calendar cal = Calendar.getInstance();

              
          public static String getCurrentYear() {
                  
          return "" + cal.get(Calendar.YEAR);
              }

              
          public static String getCurrentMonth() {
                  
          return "" + (cal.get(Calendar.MONTH) + 1);
              }

              
          //返回當(dāng)前月第一天的星期
              public static int getWeekCurrntMonthFirstDay() {
                  cal 
          = Calendar.getInstance();
                  
          return getWeekMonthFirstDay(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH));
              }
              
              
          //返回指定月第一天的星期
              public static int getWeekMonthFirstDay(int year, int month) {
                  cal.set(Calendar.YEAR, year);
                  cal.set(Calendar.MONTH, month);
                  cal.set(Calendar.DATE, 
          1);
                  
          return cal.get(Calendar.DAY_OF_WEEK) - 1;
              }
              
              
          //返回當(dāng)月天數(shù)
              public static int getCurrentDaysOfMonth() {
                  cal 
          = Calendar.getInstance();
                  
          return getDaysOfMonth(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH));
              }
              
          //返回指定月的天數(shù)
              public static int getDaysOfMonth(int year, int month) {
                  cal.set(Calendar.YEAR, year);
                  cal.set(Calendar.MONTH, month 
          + 1);
                  cal.set(Calendar.DAY_OF_MONTH, 
          1);
                  cal.set(Calendar.DATE, cal.get(Calendar.DATE) 
          -1);
                  
          return cal.get(Calendar.DAY_OF_MONTH);
              }
          }
          package org.bulktree.calender;

          import java.util.Calendar;

          public class ChineseCalendar {   
              
          private int year;   
              
          private int month;   
              
          private int day;   
              
          private boolean leap;   
              
          final static String chineseNumber[] = {"""""""""""""""""""""十一""十二"};   
              
          final static long[] lunarInfo = new long[]   
              {
          0x04bd80x04ae00x0a5700x054d50x0d2600x0d9500x165540x056a00x09ad00x055d2,   
               
          0x04ae00x0a5b60x0a4d00x0d2500x1d2550x0b5400x0d6a00x0ada20x095b00x14977,   
               
          0x049700x0a4b00x0b4b50x06a500x06d400x1ab540x02b600x095700x052f20x04970,   
               
          0x065660x0d4a00x0ea500x06e950x05ad00x02b600x186e30x092e00x1c8d70x0c950,   
               
          0x0d4a00x1d8a60x0b5500x056a00x1a5b40x025d00x092d00x0d2b20x0a9500x0b557,   
               
          0x06ca00x0b5500x153550x04da00x0a5d00x145730x052d00x0a9a80x0e9500x06aa0,   
               
          0x0aea60x0ab500x04b600x0aae40x0a5700x052600x0f2630x0d9500x05b570x056a0,   
               
          0x096d00x04dd50x04ad00x0a4d00x0d4d40x0d2500x0d5580x0b5400x0b5a00x195a6,   
               
          0x095b00x049b00x0a9740x0a4b00x0b27a0x06a500x06d400x0af460x0ab600x09570,   
               
          0x04af50x049700x064b00x074a30x0ea500x06b580x055c00x0ab600x096d50x092e0,   
               
          0x0c9600x0d9540x0d4a00x0da500x075520x056a00x0abb70x025d00x092d00x0cab5,   
               
          0x0a9500x0b4a00x0baa40x0ad500x055d90x04ba00x0a5b00x151760x052b00x0a930,   
               
          0x079540x06aa00x0ad500x05b520x04b600x0a6e60x0a4e00x0d2600x0ea650x0d530,   
               
          0x05aa00x076a30x096d00x04bd70x04ad00x0a4d00x1d0b60x0d2500x0d5200x0dd45,   
               
          0x0b5a00x056d00x055b20x049b00x0a5770x0a4b00x0aa500x1b2550x06d200x0ada0};   
            
              
          //====== 傳回農(nóng)歷 y年的總天數(shù)   
              final private static int yearDays(int y) {   
                  
          int i, sum = 348;   
                  
          for (i = 0x8000; i > 0x8; i >>= 1) {   
                      
          if ((lunarInfo[y - 1900& i) != 0) sum += 1;   
                  }   
                  
          return (sum + leapDays(y));   
              }   
            
              
          //====== 傳回農(nóng)歷 y年閏月的天數(shù)   
              final private static int leapDays(int y) {   
                  
          if (leapMonth(y) != 0) {   
                      
          if ((lunarInfo[y - 1900& 0x10000!= 0)   
                          
          return 30;   
                      
          else  
                          
          return 29;   
                  } 
          else  
                      
          return 0;   
              }   
            
              
          //====== 傳回農(nóng)歷 y年閏哪個(gè)月 1-12 ,&nb#
          posted on 2011-01-26 15:23 凌晨風(fēng) 閱讀(2329) 評論(0)  編輯  收藏 所屬分類: BlackBerry

          <2011年1月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          常用鏈接

          留言簿(11)

          我參與的團(tuán)隊(duì)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          新聞分類

          新聞檔案

          收藏夾

          圍脖

          最新隨筆

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 东兴市| 水城县| 柳江县| 礼泉县| 象州县| 来宾市| 富平县| 修文县| 营口市| 天台县| 松阳县| 巴彦淖尔市| 来凤县| 诏安县| 怀仁县| 保定市| 柯坪县| 阳西县| 溧水县| 永济市| 开江县| 奉化市| 麟游县| 新巴尔虎右旗| 育儿| 福州市| 盐源县| 前郭尔| 吉林省| 彭州市| 雷波县| 澎湖县| 鄂托克前旗| 监利县| 和田市| 微博| 遂宁市| 宜州市| 东安县| 宜城市| 四平市|