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 でそれ云々するにはどうすりゃ良いかを確認すれば良い?