仿快捷酒店滑动选择calendar控件(使用HitRect)

声明:大神勿喷!!
今天我给大家讲个故事:
       long long ago...山里有个公司,公司里有个产品经理在给程序员讲需求,需求是这样讲的:我要一个仿制快捷酒店的Calendar控件!!!(UI设计师在旁边阴暗的冷笑)...
       好了言归正传,上一篇的的HitTest让我懂了一些基本的东西,在这里总结下:
HitTest:
在父View抓取当前touch的X,Y坐标(相对于父View)。然后与子View挨个比对,看看父View的触点是否在子View相对于父View的范围内。
这样我们就能轻松的解决一些下面的Calenadr;


上代码:

activity:


package com.example.clander;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

/**
 * 日历显示activity
 * 
 *
 */
public class CalendarActivity extends Activity implements  View.OnClickListener {//OnGestureListener,

//	private GestureDetector gestureDetector = null;
	private CalendarAdapter calV = null;
	private GridView gridView = null;
	private TextView topText = null;
	private static int jumpMonth = 0;      //每次滑动,增加或减去一个月,默认为0(即显示当前月)
	private static int jumpYear = 0;       //滑动跨越一年,则增加或者减去一年,默认为0(即当前年)
	private int year_c = 0;
	private int month_c = 0;
	private int day_c = 0;
	private String currentDate = "";
	private Bundle bd=null;//发送参数
	private Bundle bun=null;//接收参数
	private String ruzhuTime;
	private String lidianTime;
	private String state="";
	
	private LinearLayout upPage,nextPage;
	private List<View> selectedViews=new ArrayList<View>();
	private boolean isPress=false;
	private CalendarItemEntity inEntity,outEntity;
	
