自定义View-签到功能

it2022-05-05  152

1.效果如图,暂时就先写一个测试版本,慢慢在优化

2.使用了一个横向的RecyclerView,然后主要就是底部的view,通过自定义实现,底部自定义的签到TextView源码

import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Rect; import android.graphics.RectF; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.View; import com.blue.cmzhiku.R; /** * Created by vode on 2019/7/18. */ public class DailySignView extends View { public Paint mPaint; public Paint mTextPaint; public Path path; public int mWidth; public int mHeight; public Bitmap mtag; private int mtagWidth; public Rect srcRect; public Rect desRect; public Path path1; private String text; private int state;//0,普通 1,签到,2当前,3当前已签到 public RectF rectF; public String getText() { return text; } public void setText(String text) { this.text = text; } public int getState() { return state; } public void setState(int state) { this.state = state; invalidate(); } public DailySignView(Context context) { super(context); init(); } public DailySignView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(); } public DailySignView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setColor(Color.GREEN); mTextPaint = new Paint(); mTextPaint.setTextSize(50); mTextPaint.setAntiAlias(true); mTextPaint.setTextAlign(Paint.Align.CENTER); path = new Path(); path1 = new Path(); mtag = BitmapFactory.decodeResource(getResources(), R.drawable.qian); srcRect = new Rect(0, 0, mtag.getWidth(), mtag.getHeight()); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); mWidth = MeasureSpec.getSize(widthMeasureSpec); mHeight = MeasureSpec.getSize(heightMeasureSpec); mtagWidth=mWidth/3; path.addCircle(mWidth / 2, mHeight / 2, mWidth / 2-5, Path.Direction.CW); path1.addCircle(mWidth-mtagWidth/2,mtagWidth/2,mtagWidth/2+5, Path.Direction.CW); desRect = new Rect(mWidth - mtagWidth, 0, mWidth, mtagWidth); rectF = new RectF(0, 0, mWidth, mHeight); } @Override protected void onDraw(Canvas canvas) { if (state==0){ mPaint.setColor(Color.TRANSPARENT); mTextPaint.setColor(Color.BLACK); }else if (state==1){ mPaint.setColor(Color.parseColor("#eeeeee")); mTextPaint.setColor(Color.BLACK); canvas.drawBitmap(mtag, srcRect, desRect, mTextPaint); }else if (state==2){ mPaint.setColor(Color.parseColor("#1FA56A")); mTextPaint.setColor(Color.WHITE); //画右上角签到bitmap canvas.drawBitmap(mtag, srcRect, desRect, mTextPaint); } //画带缺口背景 Path path2 = new Path(); path2.op(path,path1, Path.Op.DIFFERENCE); canvas.drawPath(path2, mPaint); //在中间画text Paint.FontMetrics fontMetrics=mTextPaint.getFontMetrics(); float distance=(fontMetrics.bottom - fontMetrics.top)/2 - fontMetrics.bottom; float baseline=rectF.centerY()+distance; canvas.drawText(text,rectF.centerX(), baseline,mTextPaint); } }

3.存储时间的Bean,需要注意的一点就是,calendar.get(Calendar.DAY_OF_WEEK)获取的1代表周日,而不是我们的周一

public class SignDateBean { private int dayOfWeek; private int dayOfMonth; private String dayOfWeekStr; public String getDayOfWeekStr() { return dayOfWeekStr; } public void setDayOfWeekStr(String dayOfWeekStr) { this.dayOfWeekStr = dayOfWeekStr; } public int getDayOfWeek() { return dayOfWeek; } public void setDayOfWeek(int dayOfWeek) { this.dayOfWeek = dayOfWeek; switch (dayOfWeek) { case 1: setDayOfWeekStr("日"); break; case 2: setDayOfWeekStr("一"); break; case 3: setDayOfWeekStr("二"); break; case 4: setDayOfWeekStr("三"); break; case 5: setDayOfWeekStr("四"); break; case 6: setDayOfWeekStr("五"); break; case 7: setDayOfWeekStr("六"); break; } } public int getDayOfMonth() { return dayOfMonth; } public void setDayOfMonth(int dayOfMonth) { this.dayOfMonth = dayOfMonth; } public SignDateBean(int dayOfWeek, int dayOfMonth) { setDayOfWeek(dayOfWeek); this.dayOfMonth=dayOfMonth; } }

4.获取时间实现

long currentT = System.currentTimeMillis(); int duration = 1000 * 24 * 60 * 60; Calendar calendar = Calendar.getInstance(); calendar.setFirstDayOfWeek(Calendar.MONDAY); for (int i = -3; i <= 3; i++) { long l = currentT + i * duration; Date date = new Date(l); calendar.setTime(date); int week = calendar.get(Calendar.DAY_OF_WEEK); int day = calendar.get(Calendar.DAY_OF_MONTH); datas.add(new SignDateBean(week,day)); }

 


最新回复(0)