android 多选日历

3,598 阅读3分钟
原文链接: blog.csdn.net

这里写图片描述
需求的ui就是这样,功能需要能滑动多选,滑动取消多选。
代码上传了,下载地址
写了一个父类的日历类和显示日期的方块类,日历类有单选和多选两种点击的回调。
下面就是用两个父类去实现上图功能控件,如果你们也有日历需求,可以试试我这个,会写起来方便一点儿。

Activity:

public class MainActivity extends AppCompatActivity {

    MoreSelectCalendar dld;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dld = (MoreSelectCalendar) findViewById(R.id.dld);
        dld.setBaseBlock(new MoreSelectBlock());

    }
}

MoreSelectBlock:(画格子,由于需求要连续日期链接起来,每个格子就有4中形态)

public class MoreSelectBlock extends BaseBlock {
    ArrayList<Dd1> selectDa1s;
    ArrayList<Dd1> showDd1s;
    Paint blackP = new Paint(Paint.ANTI_ALIAS_FLAG);//黑色画笔
    Paint pinkP = new Paint(Paint.ANTI_ALIAS_FLAG);//浅红色画笔
    Paint redP = new Paint(Paint.ANTI_ALIAS_FLAG);//红色画笔
    Paint grayP = new Paint(Paint.ANTI_ALIAS_FLAG);//灰色画笔
    float drawSize;//绘画背景的尺寸
    float radius;
    private static final float textNubSize = 0.8f;

    public MoreSelectBlock() {

        blackP.setColor(Color.parseColor("#313131"));
        redP.setColor(Color.parseColor("#ff473d"));
        pinkP.setColor(Color.parseColor("#fff1f0"));
        grayP.setColor(Color.parseColor("#bcbcbc"));
    }

    /**
     *在这里设置文字大小
     * @param canvas
     * @param datas 选择月日期集合
     * @param size
     * @param startIndex
     */
    @Override
    public void draw(Canvas canvas, ArrayList<Dd1> datas, float size, PointF startIndex) {
        drawSize = size * 0.7f;
        radius = drawSize / 2;
        blackP.setTextSize(radius * textNubSize);
        redP.setTextSize(radius * textNubSize);
        grayP.setTextSize(radius * textNubSize);
        showDd1s = datas;
        super.draw(canvas, datas, size, startIndex);
    }

    /**
     * 某一个日期方块的坐标,
     * @param x
     * @param y
     * @param canvas
     * @param date
     * @param index
     */
    @Override
    public void drawBlock(float x, float y, Canvas canvas, Dd1 date, int index) {
        boolean isSelect = false;
        if (selectDa1s != null) {
            for (int i = 0; i < selectDa1s.size(); i++) {
                if (date.isseclet(selectDa1s.get(i))) {
                    isSelect = true;
                    drawmBlock(x, y, canvas, date, index);
                    break;
                }
            }
        }
        showDateNub(x, y, canvas, date, isSelect);
    }

    /**
     * 画选中的方块
     *
     * @param x
     * @param y
     * @param canvas
     * @param date
     * @param index 日期集合的位置
     */
    private void drawmBlock(float x, float y, Canvas canvas, Dd1 date, int index) {
        int type = testBlockType(index);
        switch (type) {
            case 1:
                drawLeftRound(x, y, canvas);
                break;
            case 2:
                drawRect(x, y, canvas);
                break;
            case 3:
                drawRightRound(x, y, canvas);
                break;
            case 4:
                drawRound(x, y, canvas);
                break;
        }
    }

    /**
     * 123 4
     *1左边2中间3右边   4不在连续日期
     * @param index
     * @return
     */
    private int testBlockType(int index) {
        Dd1 leftDd = null;
        Dd1 rightDd = null;
        boolean isHaveLeft = false;
        boolean isHaveRight = false;
        if (index  != 0) {
            leftDd = showDd1s.get(index - 1);
        }
        if (index != 41) {
            rightDd = showDd1s.get(index + 1);
        }
        for (int i = 0; i < selectDa1s.size(); i++) {
            Dd1 dd1 = selectDa1s.get(i);
            if (leftDd != null && dd1.isseclet(leftDd)) {
                isHaveLeft = true;
            }
            if (rightDd != null && dd1.isseclet(rightDd)) {
                isHaveRight = true;
            }
        }
        if (isHaveLeft && isHaveRight) {
            return 2;
        } else if (isHaveLeft) {
            return 3;
        } else if (isHaveRight) {
            return 1;
        } else {
            return 4;
        }
    }

