日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

小米日历详解

發布時間:2023/12/20 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 小米日历详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.



??? 今天? 我們來解釋一下 如圖所示日歷是怎么構建的

?? well? 首先 我們要了解? 圖上日歷其實是自定義Dateview的一種,所以我們要了解它需要些什么 參考 http://blog.csdn.net/mr_dsw/article/details/48755993

? 我們需要實現:
???????????? (1)視圖周一到周六

???????????? (2)視圖陰農歷轉換

???????????? (3)視圖日期

???????????? (4)事務圓圈

???????????? (5)主界面分層

???????????? (6)對選中日期進行點擊事件的處理。???

?? ?? 接下來 通過發現我們需要一個myLibrary類庫,方便程序的再利用,好不多說上類庫代碼:


??????

1.CaledarAdapter package com.codbking.calendar;import android.view.View; import android.view.ViewGroup;import com.codbking.calendar.CalendarBean;/*** Created by codbking on 2016/12/22.* email:codbking@gmail.com* github:https://github.com/codbking* blog:http://www.jianshu.com/users/49d47538a2dd/latest_articles*/public interface CaledarAdapter {View getView(View convertView, ViewGroup parentView, CalendarBean bean); } 2.CaledarTopViewChangeListener package com.codbking.calendar;/*** Created by codbking on 2016/12/23.* email:codbking@gmail.com* github:https://github.com/codbking* blog:http://www.jianshu.com/users/49d47538a2dd/latest_articles*/public interface CaledarTopViewChangeListener {void onLayoutChange(CalendarTopView topView); }
CalendarBean package com.codbking.calendar;public class CalendarBean {public int year;public int moth;public int day;public int week;//-1,0,1public int mothFlag;//顯示public String chinaMonth;public String chinaDay;public CalendarBean(int year, int moth, int day) {this.year = year;this.moth = moth;this.day = day;}public String getDisplayWeek(){String s="";switch(week){case 1:s="星期日";break;case 2:s="星期一";break;case 3:s="星期二";break;case 4:s="星期三";break;case 5:s="星期四";break;case 6:s="星期五";break;case 7:s="星期六";break;}return s ;}@Overridepublic String toString() { // String s=year+"/"+moth+"/"+day+"\t"+getDisplayWeek()+"\t農歷"+":"+chinaMonth+"/"+chinaDay;String s=year+"/"+moth+"/"+day;return s;} } 4.CalendarDateView package com.codbking.calendar;import android.content.Context; import android.content.res.TypedArray; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup;import java.util.Date; import java.util.HashMap; import java.util.LinkedList;import static com.codbking.calendar.CalendarFactory.getMonthOfDayList;/*** Created by codbking on 2016/12/18.* email:codbking@gmail.com* github:https://github.com/codbking* blog:http://www.jianshu.com/users/49d47538a2dd/latest_articles*/public class CalendarDateView extends ViewPager implements CalendarTopView {HashMap<Integer, CalendarView> views = new HashMap<>();private CaledarTopViewChangeListener mCaledarLayoutChangeListener;private CalendarView.OnItemClickListener onItemClickListener;private LinkedList<CalendarView> cache = new LinkedList();private int MAXCOUNT=6;private int row = 6;private CaledarAdapter mAdapter;private int calendarItemHeight = 0;public void setAdapter(CaledarAdapter adapter) {mAdapter = adapter;initData();}public void setOnItemClickListener(CalendarView.OnItemClickListener onItemClickListener) {this.onItemClickListener = onItemClickListener;}public CalendarDateView(Context context, AttributeSet attrs) {super(context, attrs);TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CalendarDateView);row = a.getInteger(R.styleable.CalendarDateView_cbd_calendar_row, 6);a.recycle();init();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int calendarHeight = 0;if (getAdapter() != null) {CalendarView view = (CalendarView) getChildAt(0);if (view != null) {calendarHeight = view.getMeasuredHeight();calendarItemHeight = view.getItemHeight();}}setMeasuredDimension(widthMeasureSpec, MeasureSpec.makeMeasureSpec(calendarHeight, MeasureSpec.EXACTLY));}private void init() {final int[] dateArr= CalendarUtil.getYMD(new Date());setAdapter(new PagerAdapter() {@Overridepublic int getCount() {return Integer.MAX_VALUE;}@Overridepublic boolean isViewFromObject(View view, Object object) {return view == object;}@Overridepublic Object instantiateItem(ViewGroup container, final int position) {CalendarView view;if (!cache.isEmpty()) {view = cache.removeFirst();} else {view = new CalendarView(container.getContext(), row);}view.setOnItemClickListener(onItemClickListener);view.setAdapter(mAdapter);view.setData(getMonthOfDayList(dateArr[0],dateArr[1]+position-Integer.MAX_VALUE/2),position==Integer.MAX_VALUE/2);container.addView(view);views.put(position, view);return view;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {container.removeView((View) object);cache.addLast((CalendarView) object);views.remove(position);}});addOnPageChangeListener(new SimpleOnPageChangeListener() {@Overridepublic void onPageSelected(int position) {super.onPageSelected(position);if (onItemClickListener != null) {CalendarView view = views.get(position);Object[] obs = view.getSelect();onItemClickListener.onItemClick((View) obs[0], (int) obs[1], (CalendarBean) obs[2]);}mCaledarLayoutChangeListener.onLayoutChange(CalendarDateView.this);}});}private void initData() {setCurrentItem(Integer.MAX_VALUE/2, false);getAdapter().notifyDataSetChanged();}@Overridepublic int[] getCurrentSelectPositon() {CalendarView view = views.get(getCurrentItem());if (view == null) {view = (CalendarView) getChildAt(0);}if (view != null) {return view.getSelectPostion();}return new int[4];}@Overridepublic int getItemHeight() {return calendarItemHeight;}@Overridepublic void setCaledarTopViewChangeListener(CaledarTopViewChangeListener listener) {mCaledarLayoutChangeListener = listener;}} 5.CalendarFactory import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.HashMap; import java.util.List;import static android.R.attr.listDivider; import static android.R.attr.max; import static android.R.attr.y; import static android.R.id.list; import static com.codbking.calendar.CalendarUtil.getDayOfWeek;/*** Created by codbking on 2016/12/16.*/public class CalendarFactory {private static HashMap<String, List<CalendarBean>> cache = new HashMap<>();//獲取一月中的集合public static List<CalendarBean> getMonthOfDayList(int y, int m) {String key=y+""+m;if(cache.containsKey(key)){List<CalendarBean> list=cache.get(key);if(list==null){cache.remove(key);}else{return list;}}List<CalendarBean> list = new ArrayList<CalendarBean>();cache.put(key,list);//計算出一月第一天是星期幾int fweek = getDayOfWeek(y, m, 1);int total = CalendarUtil.getDayOfMaonth(y, m);//根據星期推出前面還有幾個顯示for (int i = fweek - 1; i > 0; i--) {CalendarBean bean = geCalendarBean(y, m, 1 - i);bean.mothFlag = -1;list.add(bean);}//獲取當月的天數for (int i = 0; i < total; i++) {CalendarBean bean = geCalendarBean(y, m, i + 1);list.add(bean);}//為了塞滿42個格子,顯示多出當月的天數for (int i = 0; i < 42 - (fweek - 1) - total; i++) {CalendarBean bean = geCalendarBean(y, m, total + i + 1);bean.mothFlag = 1;list.add(bean);}return list;}public static CalendarBean geCalendarBean(int year, int month, int day) {Calendar calendar = Calendar.getInstance();calendar.set(year, month - 1, day);year = calendar.get(Calendar.YEAR);month = calendar.get(Calendar.MONTH) + 1;day = calendar.get(Calendar.DATE);CalendarBean bean = new CalendarBean(year, month, day);bean.week = CalendarUtil.getDayOfWeek(year, month, day);String[] chinaDate = ChinaDate.getChinaDate(year, month, day);bean.chinaMonth = chinaDate[0];bean.chinaDay = chinaDate[1];return bean;}public static void main(String[] args) {}} 6.CalendarLayout

package com.codbking.calendar;import android.content.Context; import android.graphics.Rect; import android.support.v4.view.VelocityTrackerCompat; import android.support.v4.view.ViewCompat; import android.support.v4.widget.ScrollerCompat; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; import android.view.ViewConfiguration; import android.view.ViewGroup; import android.view.animation.Interpolator; import android.widget.AbsListView; import android.widget.FrameLayout; import android.widget.ListView;/*** Created by codbking on 2016/12/18.* email:codbking@gmail.com* github:https://github.com/codbking* blog:http://www.jianshu.com/users/49d47538a2dd/latest_articles*/public class CalendarLayout extends FrameLayout {private static final String TAG = "CalendarLayout";private View view1;private ViewGroup view2;private CalendarTopView mTopView;//展開public static final int TYPE_OPEN = 0;//折疊public static final int TYPE_FOLD = 1;public int type = TYPE_FOLD;//是否處于滑動中private boolean isSilde = false;private int topHeigth;private int itemHeight;private int bottomViewTopHeight;private int maxDistance;private ScrollerCompat mScroller;private float mMaxVelocity;private float mMinVelocity;private int activitPotionerId;private static final Interpolator sInterpolator = new Interpolator() {@Overridepublic float getInterpolation(float t) {t -= 1.0f;return t * t * t * t * t + 1.0f;}};public CalendarLayout(Context context) {super(context);init();}public CalendarLayout(Context context, AttributeSet attrs) {super(context, attrs);init();}@Overrideprotected void onFinishInflate() {super.onFinishInflate();final CalendarTopView viewPager = (CalendarTopView) getChildAt(0);mTopView = viewPager;view1 = (View) viewPager;view2 = (ViewGroup) getChildAt(1);mTopView.setCaledarTopViewChangeListener(new CaledarTopViewChangeListener() {@Overridepublic void onLayoutChange(CalendarTopView topView) {CalendarLayout.this.requestLayout();}});}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);itemHeight=mTopView.getItemHeight();topHeigth=view1.getMeasuredHeight();maxDistance = topHeigth - itemHeight;switch (type) {case TYPE_FOLD:bottomViewTopHeight = itemHeight;break;case TYPE_OPEN:bottomViewTopHeight = topHeigth;break;}view2.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec) - mTopView.getItemHeight(), MeasureSpec.EXACTLY));}@Overrideprotected void onLayout(boolean changed, int left, int top, int right, int bottom) {super.onLayout(changed, left, top, right, bottom);view2.offsetTopAndBottom(bottomViewTopHeight);int [] selectRct=getSelectRect();if(type==TYPE_FOLD){view1.offsetTopAndBottom(-selectRct[1]);}}private void init() {final ViewConfiguration vc = ViewConfiguration.get(getContext());mMaxVelocity = vc.getScaledMaximumFlingVelocity();mMinVelocity = vc.getScaledMinimumFlingVelocity();mScroller = ScrollerCompat.create(getContext(), sInterpolator);}float oy, ox;boolean isClickBtottomView = false;@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) { // mViewDragHelper.shouldInterceptTouchEvent(ev);boolean isflag = false;//上下運動進行攔截switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:oy = ev.getY();ox = ev.getX();isClickBtottomView = isClickView(view2, ev);cancel();activitPotionerId = ev.getPointerId(0);int top = view2.getTop();if (top < topHeigth) {type = TYPE_FOLD;} else {type = TYPE_OPEN;}break;case MotionEvent.ACTION_MOVE:float y = ev.getY();float x = ev.getX();float xdiff = x - ox;float ydiff = y - oy;if (Math.abs(ydiff) > 5 && Math.abs(ydiff) > Math.abs(xdiff)) {isflag = true;if (isClickBtottomView) {boolean isScroll = isScroll(view2);if (ydiff > 0) {//向下if (type == TYPE_OPEN) {return super.onInterceptTouchEvent(ev);} else {if (isScroll) {return super.onInterceptTouchEvent(ev);}}} else {//向上if (type == TYPE_FOLD) {return super.onInterceptTouchEvent(ev);} else {if (isScroll) {return super.onInterceptTouchEvent(ev);}}}}}ox = x;oy = y;break;case MotionEvent.ACTION_UP:break;}return isSilde || isflag || super.onInterceptTouchEvent(ev);}private boolean isScroll(ViewGroup view2) {View fistChildView = view2.getChildAt(0);if (fistChildView == null) {return false;}if (view2 instanceof ListView) {AbsListView list = (AbsListView) view2;if (fistChildView.getTop() != 0) {return true;} else {if (list.getPositionForView(fistChildView) != 0) {return true;}}}return false;}public boolean isClickView(View view, MotionEvent ev) {Rect rect = new Rect();view.getHitRect(rect);boolean isClick = rect.contains((int) ev.getX(), (int) ev.getY());Log.d(TAG, "isClickView() called with: isClick = [" + isClick + "]");return isClick;}@Overridepublic boolean onTouchEvent(MotionEvent event) {processTouchEvent(event);return true;}private VelocityTracker mVelocityTracker;public void processTouchEvent(MotionEvent event) {if (mVelocityTracker == null) {mVelocityTracker = VelocityTracker.obtain();}mVelocityTracker.addMovement(event);switch (event.getAction()) {case MotionEvent.ACTION_DOWN:break;case MotionEvent.ACTION_MOVE:if (isSilde) {return;}float cy = event.getY();int dy = (int) (cy - oy);if (dy == 0) {return;}oy = cy;move(dy);break;case MotionEvent.ACTION_UP:if (isSilde) {cancel();return;}//判斷速度final int pointerId = activitPotionerId;mVelocityTracker.computeCurrentVelocity(1000, mMaxVelocity);float crrentV = VelocityTrackerCompat.getYVelocity(mVelocityTracker, pointerId);if (Math.abs(crrentV) > 2000) {if (crrentV > 0) {open();} else {flod();}cancel();return;}int top = view2.getTop() - topHeigth;int maxd = maxDistance;if (Math.abs(top) < maxd / 2) {open();} else {flod();}cancel();break;case MotionEvent.ACTION_CANCEL:cancel();break;}}public void open() {startScroll(view2.getTop(), topHeigth);}public void flod() {startScroll(view2.getTop(), topHeigth - maxDistance);}private int[] getSelectRect() {return mTopView.getCurrentSelectPositon();}private void move(int dy) {int []selectRect = getSelectRect();int itemHeight=mTopView.getItemHeight();int dy1 = getAreaValue(view1.getTop(), dy, -selectRect[1], 0);int dy2 = getAreaValue(view2.getTop() - topHeigth, dy, -(topHeigth - itemHeight), 0);if (dy1 != 0) {ViewCompat.offsetTopAndBottom(view1, dy1);}if (dy2 != 0) {ViewCompat.offsetTopAndBottom(view2, dy2);}}private int getAreaValue(int top, int dy, int minValue, int maxValue) {if (top + dy < minValue) {return minValue - top;}if (top + dy > maxValue) {return maxValue - top;}return dy;}private void startScroll(int starty, int endY) {float distance = endY - starty;float t = distance / maxDistance * 600;mScroller.startScroll(0, 0, 0, endY - starty, (int) Math.abs(t));postInvalidate();}int oldY = 0;@Overridepublic void computeScroll() {super.computeScroll();bottomViewTopHeight = view2.getTop();if (mScroller.computeScrollOffset()) {isSilde = true;int cy = mScroller.getCurrY();int dy = cy - oldY;move(dy);oldY = cy;postInvalidate();} else {oldY = 0;isSilde = false;}}public void cancel() {if (mVelocityTracker != null) {mVelocityTracker.recycle();mVelocityTracker = null;}} }

? ? 這個類主要實現滾動還有滑屏 繼承FrameLayout ??

? ? onInterceptTouchEvent監聽上下進行攔截

CalendarLayout()用來加載布局

? ? ? 布局加載完成回調onFinishInflate()方法

? ? ??重載onMeasure(),onLayout(),onDraw()三個函數構建了自定義View的外觀形象

7.CalendarUti

public class CalendarUtil {//獲取一月的第一天是星期幾public static int getDayOfWeek(int y, int m, int day) {Calendar calendar = Calendar.getInstance();calendar.set(y, m - 1, day);return calendar.get(Calendar.DAY_OF_WEEK);}//獲取一月最大天數public static int getDayOfMaonth(int y, int m) {Calendar cal = Calendar.getInstance();cal.set(y, m - 1, 1);int dateOfMonth = cal.getActualMaximum(Calendar.DATE);return dateOfMonth;}public static int getMothOfMonth(int y, int m) {Calendar cal = Calendar.getInstance();cal.set(y, m - 1, 1);int dateOfMonth = cal.get(Calendar.MONTH);return dateOfMonth + 1;}public static int[] getYMD(Date date) {Calendar cal = Calendar.getInstance();cal.setTime(date);return new int[]{cal.get(Calendar.YEAR),cal.get(Calendar.MONTH)+1,cal.get(Calendar.DATE)};}}

8.CalendarTopView package com.codbking.calendar;/*** Created by codbking on 2016/12/23.* email:codbking@gmail.com* github:https://github.com/codbking* blog:http://www.jianshu.com/users/49d47538a2dd/latest_articles*/public interface CalendarTopView {int[] getCurrentSelectPositon();int getItemHeight();void setCaledarTopViewChangeListener(CaledarTopViewChangeListener listener);} 9.CalendarView package com.codbking.calendar;import android.content.Context; import android.graphics.Canvas; import android.graphics.Rect; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.view.ViewGroup;import java.util.ArrayList; import java.util.Date; import java.util.List;/*** Created by codbking on 2016/12/18.* email:codbking@gmail.com* github:https://github.com/codbking* blog:http://www.jianshu.com/users/49d47538a2dd/latest_articles*/public class CalendarView extends ViewGroup {private static final String TAG = "CalendarView";private int selectPostion = -1;private CaledarAdapter adapter;private List<CalendarBean> data;private OnItemClickListener onItemClickListener;private int row = 6;private int column = 7;private int itemWidth;private int itemHeight;private boolean isToday;public interface OnItemClickListener {void onItemClick(View view, int postion, CalendarBean bean);}public CalendarView(Context context, int row) {super(context);this.row = row;}public void setOnItemClickListener(OnItemClickListener onItemClickListener) {this.onItemClickListener = onItemClickListener;}public int getItemHeight() {return itemHeight;}public CalendarView(Context context, AttributeSet attrs) {super(context, attrs);setWillNotDraw(false);}public void setAdapter(CaledarAdapter adapter) {this.adapter = adapter;}public void setData(List<CalendarBean> data,boolean isToday) {this.data = data;this.isToday=isToday;setItem();requestLayout();}private void setItem() {selectPostion = -1;if (adapter == null) {throw new RuntimeException("adapter is null,please setadapter");}for (int i = 0; i < data.size(); i++) {CalendarBean bean = data.get(i);View view = getChildAt(i);View chidView = adapter.getView(view, this, bean);if (view == null || view != chidView) {addViewInLayout(chidView, i, chidView.getLayoutParams(), true);}if(isToday&&selectPostion==-1){int[]date=CalendarUtil.getYMD(new Date());if(bean.year==date[0]&&bean.moth==date[1]&&bean.day==date[2]){selectPostion=i;}}else {if (selectPostion == -1 && bean.day == 1) {selectPostion = i;}}chidView.setSelected(selectPostion==i);setItemClick(chidView, i, bean);}}public Object[] getSelect(){return new Object[]{getChildAt(selectPostion),selectPostion,data.get(selectPostion)};}public void setItemClick(final View view, final int potsion, final CalendarBean bean) {view.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {if (selectPostion != -1) {getChildAt(selectPostion).setSelected(false);getChildAt(potsion).setSelected(true);}selectPostion = potsion;if (onItemClickListener != null) {onItemClickListener.onItemClick(view, potsion, bean);}}});}public int[] getSelectPostion() {Rect rect = new Rect();try {getChildAt(selectPostion).getHitRect(rect);} catch (Exception e) {e.printStackTrace();}return new int[]{rect.left, rect.top, rect.right, rect.top};}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int parentWidth = MeasureSpec.getSize(MeasureSpec.makeMeasureSpec(widthMeasureSpec, MeasureSpec.EXACTLY));itemWidth = parentWidth / column;itemHeight = itemWidth;View view = getChildAt(0);if (view == null) {return;}ViewGroup.LayoutParams params = view.getLayoutParams();if (params != null && params.height > 0) {itemHeight = params.height;}setMeasuredDimension(parentWidth, itemHeight * row);for(int i=0;i<getChildCount();i++){View childView=getChildAt(i);childView.measure(MeasureSpec.makeMeasureSpec(itemWidth, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(itemHeight, MeasureSpec.EXACTLY));}Log.i(TAG, "onMeasure() called with: itemHeight = [" + itemHeight + "], itemWidth = [" + itemWidth + "]");}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {for (int i = 0; i <getChildCount(); i++) {layoutChild(getChildAt(i), i, l, t, r, b);}}private void layoutChild(View view, int postion, int l, int t, int r, int b) {int cc = postion % column;int cr = postion / column;int itemWidth = view.getMeasuredWidth();int itemHeight = view.getMeasuredHeight();l = cc * itemWidth;t = cr * itemHeight;r = l + itemWidth;b = t + itemHeight;view.layout(l, t, r, b);} } 繼承extends 用來實現顯示網格狀的日歷內容 實現CaledarAdapter接口 CalendarBean list 用來 獲取或者說顯示日期 10.ChinaDate package com.codbking.calendar;import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.HashMap; import java.util.Locale; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar;import static android.media.CamcorderProfile.get;public class ChinaDate {private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy年M月d日 EEEEE");private final static long[] lunarInfo = new long[]{0x04bd8, 0x04ae0,0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0,0x055d2, 0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540,0x0d6a0, 0x0ada2, 0x095b0, 0x14977, 0x04970, 0x0a4b0, 0x0b4b5,0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970,0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3,0x092e0, 0x1c8d7, 0x0c950, 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0,0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, 0x06ca0,0x0b550, 0x15355, 0x04da0, 0x0a5d0, 0x14573, 0x052d0, 0x0a9a8,0x0e950, 0x06aa0, 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570,0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, 0x096d0, 0x04dd5,0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b5a0,0x195a6, 0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50,0x06d40, 0x0af46, 0x0ab60, 0x09570, 0x04af5, 0x04970, 0x064b0,0x074a3, 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0,0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7,0x025d0, 0x092d0, 0x0cab5, 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50,0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, 0x07954,0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260,0x0ea65, 0x0d530, 0x05aa0, 0x076a3, 0x096d0, 0x04bd7, 0x04ad0,0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, 0x0b5a0, 0x056d0,0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20,0x0ada0};final private static int[] year20 = new int[]{1, 4, 1, 2, 1, 2, 1, 1, 2,1, 2, 1};final private static int[] year19 = new int[]{0, 3, 0, 1, 0, 1, 0, 0, 1,0, 1, 0};final private static int[] year2000 = new int[]{0, 3, 1, 2, 1, 2, 1, 1,2, 1, 2, 1};public final static String[] nStr1 = new String[]{"", "正", "二", "三", "四","五", "六", "七", "八", "九", "十", "冬月", "臘月"};private final static String[] Gan = new String[]{"甲", "乙", "丙", "丁", "戊","己", "庚", "辛", "壬", "癸"};private final static String[] Zhi = new String[]{"子", "丑", "寅", "卯", "辰","巳", "午", "未", "申", "酉", "戌", "亥"};private final static String[] Animals = new String[]{"鼠", "牛", "虎", "兔","龍", "蛇", "馬", "羊", "猴", "雞", "狗", "豬"};private final static String[] solarTerm = new String[]{"小寒", "大寒", "立春","雨水", "驚蟄", "春分", "清明", "谷雨", "立夏", "小滿", "芒種", "夏至", "小暑", "大暑","立秋", "處暑", "白露", "秋分", "寒露", "霜降", "立冬", "小雪", "大雪", "冬至"};private final static String[] sFtv = new String[]{"0101*元旦", "0214 情人節","0308 婦女節", "0312 植樹節", "0315 消費者權益日", "0401 愚人節", "0501 勞動節","0504 青年節", "0512 護士節", "0601 兒童節", "0701 建黨節", "0801 建軍節","0808 父親節", "0909 mzd逝世紀念", "0910 教師節", "0928 孔子誕辰", "1001*國慶節","1006 老人節", "1024 聯合國日", "1112 孫中山誕辰", "1220 澳門回歸", "1225 圣誕節","1226 mzd誕辰"};private final static String[] lFtv = new String[]{"0101*農歷春節","0115 元宵節", "0505 端午節", "0707 七夕情人節", "0815 中秋節", "0909 重陽節","1208 臘八節", "1224 小年", "0100*除夕"};/*** 傳回農歷 y年的總天數** @param y* @return*/final private static int lYearDays(int y) {int i, sum = 348;for (i = 0x8000; i > 0x8; i >>= 1) {if ((lunarInfo[y - 1900] & i) != 0)sum += 1;}return (sum + leapDays(y));}/*** 傳回農歷 y年閏月的天數** @param y* @return*/final private static int leapDays(int y) {if (leapMonth(y) != 0) {if ((lunarInfo[y - 1900] & 0x10000) != 0)return 30;elsereturn 29;} elsereturn 0;}/*** 傳回農歷 y年閏哪個月 1-12 , 沒閏傳回 0** @param y* @return*/final private static int leapMonth(int y) {return (int) (lunarInfo[y - 1900] & 0xf);}/*** 傳回農歷 y年m月的總天數** @param y* @param m* @return*/final private static int monthDays(int y, int m) {if ((lunarInfo[y - 1900] & (0x10000 >> m)) == 0)return 29;elsereturn 30;}/*** 傳回農歷 y年的生肖** @param y* @return*/final public static String AnimalsYear(int y) {return Animals[(y - 4) % 12];}/*** 傳入 月日的offset 傳回干支,0=甲子** @param num* @return*/final private static String cyclicalm(int num) {return (Gan[num % 10] + Zhi[num % 12]);}/*** 傳入 offset 傳回干支, 0=甲子** @param y* @return*/final public static String cyclical(int y) {int num = y - 1900 + 36;return (cyclicalm(num));}/*** 傳出農歷.year0 .month1 .day2 .yearCyl3 .monCyl4 .dayCyl5 .isLeap6** @param y* @param m* @return*/final private long[] Lunar(int y, int m) {long[] nongDate = new long[7];int i = 0, temp = 0, leap = 0;Date baseDate = new GregorianCalendar(1900 + 1900, 1, 31).getTime();Date objDate = new GregorianCalendar(y + 1900, m, 1).getTime();long offset = (objDate.getTime() - baseDate.getTime()) / 86400000L;if (y < 2000)offset += year19[m - 1];if (y > 2000)offset += year20[m - 1];if (y == 2000)offset += year2000[m - 1];nongDate[5] = offset + 40;nongDate[4] = 14;for (i = 1900; i < 2050 && offset > 0; i++) {temp = lYearDays(i);offset -= temp;nongDate[4] += 12;}if (offset < 0) {offset += temp;i--;nongDate[4] -= 12;}nongDate[0] = i;nongDate[3] = i - 1864;leap = leapMonth(i); // 閏哪個月nongDate[6] = 0;for (i = 1; i < 13 && offset > 0; i++) {// 閏月if (leap > 0 && i == (leap + 1) && nongDate[6] == 0) {--i;nongDate[6] = 1;temp = leapDays((int) nongDate[0]);} else {temp = monthDays((int) nongDate[0], i);}// 解除閏月if (nongDate[6] == 1 && i == (leap + 1))nongDate[6] = 0;offset -= temp;if (nongDate[6] == 0)nongDate[4]++;}if (offset == 0 && leap > 0 && i == leap + 1) {if (nongDate[6] == 1) {nongDate[6] = 0;} else {nongDate[6] = 1;--i;--nongDate[4];}}if (offset < 0) {offset += temp;--i;--nongDate[4];}nongDate[1] = i;nongDate[2] = offset + 1;return nongDate;}/*** 傳出y年m月d日對應的農歷.year0 .month1 .day2 .yearCyl3 .monCyl4 .dayCyl5 .isLeap6** @param y* @param m* @param d* @return*/final public static long[] calElement(int y, int m, int d) {long[] nongDate = new long[7];int i = 0, temp = 0, leap = 0;Date baseDate = new GregorianCalendar(0 + 1900, 0, 31).getTime();Date objDate = new GregorianCalendar(y, m - 1, d).getTime();long offset = (objDate.getTime() - baseDate.getTime()) / 86400000L;nongDate[5] = offset + 40;nongDate[4] = 14;for (i = 1900; i < 2050 && offset > 0; i++) {temp = lYearDays(i);offset -= temp;nongDate[4] += 12;}if (offset < 0) {offset += temp;i--;nongDate[4] -= 12;}nongDate[0] = i;nongDate[3] = i - 1864;leap = leapMonth(i); // 閏哪個月nongDate[6] = 0;for (i = 1; i < 13 && offset > 0; i++) {// 閏月if (leap > 0 && i == (leap + 1) && nongDate[6] == 0) {--i;nongDate[6] = 1;temp = leapDays((int) nongDate[0]);} else {temp = monthDays((int) nongDate[0], i);}// 解除閏月if (nongDate[6] == 1 && i == (leap + 1))nongDate[6] = 0;offset -= temp;if (nongDate[6] == 0)nongDate[4]++;}if (offset == 0 && leap > 0 && i == leap + 1) {if (nongDate[6] == 1) {nongDate[6] = 0;} else {nongDate[6] = 1;--i;--nongDate[4];}}if (offset < 0) {offset += temp;--i;--nongDate[4];}nongDate[1] = i;nongDate[2] = offset + 1;return nongDate;}public final static String getChinaDate(int day) {String a = "";if (day == 10)return "初十";if (day == 20)return "二十";if (day == 30)return "三十";int two = (int) ((day) / 10);if (two == 0)a = "初";if (two == 1)a = "十";if (two == 2)a = "廿";if (two == 3)a = "三";int one = (int) (day % 10);switch (one) {case 1:a += "一";break;case 2:a += "二";break;case 3:a += "三";break;case 4:a += "四";break;case 5:a += "五";break;case 6:a += "六";break;case 7:a += "七";break;case 8:a += "八";break;case 9:a += "九";break;}return a;}public static String today() {Calendar today = Calendar.getInstance(Locale.SIMPLIFIED_CHINESE);int year = today.get(Calendar.YEAR);int month = today.get(Calendar.MONTH) + 1;int date = today.get(Calendar.DATE);long[] l = calElement(year, month, date);StringBuffer sToday = new StringBuffer();try {sToday.append(sdf.format(today.getTime()));sToday.append(" 農歷");sToday.append(cyclical(year));sToday.append('(');sToday.append(AnimalsYear(year));sToday.append(")年");sToday.append(nStr1[(int) l[1]]);sToday.append("月");sToday.append(getChinaDate((int) (l[2])));return sToday.toString();} finally {sToday = null;}}//獲取農歷的月與日的顯示public static String[] getChinaDate(int year, int month, int day) {long[] l = calElement(year, month, day);return new String[]{nStr1[(int) l[1]], getChinaDate((int) (l[2]))};}public static String oneDay(int year, int month, int day) {Calendar today = Calendar.getInstance(Locale.SIMPLIFIED_CHINESE);today.set(year, month - 1, day);long[] l = calElement(year, month, day);StringBuffer sToday = new StringBuffer();try {sToday.append(sdf.format(today.getTime()));sToday.append(" 農歷");sToday.append(cyclical(year));sToday.append('(');sToday.append(AnimalsYear(year));sToday.append(")年");sToday.append(nStr1[(int) l[1]]);sToday.append("月");sToday.append(getChinaDate((int) (l[2])));return sToday.toString();} finally {sToday = null;}}/*** 農歷日歷工具使用演示** @param args*/public static void main(String[] args) {}// //[0-4]、[5-10] // private static int[] getData(int z) { // //判斷區間 // int j = z / 5; // int[] arr = map.get(j); // if (arr == null) { // arr = new int[5]; // map.put(j, arr); // for (int a = 0, b = j * 5; a < 5; a++, b++) { // arr[a] = b; // } // }else { // System.out.println("arr!=null"); // } // return arr; // // // }}

