需求的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也可以随你自己改动。