前言:
之前,做好几个项目,老大要求的日历控件样子都差不多,但本人怕麻烦地老往代码里去改,所以就想着做一个可以在布局修改就能满足需求的日历控件,所以就有了这个了
效果:
自定义属性:
<declare-styleable name="Calendar">
<attr name="hpadding" format="float"></attr>
<attr name="wpadding" format="float"></attr>
<attr name="downcolor" format="color"></attr>
<attr name="bordercolor" format="color"></attr>
<attr name="weekcolor" format="color"></attr>
<attr name="monthbg1color" format="color"></attr>
<attr name="monthbg1fill" format="boolean"></attr>
<attr name="monthbg2color" format="color"></attr>
<attr name="monthbg2fill" format="boolean"></attr>
<attr name="todaycolor" format="color"></attr>
<attr name="normalcolor" format="color"></attr>
<attr name="othermonthcolor" format="color"></attr>
<attr name="weekscale" format="float"></attr>
<attr name="datescale" format="float"></attr>
<attr name="ischinese" format="boolean"></attr>
<attr name="isbold" format="boolean"></attr>
<attr name="buttondistance" format="float"></attr>
</declare-styleable>
因为自定义的属性,比较多配合下面几个图来说一下
属性描述:
属性名称 | 属性描述 | 备注 |
hpadding | 日历与上下的间距 | 默认为0 |
wpadding | 日历与左右的间距 | 默认为0 |
buttondistance | 按钮与左右的间距 | 默认为0 |
monthbg1color | 背景1的颜色 | 默认为0x00000000 |
monthbg1fill | 背景1是否全部填充 | 默认为false |
monthbg2color | 背景2的颜色 | 默认为0x00000000 |
monthbg2color | 背景2是否全部填充 | 默认为false |
bordercolor | 边框的颜色 | 默认为0x00000000 |
todaycolor | 今天日期的颜色 | 默认为0xFFFF0000 |
normalcolor | 当前月的日期的颜色(注意,是指日历而不是现实中的) | 默认为0xFF000000 |
othermonthcolor | 其他月份的日期的颜色 | 默认为0xFFCCCCCC |
isbold | 星期文本与日期文本是否加粗 | 默认为false |
weekscale | 星期文本的缩放大小 | 默认为1.0f |
datescale | 日期文本的缩放大小 | 默认为1.0f |
downcolor | 按下时,圆的颜色 | 默认为0x00000000 |
ischinese | 星期与年月的显示是否为中文 | 默认为false |
weekcolor | 星期文本的颜色 | 默认为0xFF000000 |
思路:
1.排除掉这些自定义属性,我们要实现一个日历的基本功能(改变月份时,日历上的日期也会改变),那我们需要两样重要的东西来实现:存放日期的数字的数组或list和记录位置的索引
2.当基本功能完成后,我们就要确认下绘制顺序,这个比较简单
3.加入上面的属性,并加入一些限制,放置使用者把这个控件玩脱了
先上全部源码吧:
package calendar;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import com.example.peng.myapplication.R;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* Created by peng on 2017/5/5.
*/
public class CalendarView extends View implements View.OnTouchListener{
float width,height;//控件的宽与高
flo