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

公司项目需要一个功能全面的日历,然后就在网上找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 
  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 33
    评论
### 回答1: UniApp是一款跨平台的开发框架,可以让开发者使用一套代码开发出同时支持多个平台(如iOS、Android等)的应用程序。而UniApp的日历组件则是一款非常实用的工具,它可以让用户查看日历的月份,并可以切换为周视图,以便更加方便地查看某段时间内的日程安排。 针对UniApp日历的上下拉切换周月功能,可以采用如下方法实现: 首先,需要在日历组件的配置中设置支持切换周月,并且添加一个开关控件来控制视图的切换。对于周月视图的切换,需要监听组件的动事件,以便判断用户向上还是向下动。如果用户向下动,则将切换为周视图;如果向上动,则切换为月视图。 其次,需要在组件的内部实现上下切换的逻辑。在周视图中,需要通过计算当前周,然后使用一个循环来显示周中的每个日期。在月视图中,需要计算出当前月份和当前月份的天数,并使用一个类似于网格的布局方式来展示整个月份的日期。 最后,需要对切换逻辑进行优化,以提高用户体验。可以添加动画效果,例如当用户从月视图切换到周视图时,可以让组件的高度缓慢增加;当用户从周视图切换到月视图时,可以让组件的高度缓慢减小。这样可以增加用户的交互感,并且更加自然地体现出周月切换的逻辑。 通过以上的方法来实现UniApp日历的上下拉切换周月,可以让用户更加方便地查看日历,提高效率,增强用户体验。 ### 回答2: Uniapp日历组件中,可以通过上下拉的方式来切换周月。当用户向上动屏幕时,日历组件会自动切换到下一个月的视图。当用户向下动屏幕时,日历组件会自动切换到上一个月的视图。 如果需要切换到周视图,可以在日历顶部点击“周”按钮。此时,日历组件会以周为单位来显示日期,并且周末会用不同的颜色进行标记。 如果需要切换回月视图,可以再次在日历顶部点击“月”按钮即可。 此外,日历组件还支持手动选择日期,可以通过点击日历上的日期切换到对应的日期视图。在日期视图中,可以查看当天的日程,并进行添加、编辑、删除等操作。 总之,Uniapp日历组件提供了方便灵活的周月切换功能,可以满足不同用户的需求。同时,还提供了丰富的操作及显示功能,方便用户进行适当的日期处理。 ### 回答3: Uniapp是一款基于Vue.js的开发框架,可以快速开发多平台应用。而Uniapp日历不仅支持基本的日期选择,还能够实现上下拉切换周月。下面我们来详细了解一下如何实现这一功能。 实现Uniapp日历的上下拉切换周月,需要首先明确两点: 1. 切换时需要更新当前视图中展示的数据 2. 切换时需要更新头部显示的当前日期信息 接下来我们结合实例来一步一步实现。 1. 数据更新 Uniapp日历的数据是通过minDate、maxDate、calendarData等属性实现的。其中,minDate和maxDate控制了日历可以选择的日期范围,而calendarData则记录了当前日历视图中需要展示哪些日期,以及它们的状态(是否disabled、是否selected等)。 在切换周月时,我们需要根据当前选择的日期和展示视图的类型(周、月)来计算出当前视图中需要展示哪些日期,并将其更新到calendarData中。具体实现可以参考以下代码: ```javascript // 根据选择的日期和展示类型,计算出需要展示的日期 calculateDates(date, type) { let result = [] if (type === 'month') { // 展示月视图 // 计算出当月第一天和最后一天 let firstDate = new Date(date.getFullYear(), date.getMonth(), 1) let lastDate = new Date(date.getFullYear(), date.getMonth() + 1, 0) // 循环计算出当前月份需要展示的所有日期 for (let i = 1; i <= lastDate.getDate(); i++) { let d = new Date(date.getFullYear(), date.getMonth(), i) result.push(d) } } else { // 展示周视图 // 计算出当前日期所在周的周一和周日 let firstDate = new Date(date.setDate(date.getDate() - date.getDay() + 1)) let lastDate = new Date(date.setDate(date.getDate() - date.getDay() + 7)) // 循环计算出当前周需要展示的所有日期 while (firstDate <= lastDate) { result.push(new Date(firstDate)) firstDate.setDate(firstDate.getDate() + 1) } } return result }, // 更新日历展示数据 updateCalendar(date, type) { let dates = this.calculateDates(date, type) let calendarData = [] for (let i = 0; i < dates.length; i++) { let d = dates[i] let isDisabled = !this.isInRange(d) let isSelected = this.isSelectedDate(d) calendarData.push({ date: d, disabled: isDisabled, selected: isSelected }) } this.calendarData = calendarData this.currentViewType = type }, ``` 在上面的代码中,calculateDates方法根据选择的日期和展示类型计算出需要展示的日期数组,updateCalendar方法则根据这个数组来更新calendarData和currentViewType的值。 2. 头部信息更新 Uniapp日历的头部信息是通过currentMonth和currentYear属性实现的。它们用于显示当前展示视图中的月份和年份信息。在切换周月时,我们需要更新这些属性的值。 具体实现可以参考以下代码: ```javascript // 更新头部信息 updateHeader(date, type) { if (type === 'month') { this.currentMonth = date.getMonth() + 1 this.currentYear = date.getFullYear() } else { let firstDate = new Date(date.setDate(date.getDate() - date.getDay() + 1)) let lastDate = new Date(date.setDate(date.getDate() - date.getDay() + 7)) this.currentMonth = firstDate.getMonth() + 1 this.currentYear = firstDate.getFullYear() this.currentWeek = firstDate.getDate() + '-' + lastDate.getDate() } }, ``` 在上面的代码中,我们通过calculateDates方法计算出需要展示的日期数组后,就可以在updateHeader方法中根据需要更新currentMonth、currentYear和currentWeek的值了。 综上所述,实现Uniapp日历的上下拉切换周月,需要根据当前选择的日期和展示视图的类型来计算出需要展示的日期,并将其更新到calendarData中。同时,还需要更新头部信息中的currentMonth、currentYear和currentWeek的值。以上就是Uniapp日历上下拉切换周月的相关内容。
评论 33
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值