package com.easier.adapter;
import android.app.Activity;
import android.content.Context;
import android.view.Display;
import android.view.Gravity;
import android.view.WindowManager;
import android.widget.GridView;
import android.widget.LinearLayout;
import com.easier.ui.R;
/**
*
* TODO<用于生成日历展示的GridView布局>
*
*/
public class CalendarGridView extends GridView {
/**
* 当前操作的上下文对象
*/
private Context mContext;
/**
* CalendarGridView 构造器
*
* @param context
* 当前操作的上下文对象
*/
public CalendarGridView(Context context) {
super(context);
mContext = context;
setGirdView();
}
/**
* 初始化gridView 控件的布局
*/
private void setGirdView() {
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
setLayoutParams(params);
setNumColumns(7);// 设置每行列数
setGravity(Gravity.CENTER_VERTICAL);// 位置居中
setVerticalSpacing(1);// 垂直间隔
setHorizontalSpacing(1);// 水平间隔
setBackgroundColor(getResources().getColor(R.color.calendar_background));
WindowManager windowManager = ((Activity) mContext).getWindowManager();
Display display = windowManager.getDefaultDisplay();
int i = display.getWidth() / 7;
int j = display.getWidth() - (i * 7);
int x = j / 2;
setPadding(x, 0, 0, 0);// 居中
}
}
二:
package com.easier.adapter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import android.app.Activity;
import android.content.res.Resources;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.LinearLayout.LayoutParams;
import com.easier.ui.R;
import com.easier.util.CalendarUtil;
/**
*
* TODO<GridViewAdapter>
*
*/
public class CalendarGridViewAdapter extends BaseAdapter {
private Calendar calStartDate = Calendar.getInstance();// 当前显示的日历
private Calendar calSelected = Calendar.getInstance(); // 选择的日历
public void setSelectedDate(Calendar cal) {
calSelected = cal;
}
private Calendar calToday = Calendar.getInstance(); // 今日
private int iMonthViewCurrentMonth = 0; // 当前视图月
// 根据改变的日期更新日历
// 填充日历控件用
private void UpdateStartDateForMonth() {
calStartDate.set(Calendar.DATE, 1); // 设置成当月第一天
iMonthViewCurrentMonth = calStartDate.get(Calendar.MONTH);// 得到当前日历显示的月
// 星期一是2 星期天是1 填充剩余天数
int iDay = 0;
int iFirstDayOfWeek = Calendar.MONDAY;
int iStartDay = iFirstDayOfWeek;
if (iStartDay == Calendar.MONDAY) {
iDay = calStartDate.get(Calendar.DAY_OF_WEEK) - Calendar.MONDAY;
if (iDay < 0)
iDay = 6;
}
if (iStartDay == Calendar.SUNDAY) {
iDay = calStartDate.get(Calendar.DAY_OF_WEEK) - Calendar.SUNDAY;
if (iDay < 0)
iDay = 6;
}
calStartDate.add(Calendar.DAY_OF_WEEK, -iDay);
calStartDate.add(Calendar.DAY_OF_MONTH, -1);// 周日第一位
}
ArrayList<java.util.Date> titles;
private ArrayList<java.util.Date> getDates() {
UpdateStartDateForMonth();
ArrayList<java.util.Date> alArrayList = new ArrayList<java.util.Date>();
for (int i = 1; i <= 42; i++) {
alArrayList.add(calStartDate.getTime());
calStartDate.add(Calendar.DAY_OF_MONTH, 1);
}
return alArrayList;
}
private Activity activity;
Resources resources;
// construct
public CalendarGridViewAdapter(Activity a, Calendar cal) {
calStartDate = cal;
activity = a;
resources = activity.getResources();
titles = getDates();
}
public CalendarGridViewAdapter(Activity a) {
activity = a;
resources = activity.getResources();
}
@Override
public int getCount() {
return titles.size();
}
@Override
public Object getItem(int position) {
return titles.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LinearLayout iv = new LinearLayout(activity);
iv.setId(position + 5000);
LinearLayout imageLayout = new LinearLayout(activity);
imageLayout.setOrientation(0);
iv.setGravity(Gravity.CENTER);
iv.setOrientation(1);
iv.setBackgroundColor(resources.getColor(R.color.white));
Date myDate = (Date) getItem(position);
Calendar calCalendar = Calendar.getInstance();
calCalendar.setTime(myDate);
final int iMonth = calCalendar.get(Calendar.MONTH);
final int iDay = calCalendar.get(Calendar.DAY_OF_WEEK);
// 判断周六周日
iv.setBackgroundColor(resources.getColor(R.color.white));
if (iDay == 7) {
// 周六
iv.setBackgroundColor(resources.getColor(R.color.text_6));
} else if (iDay == 1) {
// 周日
iv.setBackgroundColor(resources.getColor(R.color.text_7));
}
// 判断周六周日结束
TextView txtToDay = new TextView(activity);// 日本老黄历
txtToDay.setGravity(Gravity.CENTER_HORIZONTAL);
txtToDay.setTextSize(9);
CalendarUtil calendarUtil = new CalendarUtil(calCalendar);
if (equalsDate(calToday.getTime(), myDate)) {
// 当前日期
iv.setBackgroundColor(resources.getColor(R.color.event_center));
txtToDay.setText(calendarUtil.toString());
} else {
txtToDay.setText(calendarUtil.toString());
}
// 这里用于比对是不是比当前日期小,如果比当前日期小就高亮
if (!CalendarUtil.compare(myDate, calToday.getTime())) {
iv.setBackgroundColor(resources.getColor(R.color.frame));
} else {
// 设置背景颜色
if (equalsDate(calSelected.getTime(), myDate)) {
// 选择的
iv.setBackgroundColor(resources.getColor(R.color.selection));
} else {
if (equalsDate(calToday.getTime(), myDate)) {
// 当前日期
iv.setBackgroundColor(resources
.getColor(R.color.calendar_zhe_day));
}
}
}
// 设置背景颜色结束
// 日期开始
TextView txtDay = new TextView(activity);// 日期
txtDay.setGravity(Gravity.CENTER_HORIZONTAL);
// 判断是否是当前月
if (iMonth == iMonthViewCurrentMonth) {
txtToDay.setTextColor(resources.getColor(R.color.ToDayText));
txtDay.setTextColor(resources.getColor(R.color.Text));
} else {
txtDay.setTextColor(resources.getColor(R.color.noMonth));
txtToDay.setTextColor(resources.getColor(R.color.noMonth));
}
int day = myDate.getDate(); // 日期
txtDay.setText(String.valueOf(day));
txtDay.setId(position + 500);
iv.setTag(myDate);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
iv.addView(txtDay, lp);
LinearLayout.LayoutParams lp1 = new LinearLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
iv.addView(txtToDay, lp1);
return iv;
}
@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
}
private Boolean equalsDate(Date date1, Date date2) {
if (date1.getYear() == date2.getYear()
&& date1.getMonth() == date2.getMonth()
&& date1.getDate() == date2.getDate()) {
return true;
} else {
return false;
}
}
}
三
package com.easier.ui;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;
import android.widget.*;
import android.widget.LinearLayout.LayoutParams;
import com.easier.adapter.CalendarGridView;
import com.easier.adapter.CalendarGridViewAdapter;
import com.easier.util.CalendarUtil;
import com.easier.util.NumberHelper;
import java.util.Calendar;
import java.util.Date;
/**
*
* TODO<布局>
*
*/
public class CalendarView extends Activity implements OnTouchListener {
/**
* 日历布局ID
*/
private static final int CAL_LAYOUT_ID = 55;
// 判断手势用
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
/**
* 用于传递选中的日期
*/
private static final String MESSAGE = "msg";
// 动画
private Animation slideLeftIn;
private Animation slideLeftOut;
private Animation slideRightIn;
private Animation slideRightOut;
private ViewFlipper viewFlipper;
GestureDetector mGesture = null;
/**
* 今天按钮
*/
private Button mTodayBtn;
/**
* 上一个月按钮
*/
private ImageView mPreMonthImg;
/**
* 下一个月按钮
*/
private ImageView mNextMonthImg;
/**
* 用于显示今天的日期
*/
private TextView mDayMessage;
/**
* 用于装截日历的View
*/
private RelativeLayout mCalendarMainLayout;
// 基本变量
private Context mContext = CalendarView.this;
/**
* 上一个月View
*/
private GridView firstGridView;
/**
* 当前月View
*/
private GridView currentGridView;
/**
* 下一个月View
*/
private GridView lastGridView;
/**
* 当前显示的日历
*/
private Calendar calStartDate = Calendar.getInstance();
/**
* 选择的日历
*/
private Calendar calSelected = Calendar.getInstance();
/**
* 今日
*/
private Calendar calToday = Calendar.getInstance();
/**
* 当前界面展示的数据源
*/
private CalendarGridViewAdapter currentGridAdapter;
/**
* 预装载上一个月展示的数据源
*/
private CalendarGridViewAdapter firstGridAdapter;
/**
* 预装截下一个月展示的数据源
*/
private CalendarGridViewAdapter lastGridAdapter;
//
/**
* 当前视图月
*/
private int mMonthViewCurrentMonth = 0;
/**
* 当前视图年
*/
private int mMonthViewCurrentYear = 0;
/**
* 起始周
*/
private int iFirstDayOfWeek = Calendar.MONDAY;
@Override
public boolean onTouch(View v, MotionEvent event) {
return mGesture.onTouchEvent(event);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.calendar_main);
initView();
updateStartDateForMonth();
generateContetView(mCalendarMainLayout);
slideLeftIn = AnimationUtils.loadAnimation(this, R.anim.slide_left_in);
slideLeftOut = AnimationUtils
.loadAnimation(this, R.anim.slide_left_out);
slideRightIn = AnimationUtils
.loadAnimation(this, R.anim.slide_right_in);
slideRightOut = AnimationUtils.loadAnimation(this,
R.anim.slide_right_out);
slideLeftIn.setAnimationListener(animationListener);
slideLeftOut.setAnimationListener(animationListener);
slideRightIn.setAnimationListener(animationListener);
slideRightOut.setAnimationListener(animationListener);
mGesture = new GestureDetector(this, new GestureListener());
}
/**
* 用于初始化控件
*/
private void initView() {
mTodayBtn = (Button) findViewById(R.id.today_btn);
mDayMessage = (TextView) findViewById(R.id.day_message);
mCalendarMainLayout = (RelativeLayout) findViewById(R.id.calendar_main);
mPreMonthImg = (ImageView) findViewById(R.id.left_img);
mNextMonthImg = (ImageView) findViewById(R.id.right_img);
mTodayBtn.setOnClickListener(onTodayClickListener);
mPreMonthImg.setOnClickListener(onPreMonthClickListener);
mNextMonthImg.setOnClickListener(onNextMonthClickListener);
}
/**
* 用于加载到当前的日期的事件
*/
private View.OnClickListener onTodayClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
calStartDate = Calendar.getInstance();
calSelected = Calendar.getInstance();
updateStartDateForMonth();
generateContetView(mCalendarMainLayout);
}
};
/**
* 用于加载上一个月日期的事件
*/
private View.OnClickListener onPreMonthClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
viewFlipper.setInAnimation(slideRightIn);
viewFlipper.setOutAnimation(slideRightOut);
viewFlipper.showPrevious();
setPrevViewItem();
}
};
/**
* 用于加载下一个月日期的事件
*/
private View.OnClickListener onNextMonthClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
viewFlipper.setInAnimation(slideLeftIn);
viewFlipper.setOutAnimation(slideLeftOut);
viewFlipper.showNext();
setNextViewItem();
}
};
/**
* 主要用于生成发前展示的日历View
*
* @param layout
* 将要用于去加载的布局
*/
private void generateContetView(RelativeLayout layout) {
// 创建一个垂直的线性布局(整体内容)
viewFlipper = new ViewFlipper(this);
viewFlipper.setId(CAL_LAYOUT_ID);
calStartDate = getCalendarStartDate();
CreateGirdView();
RelativeLayout.LayoutParams params_cal = new RelativeLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
layout.addView(viewFlipper, params_cal);
LinearLayout br = new LinearLayout(this);
RelativeLayout.LayoutParams params_br = new RelativeLayout.LayoutParams(
LayoutParams.FILL_PARENT, 1);
params_br.addRule(RelativeLayout.BELOW, CAL_LAYOUT_ID);
br.setBackgroundColor(getResources().getColor(
R.color.calendar_background));
layout.addView(br, params_br);
}
/**
* 用于创建当前将要用于展示的View
*/
private void CreateGirdView() {
Calendar firstCalendar = Calendar.getInstance(); // 临时
Calendar currentCalendar = Calendar.getInstance(); // 临时
Calendar lastCalendar = Calendar.getInstance(); // 临时
firstCalendar.setTime(calStartDate.getTime());
currentCalendar.setTime(calStartDate.getTime());
lastCalendar.setTime(calStartDate.getTime());
firstGridView = new CalendarGridView(mContext);
firstCalendar.add(Calendar.MONTH, -1);
firstGridAdapter = new CalendarGridViewAdapter(this, firstCalendar);
firstGridView.setAdapter(firstGridAdapter);// 设置菜单Adapter
firstGridView.setId(CAL_LAYOUT_ID);
currentGridView = new CalendarGridView(mContext);
currentGridAdapter = new CalendarGridViewAdapter(this, currentCalendar);
currentGridView.setAdapter(currentGridAdapter);// 设置菜单Adapter
currentGridView.setId(CAL_LAYOUT_ID);
lastGridView = new CalendarGridView(mContext);
lastCalendar.add(Calendar.MONTH, 1);
lastGridAdapter = new CalendarGridViewAdapter(this, lastCalendar);
lastGridView.setAdapter(lastGridAdapter);// 设置菜单Adapter
lastGridView.setId(CAL_LAYOUT_ID);
currentGridView.setOnTouchListener(this);
firstGridView.setOnTouchListener(this);
lastGridView.setOnTouchListener(this);
if (viewFlipper.getChildCount() != 0) {
viewFlipper.removeAllViews();
}
viewFlipper.addView(currentGridView);
viewFlipper.addView(lastGridView);
viewFlipper.addView(firstGridView);
String s = calStartDate.get(Calendar.YEAR)
+ "-"
+ NumberHelper.LeftPad_Tow_Zero(calStartDate
.get(Calendar.MONTH) + 1);
mDayMessage.setText(s);
}
/**
* 上一个月
*/
private void setPrevViewItem() {
mMonthViewCurrentMonth--;// 当前选择月--
// 如果当前月为负数的话显示上一年
if (mMonthViewCur
安卓系统的日历开发(项目报告2)【程序详解及效果图 开发总结】
最新推荐文章于 2024-10-08 11:02:43 发布
本文档详细介绍了安卓系统日历应用的开发过程,包括关键步骤和最终实现的效果图展示,提供了宝贵的开发经验与总结。
摘要由CSDN通过智能技术生成