	public CalendarActivity() {

		Date date = new Date();
    	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d");
    	currentDate = sdf.format(date);  //当期日期
    	year_c = Integer.parseInt(currentDate.split("-")[0]);
    	month_c = Integer.parseInt(currentDate.split("-")[1]);
    	day_c = Integer.parseInt(currentDate.split("-")[2]);
    	
    	
	}
	private int lastTouchIndex=-1;
	private int currentPosition=-1;//当前手指悬停点
	private int downPositin=-1;//按下时候的点
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.calendar);
		bd=new Bundle();//out
		bun=getIntent().getExtras();//in
		
		
		  if(bun!=null&&bun.getString("state").equals("ruzhu"))
          {
          	state=bun.getString("state");
          }else if(bun!=null&&bun.getString("state").equals("lidian")){
          	state=bun.getString("state");
          }
		
        calV = new CalendarAdapter(this,getResources(),jumpMonth,jumpYear,year_c,month_c,day_c);
        addGridView();
        gridView.setAdapter(calV);
        
		topText = (TextView) findViewById(R.id.tv_month);
		addTextToTopTextView(topText);
		
		gridView.setOnTouchListener(new OnTouchListener() {
			
			@Override
			public boolean onTouch(View arg0, MotionEvent event) {
				int touchIndex = gridView.pointToPosition((int) event.getX(), (int) event.getY());
				View childView = gridView.getChildAt(touchIndex);
				switch(event.getAction()){
				case MotionEvent.ACTION_DOWN:
					lastTouchIndex=touchIndex;//初始化lastTouch
					isPress=true;
					if(selectedViews.size()!=0)
						selectedViews.clear();
					
					clearAllBg();
					
					if (null != childView){
						CalendarItemEntity entity=(CalendarItemEntity) childView.getTag();
						if(entity.isCheck())
							downPositin=touchIndex;
					}
				case MotionEvent.ACTION_MOVE:
					if (null != childView){
//						Log.i("texts","curr---"+currentPosition+"-----"+downPositin);
						currentPosition=touchIndex;
						CalendarItemEntity entity=(CalendarItemEntity)childView.getTag();
						if(entity.isCheck()){
							if(downPositin==-1)
								downPositin=touchIndex;
								currentPosition=touchIndex;
								Log.i("texts","curr---"+currentPosition+"-----"+downPositin);
								measureSelected();
							lastTouchIndex=touchIndex;
						}
					}
					break;
				case MotionEvent.ACTION_UP:
					if(selectedViews.size()==1){
						if(currentPosition>=gridView.getChildCount()-1){
							addGridView();   //添加一个gridView
							jumpMonth++;     //下一个月
							calV = new CalendarAdapter(CalendarActivity.this,getResources(),jumpMonth,jumpYear,year_c,month_c,day_c);
					        gridView.setAdapter(calV);
					        addTextToTopTextView(topText);
						}else if(downPositin!=-1){
							setSelectedView(gridView.getChildAt(downPositin+1));
							inEntity=(CalendarItemEntity) gridView.getChildAt(downPositin).getTag();
							outEntity=(CalendarItemEntity) gridView.getChildAt(downPositin+1).getTag();
						}
					}
					isPress=false;
					downPositin=-1;
					Log.i("texts", ""+selectedViews.size());
					
					Toast.makeText(CalendarActivity.this,"当前选中:"+inEntity.getYear()+inEntity.getMonth()+inEntity.getCurrentDay()+"::"+
					outEntity.getYear()+outEntity.getMonth()+outEntity.getCurrentDay(), Toast.LENGTH_SHORT).show();
					break;
				default:
					break;
				}
				return true;
			}
		});
		
		upPage=(LinearLayout) this.findViewById(R.id.btn_prev_month);
		nextPage=(LinearLayout) this.findViewById(R.id.btn_next_month);
		
		upPage.setOnClickListener(this);
		nextPage.setOnClickListener(this);
	}
	
	private void cheekViewToAdd(View childView){
		boolean isHas=false;
		for (View v : selectedViews) {
			if(v==childView)
				isHas=true;
		}
		if (!isHas) {
				selectedViews.add(childView);
		}
		
	}
	
	private void setSelectedView(View childView){//让条目选中
		((TextView)((LinearLayout)childView).getChildAt(0)).setBackgroundResource(R.drawable.current_day_bgc);
		((TextView)((LinearLayout)childView).getChildAt(0)).setTextColor(Color.WHITE);
		cheekViewToAdd(childView);
	}
	
	
	

	private void clearAllBg(){//清理所有背景
		int childcount=gridView.getChildCount();
		for (int i=0;i<childcount;i++) {
			LinearLayout child=(LinearLayout)gridView.getChildAt(i);
			CalendarItemEntity entity=(CalendarItemEntity) child.getTag();
			if(!entity.isCheck()){
				TextView textView=(TextView) child.getChildAt(0);
				textView.setBackgroundResource(R.drawable.triangle05);
				textView.setTextColor(Color.GRAY);
				continue;
			}
			TextView textView=(TextView) child.getChildAt(0);
			textView.setBackgroundResource(R.drawable.triangle05);
			textView.setTextColor(Color.BLACK);
		}
	}
	
	private void measureSelected(){
		clearAllBg();
		selectedViews.clear();
		if(currentPosition>downPositin){//如果向右滑动
			for (int i = 0; i <=currentPosition-downPositin; i++) {
				if(selectedViews.size()<6){
					setSelectedView(gridView.getChildAt(downPositin+i));
					outEntity=(CalendarItemEntity) gridView.getChildAt(downPositin+i).getTag();
				}
				else if(Math.abs(currentPosition-downPositin)<6){
					setSelectedView(gridView.getChildAt(downPositin+i));
					outEntity=(CalendarItemEntity) gridView.getChildAt(downPositin+i).getTag();
				}
				else if(currentPosition-downPositin>=6){
					if(i<6){
						setSelectedView(gridView.getChildAt(downPositin+i));
						outEntity=(CalendarItemEntity) gridView.getChildAt(downPositin+i).getTag();
					}
				}
			}
		}else if(currentPosition<downPositin){//向左滑动
			for(int i=0;i<=downPositin-currentPosition;i++){
				if(selectedViews.size()<6)
					setSelectedView(gridView.getChildAt(downPositin-i));
				else if(Math.abs(downPositin-currentPosition)<6)
					setSelectedView(gridView.getChildAt(downPositin-i));
				else if(downPositin-currentPosition>=6){
					if(i<6)
						setSelectedView(gridView.getChildAt(downPositin-i));
				}
				Log.i("texts", "ttttt::::"+currentPosition+"---"+downPositin);
				
			}
		}else{
			setSelectedView(gridView.getChildAt(currentPosition));
		}
	}
	
	
	//添加头部的年份 闰哪月等信息
	public void addTextToTopTextView(TextView view){
		StringBuffer textDate = new StringBuffer();
		textDate.append(calV.getShowYear()).append("年").append(
				calV.getShowMonth()).append("月").append("\t");
		view.setText(textDate);
		view.setTextColor(Color.WHITE);
		view.setTypeface(Typeface.DEFAULT_BOLD);
	}
	
	//添加gridview
	private void addGridView() {
		
		gridView =(GridView)findViewById(R.id.gridview);

//		gridView.setOnTouchListener(new OnTouchListener() {
//            //将gridview中的触摸事件回传给gestureDetector
//			@Override
//			public boolean onTouch(View v, MotionEvent event) {
//				// TODO Auto-generated method stub
//				return CalendarActivity.this.gestureDetector.onTouchEvent(event);
//			}
//		});           
		
		gridView.setOnItemClickListener(new OnItemClickListener() {
            //gridView中的每一个item的点击事件
			
			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int position,
					long arg3) {
				  //点击任何一个item,得到这个item的日期(排除点击的是周日到周六(点击不响应))
				  int startPosition = calV.getStartPositon();
				  int endPosition = calV.getEndPosition();
				  if(startPosition <= position+7  && position <= endPosition-7){
					  String scheduleDay = calV.getDateByClickItem(position).split("\\.")[0];  //这一天的阳历
					  //String scheduleLunarDay = calV.getDateByClickItem(position).split("\\.")[1];  //这一天的阴历
	                  String scheduleYear = calV.getShowYear();
	                  String scheduleMonth = calV.getShowMonth();
//	                  Toast.makeText(CalendarActivity.this, scheduleYear+"-"+scheduleMonth+"-"+scheduleDay, 2000).show();
		              ruzhuTime=scheduleMonth+"月"+scheduleDay+"日";	                  
	                  lidianTime=scheduleMonth+"月"+scheduleDay+"日";       
	                Intent intent=new Intent();
	                if(state.equals("ruzhu"))
	                {
	                	
	                	bd.putString("ruzhu", ruzhuTime);
	                	System.out.println("ruzhuuuuuu"+bd.getString("ruzhu"));
	                }else if(state.equals("lidian")){
	                	
	                	bd.putString("lidian", lidianTime);
	                }
	                }
				  }
			
		});
	}

	@Override
	public void onClick(View v) {
		switch(v.getId()){
		case R.id.btn_prev_month://上一页
			addGridView();   //添加一个gridView
			jumpMonth--;     //上一个月
			calV = new CalendarAdapter(this,getResources(),jumpMonth,jumpYear,year_c,month_c,day_c);
	        gridView.setAdapter(calV);
	        downPositin=-1;
	        addTextToTopTextView(topText);
			break;
		case R.id.btn_next_month://下一页
	        addGridView();   //添加一个gridView
			jumpMonth++;     //下一个月
			calV = new CalendarAdapter(this,getResources(),jumpMonth,jumpYear,year_c,month_c,day_c);
	        gridView.setAdapter(calV);
	        addTextToTopTextView(topText);
	        downPositin=-1;
			break;
			default:
				break;
		}
		
	}
	
}
acitvity的XML文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >



    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="40.0dip"
        android:background="#ff394147"
        android:gravity="center_vertical" >

        <LinearLayout
            android:id="@+id/btn_prev_month"
            android:layout_width="0.0dip"
            android:layout_height="fill_parent"
            android:layout_weight="0.2"
            android:gravity="center"
            android:clickable="true"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/left_img"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/triangle06_states"
                android:duplicateParentState="true"
                android:text=""
                android:textSize="16.0dip" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="0.0dip"
            android:layout_height="fill_parent"
            android:layout_weight="0.6"
            android:gravity="center"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/tv_month"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="xxxx年14月"
                android:textColor="#ffffffff"
                android:textSize="21.0dip" />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/btn_next_month"
            android:layout_width="0.0dip"
            android:layout_height="fill_parent"
            android:layout_weight="0.2"
            android:gravity="center"
            android:clickable="true"
            android:orientation="vertical" >

            <TextView
                android:id="@+id/right_img"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="@drawable/triangle05_states"
                android:duplicateParentState="true"
                android:text=""
                android:textSize="16.0dip" />
        </LinearLayout>
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="22.0dip"
        android:background="#ff8091a8" >

        <TextView
            style="@style/weekName"
            android:text="周日" />

        <TextView
            style="@style/weekName"
            android:text="周一" />

        <TextView
            style="@style/weekName"
            android:text="周二" />

        <TextView
            style="@style/weekName"
            android:text="周三" />

        <TextView
            style="@style/weekName"
            android:text="周四" />

        <TextView
            style="@style/weekName"
            android:text="周五" />

        <TextView
            style="@style/weekName"
            android:text="周六" />
    </LinearLayout>

    <GridView
        android:id="@+id/gridview"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#00000000"
        android:clickable="true"
        android:clipChildren="true"
        android:columnWidth="55.0dip"
        android:horizontalSpacing="1.0dip"
        android:listSelector="@null"
        android:numColumns="7"
        android:paddingBottom="1.0dip"
        android:stretchMode="columnWidth"
        android:verticalSpacing="1.0dip" />

