本文是在一个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