公司项目需要一个功能全面的日历,然后就在网上找demo,然后根据demo自己深度定制了一个日历,基本满足了需求,现在把日历核心代码共享给大家。源码下载地址http://download.csdn.net/detail/voidmain_123/9275921
CollapseCalendarView.java
只需要将该控件引入到布局文件中
package com.eroad.widget.calendar;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
import org.joda.time.LocalDate;
import org.json.JSONObject;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.eroad.widget.calendar.manager.CalendarManager;
import com.eroad.widget.calendar.manager.CalendarManager.State;
import com.eroad.widget.calendar.manager.Day;
import com.eroad.widget.calendar.manager.Month;
import com.eroad.widget.calendar.manager.ResizeManager;
import com.eroad.widget.calendar.manager.Week;
import com.eroad.widget.calendar.widget.DayView;
import com.eroad.widget.calendar.widget.WeekView;
import com.example.calendarnew.R;
/**
* 日历View
* @author MaJian
*
*/
@SuppressLint({ “SimpleDateFormat”, “NewApi” }) public class CollapseCalendarView extends LinearLayout implements View.OnClickListener {
public static final String TAG = "CalendarView";
private CalendarManager mManager;
private TextView mTitleView;
private ImageButton mPrev;
private ImageButton mNext;
private LinearLayout mWeeksView;
private final LayoutInflater mInflater;
private final RecycleBin mRecycleBin = new RecycleBin();
private OnDateSelect mListener;
private TextView mSelectionText;
private LinearLayout mHeader;
private ResizeManager mResizeManager;
private ImageView mIvPre;
private ImageView mIvNext;
private Animation left_in;
private Animation right_in;
private boolean initialized;
private String[] weeks;
private OnTitleClickListener titleClickListener;
private JSONObject dataObject; //日历数据源
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
private boolean showChinaDay = true; //是否显示农历日期
public CollapseCalendarView(Context context) {
this(context, null);
onFinishInflate();
}
public void showChinaDay(boolean showChinaDay){
this.showChinaDay = showChinaDay;
populateLayout();
}
/**
* 设置标题点击监听器
* @param titleClickListener
*/
public void setTitleClickListener(OnTitleClickListener titleClickListener){
this.titleClickListener = titleClickListener;
}
public CollapseCalendarView(Context context, AttributeSet attrs) {
this(context, attrs, R.attr.calendarViewStyle);
}
public void setArrayData(JSONObject jsonObject){
this.dataObject = jsonObject;
}
public interface OnTitleClickListener{
public void onTitleClick();
}
@SuppressLint("NewApi")
public CollapseCalendarView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
weeks = getResources().getStringArray(R.array.weeks);
mInflater = LayoutInflater.from(context);
mResizeManager = new ResizeManager(this);
inflate(context, R.layout.calendar_layout, this);
setOrientation(VERTICAL);
setBackgroundColor(getResources().getColor(R.color.cal_color_white));
mIvPre = new ImageView(getContext());
mIvNext = new ImageView(getContext());
RelativeLayout.LayoutParams param = new RelativeLayout.LayoutParams(LayoutParams.MATCH_PARENT, android.widget.RelativeLayout.LayoutParams.WRAP_CONTENT);
mIvPre.setLayoutParams(param);
mIvNext.setLayoutParams(param);
initAnim();
}
/**
* 初始化左右滑动动画
*/
private void initAnim(){
left_in = AnimationUtils.makeInAnimation(getContext(), true);
right_in = AnimationUtils.makeInAnimation(getContext(), false);
}
/**
* 初始化日历管理器
* @param manager 日历管理器对象
*/
public void init(CalendarManager manager) {
if (manager != null) {
mManager = manager;
if (mListener != null) {
mListener.onDateSelected(mManager.getSelectedDay());
}
populateLayout();
}
}
/**
* 切换到指定某天界面
* @param date yyyy-MM-dd
*/
public void changeDate(String date){
if (date.compareTo(mManager.getSelectedDay().toString()) > 0) {
this.setAnimation(right_in);
right_in.start();
} else if (date.compareTo(mManager.getSelectedDay().toString()) < 0) {
this.setAnimation(left_in);
left_in.start();
}
try {
mManager.init(LocalDate.fromDateFields(sdf.parse(date)));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
init(mManager);
}
public CalendarManager getManager() {
return mManager;
}
@Override
public void onClick(View v) {
if (mManager