</LinearLayout>

item的layout文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:background="#FFFFFF"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  
  <TextView 
	  android:gravity="center"
	  android:layout_width="fill_parent"
	  android:layout_height="55dp"
	  android:id="@+id/tvtext"
	  />
</LinearLayout>

adapter适配器java文件:

package com.example.clander;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Locale;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.RelativeSizeSpan;
import android.text.style.StyleSpan;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

/**
 * 日历gridview中的每一个item显示的textview
 * 
 * @author lmw
 * 
 */
public class CalendarAdapter extends BaseAdapter {
	public boolean isLeapyear = false; // 是否为闰年
	public int daysOfMonth = 0; // 某月的天数
	public int dayOfWeek = 0; // 具体某一天是星期几
	public int lastDaysOfMonth = 0; // 上一个月的总天数
	public Context context;
	public String[] dayNumber = new String[42]; // 一个gridview中的日期存入此数组中
	// private static String week[] = {"周日","周一","周二","周三","周四","周五","周六"};
	public SpecialCalendar sc = null;
	// private LunarCalendar lc = null;
	public Resources res = null;
	public Drawable drawable = null;

	public String currentYear = "";
	public String currentMonth = "";
	public String currentDay = "";

	public SimpleDateFormat sdf = new SimpleDateFormat("yyyy-M-d");
	public int currentFlag = -1; // 用于标记当天
	public int[] schDateTagFlag = null; // 存储当月所有的日程日期

