實(shí)現(xiàn)可滑動(dòng)的日歷
這是簡(jiǎn)單的效果湿诊,可以滑動(dòng)祸穷,是用的viewpager和自定義view實(shí)現(xiàn)的
首先是viewpager的代碼柬泽,其實(shí)和平常的使用時(shí)一樣的
viewPager = (ViewPager) findViewById(R.id.view_pager).
pagerAdapter = new CalendarPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(pagerAdapter);
viewPager.addOnPageChangeListener(this);
// 獲取當(dāng)天的日期所對(duì)應(yīng)的position
viewPager.setCurrentItem(DateTimeUtils.getTodayMonthIndex());
重要的是fragment的創(chuàng)建,通過(guò)計(jì)算年份的偏移給出position
public class CalendarPagerAdapter extends FragmentStatePagerAdapter {
public CalendarPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return CalendarPagerFragment.create(position);
}
@Override
public int getCount() {
// 計(jì)算一共有多少的position
int years = DateTimeUtils.getMaxYear() - DateTimeUtils.getMinYear();
return years * 12;
}
}
public class CalendarPagerFragment extends Fragment {
public static final String MONTH_INDEX = "month_index";
private int monthIndex;
private MonthDateView monthDateView;
public static CalendarPagerFragment create(int monthIndex) {
CalendarPagerFragment fragment = new CalendarPagerFragment();
Bundle bundle = new Bundle();
bundle.putInt(MONTH_INDEX, monthIndex);
fragment.setArguments(bundle);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
monthIndex = getArguments().getInt(MONTH_INDEX);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup view = (ViewGroup) inflater.inflate(R.layout.view_calendar, null);
// 動(dòng)態(tài)添加自定義的日歷界面
monthDateView = new MonthDateView(getActivity(), monthIndex);
monthDateView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
view.addView(monthDateView);
monthDateView.invalidate();
return view;
}
}
然后是自定義的日歷代碼:
// 獲取view的寬高,用于計(jì)算顯示的坐標(biāo)和距離
mDisplayMetrics = getResources().getDisplayMetrics();
Calendar calendar = Calendar.getInstance();
// 初始化畫(huà)筆
mPaint = new Paint();
mPaint.setAntiAlias(true);
// 計(jì)算當(dāng)前的年和月
mSelYear = DateTimeUtils.getMinYear() + (monthIndex / 12);
mSelMonth = monthIndex % 12;
@Override
protected void onDraw(Canvas canvas) {
initSize();
daysString = new int[6][7];
String dayString;
// 獲取全部的天數(shù)
int mMonthDays = DateUtils.getMonthDays(mSelYear, mSelMonth);
// 月份第一天是周幾
int weekNumber = DateUtils.getFirstDayWeek(mSelYear, mSelMonth);
Log.d("DateView", "DateView:" + mSelMonth + "月1號(hào)周" + weekNumber);
for (int day = 0; day < mMonthDays; day++) {
dayString = (day + 1) + "";
// 列
int column = (day + weekNumber - 1) % 7;
// 行
int row = (day + weekNumber - 1) / 7;
// 根據(jù)行齿坷,列進(jìn)行賦值
daysString[row][column] = day + 1;
if (dayString.equals(mSelDay + "")) {
// 在這里可以繪制選中日期的背景色
// 記錄第幾行,即第幾周
weekRow = row + 1;
sendMessage();
}
// 繪制橫線
mPaint.setColor(mLineColor);
canvas.drawLine(0, mRowSize * (row + 1), getWidth(), mRowSize * (row + 1), mPaint);
// 繪制事務(wù)圓形標(biāo)志数焊,就是字右上角顯示的事務(wù)個(gè)數(shù)
int count = PrefUtils.getInt(getDateString(day + 1), 0);
if (count != 0) {
drawCircle(row, column, day + 1, count, canvas);
}
mPaint.setTextSize(context.getResources().getDimension(R.dimen.content_text_size));
// 計(jì)算顯示字體的坐標(biāo)永淌,ascent()、descent()兩個(gè)函數(shù)的意思可以自行查找
int startX = (int) (mColumnSize * column + (mColumnSize - mPaint
.measureText(dayString)) / 2);
int startY = (int) (mRowSize * row + mRowSize / 2 - (mPaint
.ascent() + mPaint.descent()) / 2);
// 繪制日期
if (dayString.equals(mCurrDay + "")
&& mCurrMonth == mSelMonth) {
// 正常月佩耳,選中其他日期遂蛀,則今日為紅色
int startRecX = mColumnSize * column;
int startRecY = mRowSize * row;
mPaint.setColor(mSelectBGColor);
canvas.drawCircle(startRecX + mColumnSize / 2, startRecY + mRowSize / 2,
context.getResources().getDimension(R.dimen.alarm_click_bg_margin), mPaint);
mPaint.setColor(mSelectDayColor);
} else if (column == 0 || column == 6) {
// 周六日的顏色
mPaint.setColor(mWeekendColor);
} else {
mPaint.setColor(mDayColor);
}
canvas.drawText(dayString, startX, startY, mPaint);
}
}