本文是在一個MonthDateView的基礎上修改的Demo(忘記當時下載的地址,以後找到了補上),因公司需求做一個可左右滑動的月份選擇器,而原項目因不可滑動,且事務支持類型有限,在源代碼上略作修改,基本實現了需求。由於本人不會製作GIF圖片,效果圖就簡單的貼兩張,如下:
- 無限滑動的ViewPager
- 多事務標識
無限滑動的ViewPager
經過幾天的研究,發現比較好的實現ViewPager的無限滑動的方式是預先放置3個page頁,默認滑動到第二個頁面,在左右滑動完成後,將當前的page頁設置爲第二頁,在設置取消掉滑動的動畫效果,這樣就可以實現ViewPager的無限滑動。以下是代碼實現部分:
/**
* 設置ViewPage可以無限滑動
*/
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
Log.i("yuanye", "cyf333 : " + Pageviews.size());
switch (position) {
case 0:
mdv0.onLeftClick(year, month, day);
break;
case 1:
/**
* 設置當滑動的月份是當前月份的之前月份時,不可滑動
*/
Log.i("yuanye", mdv1.getCurrMonth()+" " + month);
if (mdv1.getCurrentYear() == year && mdv1.getCurrMonth() == month) {
Log.i("yuanye", "cyf111 : " + Pageviews.size());
Pageviews.remove(2);
Log.i("yuanye", "cyf222 : " + Pageviews.size());
} else if(Pageviews.size() == 2) {
Pageviews.add(2, page03);
}
adapter.notifyDataSetChanged();
break;
case 2:
if (mdv2 != null) {
mdv2.onRightClick(year, month, day);
}
break;
}
}
@Override
public void onPageScrollStateChanged(int state) {
if (state == 0) {
Log.i("yuanye", "12312315");
if (viewPager.getCurrentItem() == 1) {
return;
}
if (viewPager.getCurrentItem() > 1) {
mdv1.onRightClick(year, month, day);
mdv1.setTextView(date_text);
} else {
mdv1.onLeftClick(year, month, day);
mdv1.setTextView(date_text);
}
year = mdv1.getmSelYear();
month = mdv1.getmSelMonth();
day = mdv1.getmSelDay();
viewPager.setCurrentItem(1, false);
}
}
});
多事務標識
對於事務的顏色標記,首先需要知道的是事務具體的年月日,然後根據不同的事務類型,設置不同的type標記,這樣來達到多事務處理標識。主要代碼如下:
private void drawCircle(int row, int column, int day, Canvas canvas) {
if (daysHasThingList != null && daysHasThingList.size() > 0) {
// if (!daysHasThingList.contains(day)) return;
for(int i = 0;i<daysHasThingList.size();i++){
if(daysHasThingList.get(i).getDay()==day){
/**
* 根據事務的類型,給畫筆設置不同的顏色
*/
switch (daysHasThingList.get(i).getType()) {
case 1:
mPaint.setColor(mHashThinColor1);
break;
case 2:
mPaint.setColor(mHashThinColor2);
break;
case 3:
mPaint.setColor(mHashThinColor3);
break;
}
/**
* 如果想設置不同事務標識圖標,可在設立設置
*/
float circleX = (float) (mColumnSize * column + mColumnSize * 0.8);
float circley = (float) (mRowSize * row + mRowSize * 0.2);
canvas.drawCircle(circleX, circley, mCircleRadius, mPaint);
}
}
}
}
這裏主要是邏輯算法的理解,如果有興趣可以自己看看源碼,這裏只是簡單的實現了需求,由於Demo代碼量比較多,這裏就不一一粘貼。
點擊獲取Demo