	public String showYear = ""; // 用于在头部显示的年份
	public String showMonth = ""; // 用于在头部显示的月份
	public String animalsYear = "";
	public String leapMonth = ""; // 闰哪一个月
	// public String cyclical = ""; //天干地支
	// 系统当前时间
	public String sysDate = "";
	public String sys_year = "";
	public String sys_month = "";
	public String sys_day = "";

	private Calendar currCalendar;
	private int currDay;
	private int currMonth;
	private int currYear;
	
	private int selectedSize=90;//可选天数
	private int wantYear;
	private int wantMonth;
	private int wantDay;
	private Calendar wantCalendar;
	
	public CalendarAdapter() {
		Date date = new Date();
		sysDate = sdf.format(date); // 当期日期
		sys_year = sysDate.split("-")[0];
		sys_month = sysDate.split("-")[1];
		sys_day = sysDate.split("-")[2];

		currCalendar = Calendar.getInstance();
		currDay = currCalendar.get(Calendar.DAY_OF_MONTH);
		currMonth = currCalendar.get(Calendar.MONTH) + 1;
		currYear = currCalendar.get(Calendar.YEAR);
		
		wantCalendar=(Calendar) currCalendar.clone();
		wantCalendar.add(Calendar.DAY_OF_YEAR,selectedSize);
		wantYear=wantCalendar.get(Calendar.YEAR);
		wantMonth=wantCalendar.get(Calendar.MONTH)+1;
		wantDay=wantCalendar.get(Calendar.DAY_OF_MONTH);
	}

