最近在公司的功能需求中,需要實(shí)現(xiàn)可以簽到的日歷,簽到后在簽到過(guò)的日期做標(biāo)志。本功能參考了網(wǎng)上一些大神的日歷控件,在此基礎(chǔ)上進(jìn)行修改,已滿足本公司的需求,現(xiàn)已完成,記錄一下。
讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:申請(qǐng)域名、網(wǎng)站空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、臨西網(wǎng)站維護(hù)、網(wǎng)站推廣。
布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" android:orientation="vertical"> <LinearLayout android:id="@+id/i8show_attention_rl" android:layout_width="match_parent" android:layout_height="60dp" android:orientation="horizontal"> <RelativeLayout android:layout_width="match_parent" android:layout_height="60dp" android:background="@color/white" android:gravity="center_vertical" android:padding="@dimen/I8d6"> <ImageView android:id="@+id/i8show_attention_back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:src="@drawable/i8live_nav_bcak" /> <TextView android:id="@+id/i8show_attention_tittle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:ellipsize="end" android:gravity="center" android:singleLine="true" android:text="我的簽到" android:textColor="@android:color/black" android:textSize="@dimen/i8_text_size_18" /> </RelativeLayout> </LinearLayout> <RelativeLayout android:id="@+id/rl_current_date" android:layout_width="match_parent" android:layout_height="49dp" android:layout_below="@id/i8show_attention_rl"> <TextView android:id="@+id/tv_sign_year_month" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="60dp" android:text="2017年11月" android:textColor="#000000" android:textSize="17sp" /> </RelativeLayout> <com.i8dayou.an.zb.userinfo.signcalendar.SignCalendar android:id="@+id/sc_main" android:layout_width="match_parent" android:layout_height="320dp" android:layout_below="@id/rl_current_date" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:layout_marginTop="15dp" android:clickable="true"></com.i8dayou.an.zb.userinfo.signcalendar.SignCalendar> <RelativeLayout android:id="@+id/rl_btn_sign" android:layout_width="135dp" android:layout_height="49dp" android:layout_centerInParent="true" android:layout_marginBottom="50dp" android:layout_alignParentBottom="true" android:background="@drawable/btn_sign_calendar" android:orientation="horizontal"> <TextView android:id="@+id/btn_sign" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:text="簽 到" android:textColor="#fff" android:textSize="17sp" /> </RelativeLayout> <RelativeLayout android:id="@+id/rl_get_gift_view" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#dd000000" android:visibility="gone" android:clickable="false"> <ImageView android:id="@+id/iv_huode" android:layout_width="229dp" android:layout_height="59dp" android:layout_centerHorizontal="true" android:layout_marginTop="120dp" android:src="@drawable/i8live_huoede" /> <RelativeLayout android:id="@+id/rl_sun" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/iv_huode" android:layout_centerHorizontal="true"> <ImageView android:id="@+id/iv_sun_bg" android:layout_width="200dp" android:layout_height="200dp" android:layout_centerInParent="true" android:src="@drawable/signed_on_rotate_bg" /> <ImageView android:id="@+id/iv_sun" android:layout_width="98dp" android:layout_height="95dp" android:layout_centerInParent="true" android:src="@drawable/i8live_sun" /> </RelativeLayout> <RelativeLayout android:id="@+id/rl_text_info" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/rl_sun" android:layout_marginTop="10dp"> <TextView android:id="@+id/tv_text_one" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:text="第一天簽到可獲得20個(gè)人氣幣,經(jīng)驗(yàn)200,免費(fèi)彈幕1次" android:textColor="#ffffff" android:textSize="13sp" /> </RelativeLayout> <RelativeLayout android:id="@+id/rl_queding_btn" android:layout_width="218dp" android:layout_height="38dp" android:layout_below="@id/rl_text_info" android:layout_centerHorizontal="true" android:layout_marginTop="19dp" android:background="@drawable/online_get_gift_btn"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="確定" android:textColor="#ffffff" android:textSize="16sp" /> </RelativeLayout> </RelativeLayout> </RelativeLayout>
主界面Activity代碼:
public class SignCalendarActivity extends Activity {
private SignCalendar calendar;
private String date;
private TextView btn_sign;
private TextView tv_sign_year_month;
private SignCalendarReq signCalendarReq;
private SignCalendarReq.DataBean dataBean;
List<String> list = new ArrayList<String>();
private int month;
private int year;
private RelativeLayout rlGetGiftData;
private TextView tvGetSunValue;
private ImageView ivSun;
private ImageView ivSunBg;
private RelativeLayout rlQuedingBtn;
private RelativeLayout rlBtnSign;
private ImageView signBack;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_calendar);
//接收傳遞過(guò)來(lái)的初始化數(shù)據(jù)
SignCalendarReq signCalendarReq = (SignCalendarReq) getIntent().getSerializableExtra("userInfos");
month = Calendar.getInstance().get(Calendar.MONTH);
year = Calendar.getInstance().get(Calendar.YEAR);
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date curDate = new Date(System.currentTimeMillis());// 獲取當(dāng)前時(shí)間
date = formatter.format(curDate);
calendar = (SignCalendar) findViewById(R.id.sc_main);
btn_sign = (TextView) findViewById(R.id.btn_sign);
tv_sign_year_month = (TextView) findViewById(R.id.tv_sign_year_month);
rlGetGiftData = (RelativeLayout) findViewById(R.id.rl_get_gift_view);
tvGetSunValue = (TextView) findViewById(R.id.tv_text_one);
ivSun = (ImageView) findViewById(R.id.iv_sun);
ivSunBg = (ImageView) findViewById(R.id.iv_sun_bg);
signBack = (ImageView) findViewById(R.id.i8show_attention_back);
rlQuedingBtn = (RelativeLayout) findViewById(R.id.rl_queding_btn);
rlBtnSign = (RelativeLayout) findViewById(R.id.rl_btn_sign);
tv_sign_year_month.setText(year + "年" + (month + 1) + "月");//設(shè)置日期
if (signCalendarReq != null) {
if (signCalendarReq.getState().getCode() == 1) {
dataBean = signCalendarReq.getData();
String signDay = dataBean.getSignDay();
String[] splitDay = signDay.split(",");
for (int i = 0; i < splitDay.length; i++) {
if (Integer.parseInt(splitDay[i]) < 10) {
list.add(year + "-" + (month + 1) + "-0" + splitDay[i]);
} else {
list.add(year + "-" + (month + 1) + "-" + splitDay[i]);
}
}
calendar.addMarks(list, 0);
if (dataBean.getIsSign() == 1) {//1是已簽到,0是未簽到
rlBtnSign.setBackgroundResource(R.drawable.btn_sign_calendar_no);
btn_sign.setText("已簽到");
rlBtnSign.setClickable(false);
} else {
rlBtnSign.setBackgroundResource(R.drawable.btn_sign_calendar);
btn_sign.setText("簽 到");
}
}
}
btn_sign.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
initSignCalendarData(2);//判斷是否簽到成功接口
}
});
rlQuedingBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
rlGetGiftData.setVisibility(View.GONE);
}
});
signBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
}
//點(diǎn)擊簽到按鈕網(wǎng)絡(luò)請(qǐng)求數(shù)據(jù)
private void initSignCalendarData(int requestType) {
Map<String, String> map = new HashMap<String, String>();
map.put("uid", I8ShowSharePre.getHomeId(getApplicationContext()));
map.put("token", I8ShowSharePre.getToken(getApplicationContext()));
map.put("type", requestType + "");
I8ShowHttpEngine.getInstance().postNotJson(I8ShowAppClient.QUERY_GET_SIGN_CALENDAR_RESULT, map, new I8ShowHttpEngine.Listener() {
@Override
public void onResponseSuccess(Object data) {
Log.i("aaa", "簽到數(shù)據(jù):" + data.toString());
IsSignSuccessReq isSignSuccessReq = new Gson().fromJson(data.toString(), IsSignSuccessReq.class);
if (isSignSuccessReq.getState().getCode() == 1) {
rlGetGiftData.setVisibility(View.VISIBLE);
rlBtnSign.setBackgroundResource(R.drawable.btn_sign_calendar_no);
btn_sign.setText("已簽到");
if (isSignSuccessReq.getData().getValueType() == 0) {//0是sun
ivSun.setImageResource(R.drawable.i8live_sun);
tvGetSunValue.setText("恭喜獲得" + isSignSuccessReq.getData().getAddValue() + "個(gè)");
I8ShowUserInfoSP.setSunValue(getApplicationContext(), isSignSuccessReq.getData().getAllValue());//保存領(lǐng)取禮物后的數(shù)據(jù)
} else if ((isSignSuccessReq.getData().getValueType() == 1)) {//1是zuan
ivSun.setImageResource(R.drawable.i8live_zuan_sign);
tvGetSunValue.setText("恭喜獲得" + isSignSuccessReq.getData().getAddValue() + "個(gè)");
I8SP.setDiamonds(getApplicationContext(), isSignSuccessReq.getData().getAllValue());
}
Animation operatingAnim = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.rotate_anim_online_gift);
LinearInterpolator lin = new LinearInterpolator();
operatingAnim.setInterpolator(lin);
ivSunBg.startAnimation(operatingAnim);
//list.add("2017-11-18");
list.add(date);
// calendar.setCalendarDaysBgColor(list,R.drawable.bg_sign_today);
calendar.addMarks(list, 0);
}
}
@Override
public void onResponseFailed(String failedMsg) {
Log.i("aaa", "簽到數(shù)據(jù):" + failedMsg);
}
});
}
}日歷自定義控件代碼:
public class SignCalendar extends ViewFlipper implements GestureDetector.OnGestureListener {
public static final int COLOR_BG_WEEK_TITLE = Color.parseColor("#FF5959"); // 星期標(biāo)題背景顏色
public static final int COLOR_TX_WEEK_TITLE = Color.parseColor("#FFFFFF"); // 星期標(biāo)題文字顏色
public static final int BEFORE_TODAY_BACKGROUND = Color.parseColor("#FFE4E4E4"); // 星期標(biāo)題文字顏色
public static final int COLOR_TX_THIS_MONTH_DAY = Color.parseColor("#000000"); // 當(dāng)前月日歷數(shù)字顏色
public static final int COLOR_TX_OTHER_MONTH_DAY = Color.parseColor("#ff999999"); // 其他月日歷數(shù)字顏色
public static final int COLOR_TX_THIS_DAY = Color.parseColor("#00ff00"); // 當(dāng)天日歷數(shù)字顏色
public static final int COLOR_BG_THIS_DAY = Color.parseColor("#ffcccccc"); // 當(dāng)天日歷背景顏色
public static final int COLOR_BG_CALENDAR = Color.parseColor("#FFFFFF"); // 日歷背景色
private GestureDetector gd; // 手勢(shì)監(jiān)聽(tīng)器
private Animation push_left_in; // 動(dòng)畫(huà)-左進(jìn)
private Animation push_left_out; // 動(dòng)畫(huà)-左出
private Animation push_right_in; // 動(dòng)畫(huà)-右進(jìn)
private Animation push_right_out; // 動(dòng)畫(huà)-右出
private int ROWS_TOTAL = 6; // 日歷的行數(shù)
private int COLS_TOTAL = 7; // 日歷的列數(shù)
private String[][] dates = new String[6][7]; // 當(dāng)前日歷日期
private float tb;
private OnCalendarClickListener onCalendarClickListener; // 日歷翻頁(yè)回調(diào)
private OnCalendarDateChangedListener onCalendarDateChangedListener; // 日歷點(diǎn)擊回調(diào)
private String[] weekday = new String[] { "日", "一", "二", "三", "四", "五", "六" }; // 星期標(biāo)題
private int calendarYear; // 日歷年份
private int calendarMonth; // 日歷月份
private Date thisday = new Date(); // 今天
private Date calendarday; // 日歷這個(gè)月第一天(1號(hào))
private LinearLayout firstCalendar; // 第一個(gè)日歷
private LinearLayout secondCalendar; // 第二個(gè)日歷
private LinearLayout currentCalendar; // 當(dāng)前顯示的日歷
private Map<String, Integer> marksMap = new HashMap<String, Integer>(); // 儲(chǔ)存某個(gè)日子被標(biāo)注(Integer
// 為bitmap
// res
// id)
private Map<String, Integer> dayBgColorMap = new HashMap<String, Integer>(); // 儲(chǔ)存某個(gè)日子的背景色
public SignCalendar(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public SignCalendar(Context context) {
super(context);
init();
}
private void init() {
setBackgroundColor(COLOR_BG_CALENDAR);
// 實(shí)例化收拾監(jiān)聽(tīng)器
gd = new GestureDetector(this.getContext(), this);
// 初始化日歷翻動(dòng)動(dòng)畫(huà)
push_left_in = AnimationUtils.loadAnimation(getContext(), R.anim.anim_slice_in_left);
push_left_out = AnimationUtils.loadAnimation(getContext(), R.anim.anim_slice_out_left);
push_right_in = AnimationUtils.loadAnimation(getContext(), R.anim.anim_slice_in_right);
push_right_out = AnimationUtils.loadAnimation(getContext(), R.anim.anim_slice_out_right);
// 初始化第一個(gè)日歷
firstCalendar = new LinearLayout(getContext());
firstCalendar.setOrientation(LinearLayout.VERTICAL);
firstCalendar.setLayoutParams(new LinearLayout.LayoutParams(-1, -1));
// 初始化第二個(gè)日歷
secondCalendar = new LinearLayout(getContext());
secondCalendar.setOrientation(LinearLayout.VERTICAL);
secondCalendar.setLayoutParams(new LinearLayout.LayoutParams(-1, -1));
// 設(shè)置默認(rèn)日歷為第一個(gè)日歷
currentCalendar = firstCalendar;
// 加入ViewFlipper
addView(firstCalendar);
addView(secondCalendar);
// 繪制線條框架
drawFrame(firstCalendar);
drawFrame(secondCalendar);
// 設(shè)置日歷上的日子(1號(hào))
calendarYear = thisday.getYear() + 1900;
calendarMonth = thisday.getMonth();
calendarday = new Date(calendarYear - 1900, calendarMonth, 1);
// 填充展示日歷
setCalendarDate();
}
private void drawFrame(LinearLayout oneCalendar) {
// 添加周末線性布局
LinearLayout title = new LinearLayout(getContext());
title.setBackgroundColor(COLOR_BG_WEEK_TITLE);
title.setOrientation(LinearLayout.HORIZONTAL);
LinearLayout.LayoutParams layout = new LinearLayout.LayoutParams(MarginLayoutParams.MATCH_PARENT,
MarginLayoutParams.WRAP_CONTENT, 0.5f);
Resources res = getResources();
tb = res.getDimension(R.dimen.activity_horizontal_margin);
// layout.setMargins(0, 0, 0, (int) (tb * 1.2));
title.setLayoutParams(layout);
oneCalendar.addView(title);
// 添加周末TextView
for (int i = 0; i < COLS_TOTAL; i++) {
TextView view = new TextView(getContext());
view.setGravity(Gravity.CENTER);
view.setPadding(0, 10, 0, 10);
view.setText(weekday[i]);
view.setTextColor(Color.WHITE);
view.setLayoutParams(new LinearLayout.LayoutParams(0, -1, 1));
title.addView(view);
}
// 添加日期布局
LinearLayout content = new LinearLayout(getContext());
content.setOrientation(LinearLayout.VERTICAL);
content.setLayoutParams(new LinearLayout.LayoutParams(-1, 0, 7f));
oneCalendar.addView(content);
// 添加日期TextView
for (int i = 0; i < ROWS_TOTAL; i++) {
LinearLayout row = new LinearLayout(getContext());
row.setOrientation(LinearLayout.HORIZONTAL);
row.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 0, 1));
content.addView(row);
// 繪制日歷上的列
for (int j = 0; j < COLS_TOTAL; j++) {
RelativeLayout col = new RelativeLayout(getContext());
col.setLayoutParams(new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, 1));
//col.setBackgroundResource(R.drawable.bg);
// col.setBackgroundResource(R.drawable.sign_dialog_day_bg);
col.setClickable(false);
row.addView(col); // 給每一個(gè)日子加上監(jiān)聽(tīng)
col.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ViewGroup parent = (ViewGroup) v.getParent();
int row = 0, col = 0;
// 獲取列坐標(biāo)
for (int i = 0; i < parent.getChildCount(); i++) {
if (v.equals(parent.getChildAt(i))) {
col = i;
break;
}
}
// 獲取行坐標(biāo)
ViewGroup pparent = (ViewGroup) parent.getParent();
for (int i = 0; i < pparent.getChildCount(); i++) {
if (parent.equals(pparent.getChildAt(i))) {
row = i;
break;
}
}
if (onCalendarClickListener != null) {
onCalendarClickListener.onCalendarClick(row, col, dates[row][col]);
}
}
});
}
}
}
/**
* 填充日歷(包含日期、標(biāo)記、背景等)
*/
private void setCalendarDate() {
// 根據(jù)日歷的日子獲取這一天是星期幾
int weekday = calendarday.getDay();
// 每個(gè)月第一天
int firstDay = 1;
// 每個(gè)月中間號(hào),根據(jù)循環(huán)會(huì)自動(dòng)++
int day = firstDay;
// 每個(gè)月的最后一天
int lastDay = getDateNum(calendarday.getYear(), calendarday.getMonth());
// 下個(gè)月第一天
int nextMonthDay = 1;
int lastMonthDay = 1;
// 填充每一個(gè)空格
for (int i = 0; i < ROWS_TOTAL; i++) {
for (int j = 0; j < COLS_TOTAL; j++) {
// 這個(gè)月第一天不是禮拜天,則需要繪制上個(gè)月的剩余幾天
if (i == 0 && j == 0 && weekday != 0) {
int year = 0;
int month = 0;
int lastMonthDays = 0;
// 如果這個(gè)月是1月,上一個(gè)月就是去年的12月
if (calendarday.getMonth() == 0) {
year = calendarday.getYear() - 1;
month = Calendar.DECEMBER;
} else {
year = calendarday.getYear();
month = calendarday.getMonth() - 1;
}
// 上個(gè)月的最后一天是幾號(hào)
lastMonthDays = getDateNum(year, month);
// 第一個(gè)格子展示的是幾號(hào)
int firstShowDay = lastMonthDays - weekday + 1;
// 上月
for (int k = 0; k < weekday; k++) {
lastMonthDay = firstShowDay + k;
RelativeLayout group = getDateView(0, k);
group.setGravity(Gravity.TOP);
TextView view = null;
if (group.getChildCount() > 0) {
view = (TextView) group.getChildAt(0);
} else {
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(-1, -1);
view = new TextView(getContext());
view.setLayoutParams(params);
view.setGravity(Gravity.CENTER);
group.addView(view);
}
view.setText(Integer.toString(lastMonthDay));
view.setTextColor(COLOR_TX_OTHER_MONTH_DAY);
dates[0][k] = format(new Date(year, month, lastMonthDay));
// 設(shè)置日期背景色
if (dayBgColorMap.get(dates[0][k]) != null) {
view.setBackgroundResource(dayBgColorMap.get(dates[0][k]));
} else {
view.setBackgroundColor(Color.TRANSPARENT);
}
// 設(shè)置標(biāo)記
setMarker(group, 0, k);
}
j = weekday - 1;
// 這個(gè)月第一天是禮拜天,不用繪制上個(gè)月的日期,直接繪制這個(gè)月的日期
} else {
RelativeLayout group = getDateView(i, j);
group.setGravity(Gravity.TOP);
TextView view = null;
if (group.getChildCount() > 0) {
view = (TextView) group.getChildAt(0);
} else {
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(-1, -1);
view = new TextView(getContext());
view.setLayoutParams(params);
view.setGravity(Gravity.CENTER);
group.addView(view);
}
// 本月
if (day <= lastDay) {
dates[i][j] = format(new Date(calendarday.getYear(), calendarday.getMonth(), day));
view.setText(Integer.toString(day));
// 當(dāng)天
if (thisday.getDate() == day && thisday.getMonth() == calendarday.getMonth()
&& thisday.getYear() == calendarday.getYear()) {
// view.setText("今天");
view.setTextColor(COLOR_TX_THIS_DAY);
// view.setBackgroundResource(R.drawable.bg_sign_today);
} else if (thisday.getMonth() == calendarday.getMonth()
&& thisday.getYear() == calendarday.getYear()) {
// 繪制本月的顏色
view.setTextColor(COLOR_TX_THIS_MONTH_DAY);
} else {
// 其他日期
view.setTextColor(COLOR_TX_OTHER_MONTH_DAY);
}
// 上面首先設(shè)置了一下默認(rèn)的"當(dāng)天"背景色,當(dāng)有特殊需求時(shí),才給當(dāng)日填充背景色
// 設(shè)置日期背景色
if (dayBgColorMap.get(dates[i][j]) != null) {
// view.setTextColor(Color.WHITE);
// view.setBackgroundResource(dayBgColorMap.get(dates[i][j]));
}
// 設(shè)置標(biāo)記
setMarker(group, i, j);
day++;
// 下個(gè)月
} else {
if (calendarday.getMonth() == Calendar.DECEMBER) {
dates[i][j] = format(new Date(calendarday.getYear() + 1, Calendar.JANUARY, nextMonthDay));
} else {
dates[i][j] = format(
new Date(calendarday.getYear(), calendarday.getMonth() + 1, nextMonthDay));
}
view.setText(Integer.toString(nextMonthDay));
view.setTextColor(COLOR_TX_OTHER_MONTH_DAY);
// 設(shè)置日期背景色
if (dayBgColorMap.get(dates[i][j]) != null) {
// view.setBackgroundResource(dayBgColorMap
// .get(dates[i][j]));
} else {
view.setBackgroundColor(Color.TRANSPARENT);
}
// 設(shè)置標(biāo)記
setMarker(group, i, j);
nextMonthDay++;
}
}
}
}
}
/**
* onClick接口回調(diào)
*/
public interface OnCalendarClickListener {
void onCalendarClick(int row, int col, String dateFormat);
}
/**
* ondateChange接口回調(diào)
*/
public interface OnCalendarDateChangedListener {
void onCalendarDateChanged(int year, int month);
}
/**
* 根據(jù)具體的某年某月,展示一個(gè)日歷
*
* @param year
* @param month
*/
public void showCalendar(int year, int month) {
calendarYear = year;
calendarMonth = month - 1;
calendarday = new Date(calendarYear - 1900, calendarMonth, 1);
setCalendarDate();
}
/**
* 根據(jù)當(dāng)前月,展示一個(gè)日歷
*
*/
public void showCalendar() {
Date now = new Date();
calendarYear = now.getYear() + 1900;
calendarMonth = now.getMonth();
calendarday = new Date(calendarYear - 1900, calendarMonth, 1);
setCalendarDate();
}
/**
* 下一月日歷
*/
public synchronized void nextMonth() {
// 改變?nèi)諝v上下順序
if (currentCalendar == firstCalendar) {
currentCalendar = secondCalendar;
} else {
currentCalendar = firstCalendar;
}
// 設(shè)置動(dòng)畫(huà)
setInAnimation(push_left_in);
setOutAnimation(push_left_out);
// 改變?nèi)諝v日期
if (calendarMonth == Calendar.DECEMBER) {
calendarYear++;
calendarMonth = Calendar.JANUARY;
} else {
calendarMonth++;
}
calendarday = new Date(calendarYear - 1900, calendarMonth, 1);
// 填充日歷
setCalendarDate();
// 下翻到下一月
showNext();
// 回調(diào)
if (onCalendarDateChangedListener != null) {
onCalendarDateChangedListener.onCalendarDateChanged(calendarYear, calendarMonth + 1);
}
}
/**
* 上一月日歷
*/
public synchronized void lastMonth() {
if (currentCalendar == firstCalendar) {
currentCalendar = secondCalendar;
} else {
currentCalendar = firstCalendar;
}
setInAnimation(push_right_in);
setOutAnimation(push_right_out);
if (calendarMonth == Calendar.JANUARY) {
calendarYear--;
calendarMonth = Calendar.DECEMBER;
} else {
calendarMonth--;
}
calendarday = new Date(calendarYear - 1900, calendarMonth, 1);
setCalendarDate();
showPrevious();
if (onCalendarDateChangedListener != null) {
onCalendarDateChangedListener.onCalendarDateChanged(calendarYear, calendarMonth + 1);
}
}
/**
* 獲取日歷當(dāng)前年份
*/
public int getCalendarYear() {
return calendarday.getYear() + 1900;
}
/**
* 獲取日歷當(dāng)前月份
*/
public int getCalendarMonth() {
return calendarday.getMonth() + 1;
}
/**
* 在日歷上做一個(gè)標(biāo)記
*
* @param date
* 日期
* @param id
* bitmap res id
*/
public void addMark(Date date, int id) {
addMark(format(date), id);
}
/**
* 在日歷上做一個(gè)標(biāo)記
*
* @param date
* 日期
* @param id
* bitmap res id
*/
public void addMark(String date, int id) {
marksMap.put(date, id);
setCalendarDate();
}
/**
* 在日歷上做一組標(biāo)記
*
* @param date
* 日期
* @param id
* bitmap res id
*/
public void addMarks(Date[] date, int id) {
for (int i = 0; i < date.length; i++) {
marksMap.put(format(date[i]), id);
}
setCalendarDate();
}
/**
* 在日歷上做一組標(biāo)記
*
* @param date
* 日期
* @param id
* bitmap res id
*/
public void addMarks(List<String> date, int id) {
for (int i = 0; i < date.size(); i++) {
marksMap.put(date.get(i), id);
}
setCalendarDate();
}
/**
* 移除日歷上的標(biāo)記
*/
public void removeMark(Date date) {
removeMark(format(date));
}
/**
* 移除日歷上的標(biāo)記
*/
public void removeMark(String date) {
marksMap.remove(date);
setCalendarDate();
}
/**
* 移除日歷上的所有標(biāo)記
*/
public void removeAllMarks() {
marksMap.clear();
setCalendarDate();
}
/**
* 設(shè)置日歷具體某個(gè)日期的背景色
*
* @param date
* @param color
*/
public void setCalendarDayBgColor(Date date, int color) {
setCalendarDayBgColor(format(date), color);
}
/**
* 設(shè)置日歷具體某個(gè)日期的背景色
*
* @param date
* @param color
*/
public void setCalendarDayBgColor(String date, int color) {
dayBgColorMap.put(date, color);
setCalendarDate();
}
/**
* 設(shè)置日歷一組日期的背景色
*
* @param date
* @param color
*/
public void setCalendarDaysBgColor(List<String> date, int color) {
for (int i = 0; i < date.size(); i++) {
dayBgColorMap.put(date.get(i), color);
}
setCalendarDate();
}
/**
* 設(shè)置日歷一組日期的背景色
*
* @param date
* @param color
*/
public void setCalendarDayBgColor(String[] date, int color) {
for (int i = 0; i < date.length; i++) {
dayBgColorMap.put(date[i], color);
}
setCalendarDate();
}
/**
* 移除日歷具體某個(gè)日期的背景色
*
* @param date
*/
public void removeCalendarDayBgColor(Date date) {
removeCalendarDayBgColor(format(date));
}
/**
* 移除日歷具體某個(gè)日期的背景色
*
* @param date
*/
public void removeCalendarDayBgColor(String date) {
dayBgColorMap.remove(date);
setCalendarDate();
}
/**
* 移除日歷具體某個(gè)日期的背景色
*
*/
public void removeAllBgColor() {
dayBgColorMap.clear();
setCalendarDate();
}
/**
* 根據(jù)行列號(hào)獲得包裝每一個(gè)日子的LinearLayout
*
* @param row
* @param col
* @return
*/
public String getDate(int row, int col) {
return dates[row][col];
}
/**
* 某天是否被標(biāo)記了
*
* @return
*/
public boolean hasMarked(String date) {
return marksMap.get(date) == null ? false : true;
}
/**
* 清除所有標(biāo)記以及背景
*/
public void clearAll() {
marksMap.clear();
dayBgColorMap.clear();
}
/***********************************************
* private methods
**********************************************/
// 設(shè)置標(biāo)記
private void setMarker(RelativeLayout group, int i, int j) {
int childCount = group.getChildCount();
// dates[i][j]=2015-12-20等為要對(duì)比的日期,marksMap中包括了dates[i][j]時(shí)就進(jìn)入下面的if語(yǔ)句
if (marksMap.get(dates[i][j]) != null) {
if (childCount < 2) {
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams((int) (tb * 2), (int) (tb * 2));
// params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
// params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
params.setMargins(0, 0, 1, 1);
params.addRule(RelativeLayout.CENTER_IN_PARENT);
ImageView markView = new ImageView(getContext());
markView.setImageResource(marksMap.get(dates[i][j]));
markView.setLayoutParams(params);
//標(biāo)記圖片 可自定義
//markView.setBackgroundResource(R.drawable.calendar_bg_tag);
markView.setBackgroundResource(R.drawable.i8live_signin);
group.addView(markView);
}
} else {
if (childCount > 1) {
group.removeView(group.getChildAt(1));
}
}
}
/**
* 計(jì)算某年某月有多少天
*
* @param year
* @param month
* @return
*/
private int getDateNum(int year, int month) {
Calendar time = Calendar.getInstance();
time.clear();
time.set(Calendar.YEAR, year + 1900);
time.set(Calendar.MONTH, month);
return time.getActualMaximum(Calendar.DAY_OF_MONTH);
}
/**
* 根據(jù)行列號(hào)獲得包裝每一個(gè)日子的LinearLayout
*
* @param row
* @param col
* @return
*/
private RelativeLayout getDateView(int row, int col) {
return (RelativeLayout) ((LinearLayout) ((LinearLayout) currentCalendar.getChildAt(1)).getChildAt(row))
.getChildAt(col);
}
/**
* 將Date轉(zhuǎn)化成字符串->2013-3-3
*/
private String format(Date d) {
return addZero(d.getYear() + 1900, 4) + "-" + addZero(d.getMonth() + 1, 2) + "-" + addZero(d.getDate(), 2);
}
// 2或4
private static String addZero(int i, int count) {
if (count == 2) {
if (i < 10) {
return "0" + i;
}
} else if (count == 4) {
if (i < 10) {
return "000" + i;
} else if (i < 100 && i > 10) {
return "00" + i;
} else if (i < 1000 && i > 100) {
return "0" + i;
}
}
return "" + i;
}
/***********************************************
* Override methods
**********************************************/
public boolean dispatchTouchEvent(MotionEvent ev) {
if (gd != null) {
if (gd.onTouchEvent(ev))
return true;
}
return super.dispatchTouchEvent(ev);
}
public boolean onTouchEvent(MotionEvent event) {
return this.gd.onTouchEvent(event);
}
public boolean onDown(MotionEvent e) {
return false;
}
public void onShowPress(MotionEvent e) {
}
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
// 向左/上滑動(dòng)
if (e1.getX() - e2.getX() > 20) {
// nextMonth();
}
// 向右/下滑動(dòng)
else if (e1.getX() - e2.getX() < -20) {
// lastMonth();
}
return false;
}
/***********************************************
* get/set methods
**********************************************/
public OnCalendarClickListener getOnCalendarClickListener() {
return onCalendarClickListener;
}
public void setOnCalendarClickListener(OnCalendarClickListener onCalendarClickListener) {
this.onCalendarClickListener = onCalendarClickListener;
}
public OnCalendarDateChangedListener getOnCalendarDateChangedListener() {
return onCalendarDateChangedListener;
}
public void setOnCalendarDateChangedListener(OnCalendarDateChangedListener onCalendarDateChangedListener) {
this.onCalendarDateChangedListener = onCalendarDateChangedListener;
}
public Date getThisday() {
return thisday;
}
public void setThisday(Date thisday) {
this.thisday = thisday;
}
public Map<String, Integer> getDayBgColorMap() {
return dayBgColorMap;
}
public void setDayBgColorMap(Map<String, Integer> dayBgColorMap) {
this.dayBgColorMap = dayBgColorMap;
}
}
運(yùn)行的效果圖:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
網(wǎng)站名稱:Android可簽到日歷控件的實(shí)現(xiàn)方法
標(biāo)題URL:http://chinadenli.net/article12/iijodc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、Google、關(guān)鍵詞優(yōu)化、定制開(kāi)發(fā)、全網(wǎng)營(yíng)銷推廣、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)