日历模块

/********************************************************************************************************

日历首页

***************************************************************************************************/

在AllInoneActivity跳过去的。去到CalendarMainActivity。所有的日期选择器都是AmigoDatePickerDialog,而监听器是AmigoDatePickerDialog.OnDateSetListenerl。

布局文件为:gn_month_layout.xml。其中最核心的是com.gionee.calendar.view.DirectionalViewPager  extends ViewPage  rmViewPager;适配器:GNMonthPagerAdapter extends PagerAdapter;总共显示多少个月是由Adapter决定的getCount()决定的。

右上角有一个goTodayBtn,就是在中文是显示“今”的那个。在initGoTodayBtn()中初始化。


首先自定义View相关类:

GNMonthDataAreaLayout extends LinearLayout

GNMonthEventPage extends FrameLayout implements PageListener, QueryCallback

GNMonthPagerAdapter extends PagerAdapter:该Adapter使用的layout布局是gn_month_page.xml。

DirectionalViewPager  extends ViewPage


该页面主要分了三个层次:

外层:DirectionalViewPager  及其适配器 GNMonthPagerAdapter:负责一个所有页面的滑动(不负责单日单击),占gn_month_layout.xml(contentView使用的布局)中的R.id.page的位置。


中层:GNMonthEventPage 及其适配器 GNMonthEventsAdapter  extends extends (GNSimpleWeeksAdapter implements OnTouchListener)(负责显示一页)使用了gn_month_page.xml布局


里层:GNMonthEventsView (负责一行,就是一周的显示和处理单日的点击事件),监听器是GNMonthEventsAdapter(实现了OnTouchListener),最终主要单日跳转入口是GNMonthEventsAdapter#onDayClick(int index, Time selectTime, GNSimpleWeekView view)


      还有单日的显示,使用了GNDayViewPager extends ViewPager。取代了日历显示月份数据的位置,就是gn_month_page.xml中的R.id.listOfMonthParent。GNDayViewPager持有当前GNMonthEventPage的引用,可以根据GNDayViewPager的滑动(左右滑动,只能滑动当前月的)操作GNMonthEventPage上部分的text和actionBar。从月切换到日的主要工作有重新初始化actionBar,把几月改成几号,当前显示月数据的页面化成GNDayViewPager的当前页。还要在GNDayViewPager当前页中显示日程。要用动画。

       从月变成日的动画过程,在GNDayViewPager中的内部类class AnimatorListener implements AnimatorUpdateListener,由GNDayViewPager#changeToDayView()触发。动画主要是先改变的MonthView的透明度,从1到0,在从0到1改变DayView的透明度,结束的时候,就把MonthView弄成Invisibility,把DayView弄成visibility。

       GNDayViewPager是在通过((ViewGroup) (mMonthPage.findViewById(R.id.listOfMonthParent))).removeView(mMonthPage.mDayPager);添加到显示month data的ViewGroup的。在回到主界面时,就会GNMonthEventPage

   

      从月中点击日进入日的界面流程:

1.在GNMonthEventsAdapter#getView(int position)中创建GNMonthEventsView并为其添加listener,就是GNMonthEventsAdapte.this。所以入口是这里。

2.GNMonthEventsAdapter#onDayClick(int index, Time selectTime, GNSimpleWeekView view),本来应该是调用GNSimpleWeeksAdapter#onDayClick(int index, Time selectTime, GNSimpleWeekView view),但是GNMonthEventsAdapter复写了该方法。

3.GNMonthEventsAdapter#startDayActivity(Time selectTime)

4.((CalendarMainActivity) mContext).startDayActivityWithAnim(intent);

5.后面分了两条路径,都去到了CalendarMainActivity#updatePage(int updateWhat, Intent intent),核心代码是以下一句

((PageListener) mViewPager.getChildAt(i)).onPageUpdate(mCurrentMonthNum, updateWhat,
                        mSelectedTime, intent, mRootView);
mViewPager是最外层的DirectionalViewPage,他的child就是GNMonthEventPage,就是调用了GNMonthEventPage的复写了PageListener的onPageUpate()方法。所以下一步就调用GNMonthEventPage#onPageUpdate(int curItem, int updateWhat, Time selectedTime, Intent intent, View rootView),以下为该方法核心代码:

@Override
    public void onPageUpdate(int curItem, int updateWhat, Time selectedTime, Intent intent, View rootView) {
        Logger.printLog(TAG, "onPageUpdate:" + updateWhat + "-" + curItem);
        switch (updateWhat) {
            case CalendarMainActivity.UPDATE_WHAT_EVENT_CHANGE:
                updateEvent(curItem, false);
                break;
            case CalendarMainActivity.UPDATE_WHAT_START_DAY:
                mFirstDayOfWeek = GNCalendarUtils.getFirstDayOfWeek(mContext);
                setUpAdapter();
                updateDateArea();
                break;
            case CalendarMainActivity.UPDATE_WHAT_TIME_CHANGE:
                updateDateArea();
                updateEvent(curItem, false);
                break;
            case Calend
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值