仿iOS日歷

概述

之前寫了兩篇文章簡要的介紹了(CalendarSelector)庫的使用方法和基本的實現(xiàn)原理辽话,這篇文章呢主要來實現(xiàn)一個仿iOS日歷的顯示功能

calendar.gif

CalendarSelector庫簡介

CalendarSelector)庫可以用來做日歷的顯示和選擇功能,因為使用的是View組合的方式來實現(xiàn)的,而不是使用Canvas來繪制捉捅,所以自定義起來比較簡單

仿iOS顯示一年的日歷

在蘋果手機上看到下面日歷顯示的效果比較好,自己也想在Android上實現(xiàn)一下:)

iphone_c.png

分析了下虽风,要想實現(xiàn)這種效果棒口,主要要解決三個顯示相關(guān)的問題

  • 月份文字的顯示位置(包括下面的那條橫線)
  • 行中間的那幾條橫線的顯示
  • 最后一行橫線的顯示

接下來集中來解決上面提出的幾個問題

月份文字的顯示位置(包括下面的那條橫線)

經(jīng)過分析可以知道,月份文字的顯示位置其實就是該月第一天的起始位置辜膝,然后根據(jù)這個位置信息動態(tài)的計算下坐標(biāo)无牵,scrollTo(x, y)到相應(yīng)的位置就行了(不采用改動layout的方式主要是為了性能考慮,調(diào)起requestLayout流程還是很耗時間的)

            final int firstdayOfWeekPosInMonth = scMonth.getFirstdayOfWeekPosInMonth();
            // wait for MonthView measure finish
            holder.monthView.post(new Runnable() {
                @Override
                public void run() {
                    ValueAnimator lineAnimator = ValueAnimator.ofInt(0, -(firstdayOfWeekPosInMonth - 1) * holder.monthView.getDayWidth());
                    lineAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                        @Override
                        public void onAnimationUpdate(ValueAnimator animation) {
                            int scrollX = (int) animation.getAnimatedValue();
                            holder.flScrollLine.scrollTo(scrollX , 0);
                        }
                    });

                    ValueAnimator monthAnimator = ValueAnimator.ofInt(0, -(firstdayOfWeekPosInMonth - 1) * holder.monthView.getDayWidth()
                            - (holder.monthView.getDayWidth() / 2 - holder.tvMonthTitle.getWidth() / 2));
                    monthAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                        @Override
                        public void onAnimationUpdate(ValueAnimator animation) {
                            int scrollX = (int) animation.getAnimatedValue();
                            holder.flScrollMonth.scrollTo(scrollX , 0);
                        }
                    });
                    AnimatorSet animationSet = new AnimatorSet();
                    animationSet.play(monthAnimator).with(lineAnimator);
                    animationSet.setInterpolator(new AccelerateDecelerateInterpolator());
                    animationSet.setDuration(500);
                    animationSet.start();

                    int dayCount = holder.monthView.getCurrentMonthLastRowDayCount();
                    View decorView = holder.monthView.getLastHorizontalDecor();
                    if(decorView != null)
                        decorView.scrollTo((7 - dayCount)*holder.monthView.getDayWidth(), 0);

                }
            });

自己加了一個動畫厂抖,主要是想試一下效果:)

行中間的那幾條橫線的顯示

看過(CalendarSelector)文檔的都知道茎毁,庫本身是支持添加行和列裝飾的,在這里的話只需要過濾下第一行和最后一行忱辅,不進行設(shè)置

    @Override
    public Decor inflateHorizontalDecor(ViewGroup container, int row, int totalRow) {
        return new Decor(mLayoutInflater.inflate(R.layout.view_horizontal_decor, container, false));
    }

    @Override
    public boolean isShowHorizontalDecor(int row, int realRowCount) {
        if(row == 0 || row == realRowCount) return false;
        return super.isShowHorizontalDecor(row, realRowCount);
    }

最后一行橫線的顯示

因為最后一行橫線顯示的位置也需要跟隨天數(shù)七蜘,所以需要特殊處理一下,考慮到MonthView在RecyclerView中使用的情況墙懂,需要處理好復(fù)用還原的問題橡卤,所以添加了一個自定義屬性來標(biāo)識是否需要reset

int dayCount = holder.monthView.getCurrentMonthLastRowDayCount();
View decorView = holder.monthView.getLastHorizontalDecor();
if(decorView != null)
   decorView.scrollTo((7 - dayCount)*holder.monthView.getDayWidth(), 0);
<attr name="sc_should_reset_decor" format="boolean"/>
if(shouldResetDecor){
  for (int i = 0; i < horizontalDecors.size(); i++) {
      DayViewInflater.Decor decor = horizontalDecors.get(i);
      if(decor != null && decor.getDecorView() != null)     
         decor.getDecorView().scrollTo(0, 0);
      }
}

經(jīng)過前面三步的實現(xiàn),跟蘋果的效果基本上相同了损搬,具體實現(xiàn)可以查看(AppleCalendarActivity)示例代碼

總結(jié)

可以發(fā)現(xiàn)使用(CalendarSelector)庫來實現(xiàn)一些自定義效果還是比較方便的碧库,自己也會盡可能的把一些有用的數(shù)據(jù)暴露出來。自己接下來會著重解決配合RecyclerView使用時遇到的性能問題(創(chuàng)建item view時會出現(xiàn)比較明顯的掉幀現(xiàn)象)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末巧勤,一起剝皮案震驚了整個濱河市嵌灰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌颅悉,老刑警劉巖沽瞭,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異剩瓶,居然都是意外死亡秕脓,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門儒搭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人芙贫,你說我怎么就攤上這事搂鲫。” “怎么了磺平?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵魂仍,是天一觀的道長拐辽。 經(jīng)常有香客問我,道長擦酌,這世上最難降的妖魔是什么俱诸? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮赊舶,結(jié)果婚禮上睁搭,老公的妹妹穿的比我還像新娘。我一直安慰自己笼平,他們只是感情好园骆,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著寓调,像睡著了一般锌唾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夺英,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天晌涕,我揣著相機與錄音,去河邊找鬼痛悯。 笑死余黎,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的灸蟆。 我是一名探鬼主播驯耻,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼炒考!你這毒婦竟也來了可缚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤斋枢,失蹤者是張志新(化名)和其女友劉穎帘靡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓤帚,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡描姚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了戈次。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片轩勘。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖怯邪,靈堂內(nèi)的尸體忽然破棺而出绊寻,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布澄步,位于F島的核電站冰蘑,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏村缸。R本人自食惡果不足惜祠肥,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梯皿。 院中可真熱鬧仇箱,春花似錦、人聲如沸索烹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽百姓。三九已至渊额,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間垒拢,已是汗流浹背旬迹。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留求类,地道東北人奔垦。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像尸疆,于是被迫代替她去往敵國和親椿猎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,190評論 25 707
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點贊按鈕進度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,769評論 22 665
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫寿弱、插件犯眠、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,109評論 4 62
  • 這青衣道人單手擎缸,駕云而去症革,天不亮筐咧,到了一處仙山。山頂神仙府邸聳入云中噪矛,迷霧繚繞量蕊,星芒閃動。 這大缸到了這里艇挨,仿...
    時光蜜糖閱讀 481評論 1 51
  • 短短的打卡30天時間就過去了残炮,自從有了打卡,生活就像上了發(fā)條缩滨,每天都有固定的一項工作要做吉殃,而這項工作不是在活動清單...
    靜靜地簡書閱讀 579評論 1 1