Android定制日历,支持周月切换,日期标记,农历显示,节假日

本文介绍了如何基于Android开发一个功能丰富的日历组件,包括周月切换、日期标记和农历显示。通过提供的CollapseCalendarView.java和MainActivity代码,展示了日历控件的核心实现。同时,提供了项目的源码下载链接,供开发者参考。
摘要由CSDN通过智能技术生成

公司项目需要一个功能全面的日历,然后就在网上找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 
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值