	public CalendarAdapter(Context context, Resources rs, int jumpMonth,
			int jumpYear, int year_c, int month_c, int day_c) {
		this();
		this.context = context;
		sc = new SpecialCalendar();
		// lc = new LunarCalendar();
		this.res = rs;

		int stepYear = year_c + jumpYear;
		int stepMonth = month_c + jumpMonth;
		if (stepMonth > 0) {
			// 往下一个月滑动
			if (stepMonth % 12 == 0) {
				stepYear = year_c + stepMonth / 12 - 1;
				stepMonth = 12;
			} else {
				stepYear = year_c + stepMonth / 12;
				stepMonth = stepMonth % 12;
			}
		} else {
			// 往上一个月滑动
			stepYear = year_c - 1 + stepMonth / 12;
			stepMonth = stepMonth % 12 + 12;
			if (stepMonth % 12 == 0) {

			}
		}

		currentYear = String.valueOf(stepYear);// 得到当前的年份
		currentMonth = String.valueOf(stepMonth); // 得到本月
													// (jumpMonth为滑动的次数,每滑动一次就增加一月或减一月)
		currentDay = String.valueOf(day_c); // 得到当前日期是哪天

		getCalendar(Integer.parseInt(currentYear),
				Integer.parseInt(currentMonth));

	}

	public CalendarAdapter(Context context, Resources rs, int year, int month,
			int day) {
		this();
		this.context = context;
		sc = new SpecialCalendar();
		// lc = new LunarCalendar();
		this.res = rs;
		currentYear = String.valueOf(year); // 得到跳转到的年份
		currentMonth = String.valueOf(month); // 得到跳转到的月份
		currentDay = String.valueOf(day); // 得到跳转到的天
		
		getCalendar(Integer.parseInt(currentYear),
				Integer.parseInt(currentMonth));

	}

	@Override
	public int getCount() {
		return dayNumber.length;
	}

