安卓實現簽到日曆

一  需求分析

        日曆支持左右滑動

        日曆需要在具體日期下面展示簽到情況的標識,例如 異常 正常

        點擊日期查看當天的簽到情況、在日曆下方以列表展示

二    圖文展示

      

三 實現思路

  1 最外層:scrollview包裹 需要自定義 避免滑動衝突

             

public class ObservableScrollView extends ScrollView {

    private int downX;
    private int downY;
    private int mTouchSlop;

    private OnScollChangedListener onScollChangedListener = null;

    public ObservableScrollView(Context context) {
        super(context);
        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    }

    public ObservableScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    }

    public ObservableScrollView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    }

    public void setOnScollChangedListener(OnScollChangedListener onScollChangedListener) {
        this.onScollChangedListener = onScollChangedListener;
    }

    @Override
    protected void onScrollChanged(int x, int y, int oldx, int oldy) {
        super.onScrollChanged(x, y, oldx, oldy);
        if (onScollChangedListener != null) {
            onScollChangedListener.onScrollChanged(this, x, y, oldx, oldy);
        }
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent e) {
        int action = e.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                downX = (int) e.getRawX();
                downY = (int) e.getRawY();
                break;
            case MotionEvent.ACTION_MOVE:
                int moveY = (int) e.getRawY();
                if (Math.abs(moveY - downY) > mTouchSlop) {
                    return true;
                }
            default:
        }
        return super.onInterceptTouchEvent(e);
    }

    public interface OnScollChangedListener {

        void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy);

    }

}

  

  2 日曆部分: monthview + dayView組成   dayview與monthview的組成比較簡單,可以通過自定義組件 或者 xml都可以實現

                    實現左右滑動:viewpager/flipper  

/**
 * ViewPager wrapContent解決方案
 * 用於gradview *6 注意
 */
public class CalendarViewPager extends ViewPager {

    private OnViewpagerListener onViewpagerListener;

    public void setOnViewpagerListener(OnViewpagerListener onViewpagerListener) {
        this.onViewpagerListener = onViewpagerListener;
    }

    public CalendarViewPager(Context context) {
        super(context);
        init();
    }

    public CalendarViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int height = 0;
        for (int i = 0; i < getChildCount(); i++) {
            View child = getChildAt(i);
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            int h = child.getMeasuredHeight() * 6;
            if (h > height)
                height = h;
        }
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    private void init() {
        //此處設置爲500初始化
        setAdapter(new PagerAdapter() {
            @Override
            public int getCount() {
                return 1000;
            }

            @Override
            public boolean isViewFromObject(View view, Object object) {
                return view == object;
            }

            @Override
            public int getItemPosition(@NonNull Object object) {
                View view = (View) object;
                int currentPage = getCurrentItem(); // Get current page index
                if (currentPage == (Integer) view.getTag()) {
                    return POSITION_NONE;
                } else {
                    return POSITION_UNCHANGED;
                }
            }

            @Override
            public Object instantiateItem(ViewGroup container, final int position) {
                GridView gv = initCalendar(position);
                gv.setTag(position);
                container.addView(gv);
                return gv;
            }

            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
                container.removeView((View) object);
            }

        });
    }

    private GridView initCalendar(int position) {
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT, AbsListView.LayoutParams.WRAP_CONTENT);
        GridView gView = new GridView(getContext());
        gView.setLayoutParams(params);
        gView.setNumColumns(7);
        gView.setGravity(Gravity.CENTER);
        gView.setSelector(new ColorDrawable(Color.TRANSPARENT));
        gView.setBackgroundColor(getResources().getColor(android.R.color.transparent));
        DayAdapter dayAdapter = new DayAdapter(getContext());
        gView.setAdapter(dayAdapter);
        dayAdapter.setOnItemSelectListener(new DayAdapter.OnItemSelectListener() {
            @Override
            public void onSelectItem(String day) {
                onViewpagerListener.onChildViewChange(day);
            }
        });
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.MONTH, position - 500);
        int y = calendar.get(Calendar.YEAR);
        int m = calendar.get(Calendar.MONTH) + 1;
        int d = calendar.get(Calendar.DATE);
        List<CalendarBean> dayItemList = CalendarFactory.getMonthOfDayList(y, m);
        dayAdapter.setList(dayItemList);
        return gView;
    }

    public interface OnViewpagerListener {

        void onChildViewChange(String day);
    }

}

   

  3 列表部分 listview/ recyclewview  根據當前的年月日請求後臺數據

 

 鏈接: https://download.csdn.net/download/qq_35001400/11328920

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章