?? 好 我們的類庫已經給大家了 現在哪 我想給他們分一下類 方便理解

?? 接口類:1.2.7

?? 工具類: 8.5.3

?? 視圖類 :9.6

?? 陰農歷轉換類:10

????? 因為我們所實現的日歷是一種 自定義控件 所以我們比較關心view視圖的實現(此處請看8.6)

? ? 大體了解了日歷布局的網格狀(6.CalendarLayout)上下運動(8.CalendarView是通過哪些類來實現

? ? 然后來了解一下他是怎么工作的?

1.CaledarAdapter適配器接口 適配器就我自己來看我感覺應該是將各種數據以合適的形式顯示在View中給用戶看。 這里實現3.CalendarBean與視圖類(9.6)之間 的適配 方便最后Mainactivity獲取顯示時間 5CalendarFactory主要用來對本月 的天數,月初第一天是哪天,還有考慮到美觀占滿網格

8CalendarUtil 用來顯示一個月的第一天是星期及,一個月有幾天

? 好關于類庫 ?他基本實現的什么我們已經了解了現在來看布局

? 1.activity_calendar

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:fitsSystemWindows="true"><LinearLayoutandroid:id="@+id/weeks"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:paddingBottom="8dp"android:paddingTop="8dp" /><Viewandroid:id="@+id/weekline"android:layout_width="match_parent"android:layout_height="1px"android:layout_below="@+id/weeks"android:background="#dddddd"/><com.ucg.app.calendar.view.CalendarLayoutandroid:id="@+id/calendarLayout"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_below="@+id/weekline"><android.support.v4.view.ViewPagerandroid:id="@+id/pager"android:layout_width="match_parent"android:layout_height="200dp" /><FrameLayoutandroid:id="@+id/selectZoomLayout"android:layout_width="match_parent"android:layout_height="100dp"android:background="#66ff0000"/><com.ucg.app.calendar.view.ScrollerLayoutandroid:layout_below="@+id/selectZoomLayout"android:id="@+id/workContentLayout"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:id="@+id/linearLayout"android:layout_width="match_parent"android:layout_height="match_parent"><ScrollViewandroid:id="@+id/workContent"android:layout_width="match_parent"android:layout_height="match_parent"><FrameLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><LinearLayoutandroid:id="@+id/content"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical" /></FrameLayout></ScrollView></LinearLayout></com.ucg.app.calendar.view.ScrollerLayout></com.ucg.app.calendar.view.CalendarLayout>2.activity_main

<?xml version="1.0" encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/background_main"android:orientation="vertical"tools:context="com.codbking.calendar.exaple.DingdingActivity"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="48dp"android:gravity="center_vertical"android:orientation="horizontal"><ImageViewandroid:id="@+id/back"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/actbar_home_up_indicator_white_normal"android:scaleType="fitCenter"/><TextViewandroid:id="@+id/title"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:text="2016/10/10"android:textColor="#ffffff"/><Viewandroid:layout_width="48dp"android:layout_height="0dp"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="28dp"android:orientation="horizontal"><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:text="日"android:textColor="#ffffff"/><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:text="一"android:textColor="#ffffff"/><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:text="二"android:textColor="#ffffff"/><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:text="三"android:textColor="#ffffff"/><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:text="四"android:textColor="#ffffff"/><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:text="五"android:textColor="#ffffff"/><TextViewandroid:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"android:gravity="center"android:text="六"android:textColor="#ffffff"/></LinearLayout><com.codbking.calendar.CalendarLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"><com.codbking.calendar.CalendarDateViewandroid:id="@+id/calendarDateView"android:layout_width="match_parent"android:layout_height="wrap_content"/><ListViewandroid:id="@+id/list"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#ffffff"/></com.codbking.calendar.CalendarLayout></LinearLayout> Mainactivity import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ListView; import android.widget.TextView;import com.codbking.calendar.CaledarAdapter; import com.codbking.calendar.CalendarBean; import com.codbking.calendar.CalendarDateView; import com.codbking.calendar.CalendarUtil; import com.codbking.calendar.CalendarView;import java.util.Date;import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick;public class XiaomiActivity extends AppCompatActivity {@BindView(R.id.title)TextView mTitle;@BindView(R.id.calendarDateView)CalendarDateView mCalendarDateView;@BindView(R.id.list)ListView mList;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_xiaomi);ButterKnife.bind(this);initView();initList();}private void initList() {mList.setAdapter(new BaseAdapter() {@Overridepublic int getCount() {return 100;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) {convertView = LayoutInflater.from(XiaomiActivity.this).inflate(android.R.layout.simple_list_item_1, null);}TextView textView = (TextView) convertView;textView.setText("position:" + position);return convertView;}});}private void initView() {mCalendarDateView.setAdapter(new CaledarAdapter() {@Overridepublic View getView(View convertView, ViewGroup parentView, CalendarBean bean) {if (convertView == null) {convertView = LayoutInflater.from(parentView.getContext()).inflate(R.layout.item_xiaomi, null);}TextView chinaText = (TextView) convertView.findViewById(R.id.chinaText);TextView text = (TextView) convertView.findViewById(R.id.text);text.setText("" + bean.day);if (bean.mothFlag != 0) {text.setTextColor(0xff9299a1);} else {text.setTextColor(0xff444444);}chinaText.setText(bean.chinaDay);return convertView;}});mCalendarDateView.setOnItemClickListener(new CalendarView.OnItemClickListener() {@Overridepublic void onItemClick(View view, int postion, CalendarBean bean) {mTitle.setText(bean.year + "/" + bean.moth + "/" + bean.day);}});int[] data = CalendarUtil.getYMD(new Date());mTitle.setText(data[0] + "/" + data[1] + "/" + data[2]);}@OnClick(R.id.back)public void onClick() {finish();} }


總結

以上是生活随笔為你收集整理的小米日历详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。