	@Override
	public Object getItem(int position) {
		return position;
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		CalendarItemEntity entity = new CalendarItemEntity();// 条目实体

		if (convertView == null) {
			convertView = LayoutInflater.from(context).inflate(
					R.layout.calendar_item, null);
		}
		TextView textView = (TextView) convertView.findViewById(R.id.tvtext);
		String d = dayNumber[position].split("\\.")[0];

		String dv = dayNumber[position].split("\\.")[1];

		// SpannableString sp = new SpannableString(d+"\n"+dv);
		SpannableString sp = new SpannableString(d);
		sp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 0,
				d.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		sp.setSpan(new RelativeSizeSpan(1.2f), 0, d.length(),
				Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		textView.setText(sp);
		textView.setTextColor(Color.GRAY);

		entity.setCheck(false);
		entity.setCurrentDay(Integer.parseInt("" + sp));
		Calendar ca=(Calendar) currCalendar.clone();
		ca.add(Calendar.DAY_OF_MONTH,-1);
		long ldv=Long.parseLong(dv);
		if(ca.getTimeInMillis()<=ldv&&ldv<=wantCalendar.getTimeInMillis()){
			textView.setTextColor(Color.BLACK);// 当月字体设黑
			drawable = res.getDrawable(R.drawable.current_day_bgc);
			entity.setCheck(true);
		}
		
		if(position < dayOfWeek){
			if(cMonth==1){
				entity.setMonth(12);
				entity.setYear(cYear-1);
			}else{
				entity.setMonth(cMonth-1);
				entity.setYear(cYear);
			}
		}else if (position < daysOfMonth + dayOfWeek&& position >= dayOfWeek) {
			entity.setMonth(cMonth);
			entity.setYear(cYear);
		}else if(position>=daysOfMonth+dayOfWeek){
			if(cMonth==12){
				entity.setMonth(1);
				entity.setYear(cYear+1);
			}else{
				entity.setMonth(cMonth+1);
				entity.setYear(cYear);
			}
		}
		
		
		if (schDateTagFlag != null && schDateTagFlag.length > 0) {
			for (int i = 0; i < schDateTagFlag.length; i++) {
				if (schDateTagFlag[i] == position) {
					// 设置日程标记背景
					textView.setBackgroundResource(R.drawable.mark);
				}
			}
		}
		if (currentFlag == position) {
			// 设置当天的背景
			drawable = res.getDrawable(R.drawable.current_day_bgc);
			textView.setBackgroundDrawable(drawable);
			textView.setText("今天");
			textView.setTextColor(Color.WHITE);
		}
		if(currentFlag>0&¤tFlag+1==position){
			drawable = res.getDrawable(R.drawable.current_day_bgc);
			textView.setBackgroundDrawable(drawable);
			textView.setText("明天");
			textView.setTextColor(Color.WHITE);
		}
		
		
		
		
		convertView.setTag(entity);

		return convertView;
	}

	private int cMonth;
	private int cYear;

	// 得到某年的某月的天数且这月的第一天是星期几
	public void getCalendar(int year, int month) {
		isLeapyear = sc.isLeapYear(year); // 是否为闰年
		daysOfMonth = sc.getDaysOfMonth(isLeapyear, month); // 某月的总天数
		dayOfWeek = sc.getWeekdayOfMonth(year, month); // 某月第一天为星期几
		lastDaysOfMonth = sc.getDaysOfMonth(isLeapyear, month - 1); // 上一个月的总天数
		Log.d("DAY", isLeapyear + " ======  " + daysOfMonth
				+ "  ============  " + dayOfWeek + "  =========   "
				+ lastDaysOfMonth);

		cMonth = month;
		cYear = year;

		Calendar c = Calendar.getInstance();
		c.setTime(new Date(currYear, currMonth, currDay));
		c.set(currYear, currMonth - 1, currDay);
		System.out.println(currYear + "年 " + currMonth + "月 " + currDay
				+ "日为星期:" + (c.get(Calendar.DAY_OF_WEEK) - 1));
		cWeek = c.get(Calendar.DAY_OF_WEEK) - 1;

		getweek(year, month);
	}

	private int cWeek;

	// 将一个月中的每一天的值添加入数组dayNuber中
	private void getweek(int year, int month) {
		int j = 1;
		int flag = 0;
		String lunarDay = "";

		for (int i = 0; i < dayNumber.length; i++) {
			Calendar c = Calendar.getInstance();
				if (i < dayOfWeek) { // 前一个月
					int temp = lastDaysOfMonth - dayOfWeek + 1;
					// lunarDay = lc.getLunarDate(year, month-1, temp+i,false);
					c.set(year, month-2,temp+i);
					dayNumber[i] = (temp + i) + "." + c.getTimeInMillis();
				} else if (i < daysOfMonth + dayOfWeek) { // 本月
					String day = String.valueOf(i - dayOfWeek + 1); // 得到的日期
					// lunarDay = lc.getLunarDate(year, month,
					// i-dayOfWeek+1,false);
					c.set(year, month-1,Integer.parseInt(day));
					dayNumber[i] = i - dayOfWeek + 1 + "." + c.getTimeInMillis();
					// 对于当前月才去标记当前日期
					if (sys_year.equals(String.valueOf(year))
							&& sys_month.equals(String.valueOf(month))
							&& sys_day.equals(day)) {
						// 标记当前日期
						currentFlag = i;
					}
					setShowYear(String.valueOf(year));
					setShowMonth(String.valueOf(month));

				} else { // 下一个月
					c.set(year, month,j);
					dayNumber[i] = j + "." + c.getTimeInMillis();
					j++;
				}
			}
//		}

		currCalendar = Calendar.getInstance();// 重置当前时间的calendar

		String abc = "";
		for (int i = 0; i < dayNumber.length; i++) {
			abc = abc + dayNumber[i] + ":";
		}
		Log.d("DAYNUMBER", abc);
		
	}

	public void matchScheduleDate(int year, int month, int day) {

	}

	/**
	 * 点击每一个item时返回item中的日期
	 * 
	 * @param position
	 * @return
	 */
	public String getDateByClickItem(int position) {
		return dayNumber[position];
	}

	/**
	 * 在点击gridView时,得到这个月中第一天的位置
	 * 
	 * @return
	 */
	public int getStartPositon() {
		return dayOfWeek + 7;
	}

	/**
	 * 在点击gridView时,得到这个月中最后一天的位置
	 * 
	 * @return
	 */
	public int getEndPosition() {
		return (dayOfWeek + daysOfMonth + 7) - 1;
	}

	public String getShowYear() {
		return showYear;
	}

	public void setShowYear(String showYear) {
		this.showYear = showYear;
	}

	public String getShowMonth() {
		return showMonth;
	}

	public void setShowMonth(String showMonth) {
		this.showMonth = showMonth;
	}

	public String getAnimalsYear() {
		return animalsYear;
	}

	public void setAnimalsYear(String animalsYear) {
		this.animalsYear = animalsYear;
	}

	public String getLeapMonth() {
		return leapMonth;
	}

	public void setLeapMonth(String leapMonth) {
		this.leapMonth = leapMonth;
	}

}

javaBean(实体类):

package com.example.clander;

import java.io.Serializable;

public class CalendarItemEntity implements Serializable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 7086289624407287042L;
	
	
	private boolean isCheck=false;
	