    private void showDateNub(float x, float y, Canvas canvas, Dd1 date, boolean isSelect) {
        if (date.isukow) {
            drawBlock(grayP, canvas, date.d + "", x + size / 2, y, y + size);
            return;
        }
        if (isSelect) {
            drawBlock(redP, canvas, date.d + "", x + size / 2, y, y + size);
        } else {
            drawBlock(blackP, canvas, date.d + "", x + size / 2, y, y + size);
        }

    }

    /**
     * 画圆圈
     *
     * @param x
     * @param y
     * @param canvas
     */
    public void drawRound(float x, float y, Canvas canvas) {
        canvas.drawCircle(x + size / 2, y + size / 2, radius, pinkP);
    }

    public void drawLeftRound(float x, float y, Canvas canvas) {
        drawRound(x, y, canvas);
        canvas.drawRect(x + size / 2, y + (size - drawSize) / 2, x + size, y + size - (size - drawSize) / 2, pinkP);
    }

    public void drawRightRound(float x, float y, Canvas canvas) {
        drawRound(x, y, canvas);
        canvas.drawRect(x, y + (size - drawSize) / 2, x + size / 2, y + size - (size - drawSize) / 2, pinkP);
    }

    public void drawRect(float x, float y, Canvas canvas) {
        canvas.drawRect(x, y + (size - drawSize) / 2, x + size, y + size - (size - drawSize) / 2, pinkP);
    }
}

MoreSelectCalendar:

public class MoreSelectCalendar extends BaseCalendar {

    ArrayList<Dd1> selectDd1s = new ArrayList<>();

    public MoreSelectCalendar(Context context) {
        super(context);
    }

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

    public MoreSelectCalendar(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    private long mDownTime;//按下时间
    private boolean isAddMode;


    /**
     *
     * @param downTime
     * @param firstDd1
     * @param selectDd1
     */
    @Override
    public void onMoveClickListener(long downTime, Dd1 firstDd1, Dd1 selectDd1) {

        if (mDownTime == 0) {//初始化Tag
            mDownTime = downTime;
        }

        if (mDownTime == downTime) {//同一次按下的操作
        } else {//非同一次按下操作
            Log.e("yjz", "非同一次按下操作");
            isAddMode = true;
            mDownTime = downTime;
            for (int i = 0; i < selectDd1s.size(); i++) {
                if (firstDd1.isseclet(selectDd1s.get(i))) {//如果选择的第一个在集合里存在
                    isAddMode = false;
                    break;
                }
            }
        }
        if (selectDd1.isukow) {//如果点击了日历外退出
            return;
        }

        if (isAddMode) {//添加模式
            addDd1(selectDd1);
        } else {
            deleteDd1(selectDd1);
        }
    }

    /**
     * 添加
     *
     * @param selectDd1
     */
    public void addDd1(Dd1 selectDd1) {
        boolean isHave = false;
        for (int i = 0; i < selectDd1s.size(); i++) {
            if (selectDd1.isseclet(selectDd1s.get(i))) {
                isHave = true;
                break;
            }
        }
        if (!isHave) {
            selectDd1s.add(selectDd1);
            invalidate();
        }
    }

    public void deleteDd1(Dd1 selectDd1) {
        boolean isHave = false;
        for (int i = 0; i < selectDd1s.size(); i++) {
            if (selectDd1.isseclet(selectDd1s.get(i))) {
                isHave = true;
                selectDd1s.remove(selectDd1s.get(i));
                break;
            }
        }
        if (isHave) {
            invalidate();
        }
    }

    /**
     * 每次绘画block前调用的方法,
     * 传一个block进来
     * 在这里设置选中的日期集合
     * @param baseBlock
     */
    @Override
    public void customDrawBlock(BaseBlock baseBlock) {
        MoreSelectBlock block = (MoreSelectBlock) baseBlock;
        block.selectDa1s = selectDd1s;
    }
}

这里主要是 连选操作的业务逻辑
如果你刚好有这个需求就拿去用吧,ui也可以随你自己改动。