androidcalendarview の中身確認など

燃料を注入しつつとりあえず以下にて checkout を。

$ svn checkout http://androidcalendarview.googlecode.com/svn/trunk/ androidcalendarview-read-only
The program 'svn' is currently not installed.  You can install it by typing:
sudo apt-get install subversion
$

うをを、と言いつつ subversion を導入して無事 checkout 完了。
で、邪魔くさいので .svn を除去。

$ find -name '.svn'|xargs rm -rf 

とりあえず src/org/kazzz/view/calendar/CalendarView.java を起点に見ていけば良いのかどうなのか。とりあえず定義されてるメソドを以下に列挙してみます。

  • コンストラクタ
    • public CalendarView(Context context)
    • public CalendarView(Context context, AttributeSet attrs)
  • public java.util.Calendar getCalandar()
  • public void setCalandar(java.util.Calendar calandar)
  • public void setCalendar(int year, int month)
  • private void init(Context context, AttributeSet attrs)
  • public boolean onTouchEvent(MotionEvent event)
  • private boolean flickOrTaptoDate(float currentX, float velocityX, float currentY, float velocityY)
  • protected void performSelectionCalendar(MonthlyCalendarView currentView)
  • public void selectCalendar(int year, int month, int day)
  • public DateInfo getDateInfo()
  • public void addOnCalendarSelectionListener(OnCalendarSelectionListener listener)
  • public void removeOnCalendarSelectionListener(OnCalendarSelectionListener listener)
  • protected void setYearAndMonthFromDialog()
  • private void showPreviousMonth(int direction)
  • private void showNextMonth(int direction)
  • private void showYearMonth(int year, int month)
  • private void setHeader(int year, int month)

意外に少ないな、という印象。と思ったら本体 (?) は MonthlyCalendarView らしい。あ、よくよく見てみるに CalendarView は LenearLayout のサブクラスだ。
微妙に気になるので src/org/kazzz/CalendarTest.java を見てみたのですが、ここでは res/layout/main.xml を setContentView してるだけですな。
んで、res/layout/main.xml は以下。

<?xml version="1.0" encoding="utf-8"?>
<org.kazzz.view.MotionableScrollView
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/ScrollView01"
 android:soundEffectsEnabled="true"
 android:layout_height="fill_parent"
 android:layout_width="fill_parent"
 android:fillViewport="true">
 <LinearLayout
  android:id="@+id/LinearLayout03"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical"
 >

  <org.kazzz.view.calendar.CalendarView
   android:id="@+id/Calendar"
   android:layout_height="fill_parent"
   android:layout_width="fill_parent"
   android:layout_weight="1">
  </org.kazzz.view.calendar.CalendarView>
  <TextView
   android:id="@+id/txtGuidance"
   android:layout_width="fill_parent"
   android:text="@string/guidance_calendar_view"
   android:layout_height="fill_parent" 
   android:layout_weight="10">
  </TextView>
 </LinearLayout>
</org.kazzz.view.MotionableScrollView>

むむ、とりあえず MotionableScrollView はスルーとしてやっぱレイアウトでは CalendarView を使ってますね。今ヒッカカッてるのは以下。

  • カレンダの描画
  • 当月の MonthlyCalendarView を保持していないのは何故か

ええとカレンダの描画は MonthlyCalendarView で云々みたいなのは把握。あと、当月のナニを云々、というあたりですが CalendarView#init から CalendarView#setCalendar を呼んでて

                    this.setCalendar(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1);

setCalendar では以下な記述。

    public void setCalendar(int year, int month) {
        this.calendar.clear();
        this.calendar.set(year, month - 1, 1); // 引数: 1月: 0, 2月: 1, ...

        if ( this.viewFlipper != null ) {
            MonthlyCalendarView view = (MonthlyCalendarView)
            this.viewFlipper.getChildAt(this.viewFlipper.getDisplayedChild());
            if ( view != null ) { //viewはnullもあり得る
                view.setCalendar(this.calendar);
            }
        }
    }

ViewFlipper は微妙なことしてるみたいなんでとりあえずスルー。MonthlyCalendarView#setCalendar が以下な記述。

    public void setCalendar(Calendar calendar) {
        this.calendar = calendar;
        this.setToDay(today);
        this.calcCalendarMatrix();
    }

calcCalendarMatrix というメソドは_カレンダーを計算する_というコメントがある。つうかそもそも setCalendar の中で view を云々してるんですが、やっぱこれって android.widget.ViewFlipper が何なのか、を把握しないと微妙かも。
つうか、ViewPager とか Fragment で云々、な方式でリライトできんかな。もう少し諸々について確認してみます。追加があれば別途追記の方向で。

つづき

とりあえず MonthlyCalendarView を確認してみます。
コンストラクタのいっちゃんケツで呼び出されている initResource() メソドのいっちゃんケツで呼び出されている calcCalendarMatrix() メソド、カレンダな配列を作って View#invalidate() を呼び出しています。これにより onDraw() が Kickoff される模様。

検討しつつ、MonthlyCalendarView を Fragment に云々? て思ってたんですが、この View を Fragment に追加する形を取れば良いのか。ということは ViewPager でそれ云々するにはどうすりゃ良いかを確認すれば良い?