	private int currentDay=-1;
	
	private int year;
	
	private int month;
	
	public boolean isCheck() {
		return isCheck;
	}

	public void setCheck(boolean isCheck) {
		this.isCheck = isCheck;
	}

	public int getCurrentDay() {
		return currentDay;
	}

	public void setCurrentDay(int currentDay) {
		this.currentDay = currentDay;
	}

	public int getYear() {
		return year;
	}

	public void setYear(int year) {
		this.year = year;
	}

	public int getMonth() {
		return month;
	}

	public void setMonth(int month) {
		this.month = month;
	}
	
	
}

Calendar核心处理类:

package com.example.clander;

import java.util.Calendar;

public class SpecialCalendar {

	private int daysOfMonth = 0;      //某月的天数
	private int dayOfWeek = 0;        //具体某一天是星期几

	
	// 判断是否为闰年
	public boolean isLeapYear(int year) {
		if (year % 100 == 0 && year % 400 == 0) {
			return true;
		} else if (year % 100 != 0 && year % 4 == 0) {
			return true;
		}
		return false;
	}

	//得到某月有多少天数
	public int getDaysOfMonth(boolean isLeapyear, int month) {
		switch (month) {
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			daysOfMonth = 31;
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			daysOfMonth = 30;
			break;
		case 2:
			if (isLeapyear) {
				daysOfMonth = 29;
			} else {
				daysOfMonth = 28;
			}

		}
		return daysOfMonth;
	}
	
	//指定某年中的某月的第一天是星期几
	public int getWeekdayOfMonth(int year, int month){
		Calendar cal = Calendar.getInstance();
		cal.set(year, month-1, 1);
		dayOfWeek = cal.get(Calendar.DAY_OF_WEEK)-1;
		return dayOfWeek;
	}
	
	
}

OK。。。看似复杂,真心很容易通俗易懂。只要耐心看下去,没有什么难的

这是效果图:


写完之后叹了口气,洗了把脸,然后高喊一声:"测试小妹!!!咱们放学后小巷子里,6元麻辣烫,我请!!!!"

声明:大神勿喷!!!


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值