返回顶部
首页 > 资讯 > 精选 >怎么在Android中实现一个签到足迹功能
  • 567
分享到

怎么在Android中实现一个签到足迹功能

2023-06-14 11:06:48 567人浏览 独家记忆
摘要

这篇文章将为大家详细讲解有关怎么在Android中实现一个签到足迹功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。@Override    prot

这篇文章将为大家详细讲解有关怎么在Android中实现一个签到足迹功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

@Override    protected void onDraw(canvas canvas){        paint.setColor(backColor);        paint.setStrokeWidth(strokeWidth);        int rowCount = (monthDays % 7 == 0 ? monthDays / 7 : monthDays / 7 + 1);        int rowHeigh = height / (rowCount);        int startX = 0 + rowHeigh / 2;        int endX = width - rowHeigh / 2;        int days = 0;        for (int a = 0; a < rowCount; a++)        {            if (a + 1 == rowCount)            {                endX = (endX - startX) / 7 * (monthDays % 7) + checkBitmap.getWidth() / 2;            }            paint.setStrokeWidth(strokeWidth);            int y = rowHeigh * a + rowHeigh / 2;            canvas.drawLine(startX, y, endX, y, paint);            paint.setColor(rashColor);            paint.setStrokeWidth(1);            canvas.drawLine(startX, y, endX, y, paint);            // 这里是来判断,是否需要画出左半边还是右半边的半圆弧度?            if (a % 2 != 0)            {                if (a + 1 != rowCount)                {                    drawLeftOrRightArc(true, canvas, 0 + strokeWidth, y, 0 + rowHeigh + strokeWidth, y + rowHeigh);                }            } else            {                if (a + 1 != rowCount)                {                    drawLeftOrRightArc(false, canvas, endX - rowHeigh / 2 - strokeWidth, y, endX + rowHeigh / 2 - strokeWidth, y + rowHeigh);                }            }        }    }

然后再在线上画出礼物数量

// 这里是来判断,本次这根线上画出的礼物的点,以及顺序是顺画,还是倒画出。            bitmapList.clear();            for (int b = 0; b < (a + 1 == rowCount ? (monthDays % 7) : 7); b++)            {                days++;                if (days <= signInCount)                {                    if (days == 3 || days == 8 || days == 14 || days == 21 || days == monthDays)                    {                        bitmapList.add(a % 2 != 0 ? 0 : bitmapList.size(), openGiftBitmap);                    } else                    {                        bitmapList.add(a % 2 != 0 ? 0 : bitmapList.size(), checkBitmap);                    }                } else                {                    if (days == 3 || days == 8 || days == 14 || days == 21 || days == monthDays)                    {                        bitmapList.add(a % 2 != 0 ? 0 : bitmapList.size(), closeGiftBitmap);                    } else                    {                        bitmapList.add(a % 2 != 0 ? 0 : bitmapList.size(), uncheckBitmap);                    }                }            }

这里有一个需要注意的地方,就是,在线为双数的时候,这时候礼物的排列是需要反过来排列的,我这里使用了一个LinkedList来保存礼物的排列顺序,然后我们通过计算平均数,计算出每个礼物的位置。

    private void drawImgs(List<Bitmap> bitmapList, float startX, float endX, float y, Canvas canvas){        startX = startX - bitmapList.get(0).getWidth() / 2;        int count = bitmapList.size();        float bitmap_width = (endX - startX) / (count - 1);        for (int a = 0; a < count; a++)        {            Bitmap bitmap = bitmapList.get(a);            canvas.drawBitmap(bitmap, startX + (bitmap_width * a), y - bitmap.getHeight() / 2, paint);        }    }

这里也有一个需要注意的地方,就是,当最后一条线是短的时候,这个时候,你的礼物的排列需要按照那条线的开始位置和结束位置来平均计算每个礼物的位置。

最后,我们在最后一条线最后的位置,画出文字

    private void drawText(Canvas canvas, float y, float x){        int oldColor = paint.getColor();        Paint.Style old_style = paint.getStyle();        paint.setStyle(Paint.Style.FILL);        paint.setColor(textColor);        String drawText = "已累计签到"+signInCount+"天";        paint.setTextSize(DensityUtil.sp2px(getContext(), 15));        int textHeigh = getStringHeight(drawText);        int textWidth = getStringWidth(drawText);        canvas.drawText(drawText, x + textWidth/2, y + textHeigh / 2, paint);        paint.setColor(oldColor);        paint.setStyle(old_style);    }

怎么在Android中实现一个签到足迹功能

好了,这就是所有的思路。下面贴一下最新完整代码:

package com.sjl.keeplive.track;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.RectF;import android.support.annotation.Nullable;import android.util.AttributeSet;import android.view.View;import com.sjl.keeplive.R;import java.util.LinkedList;import java.util.List;public class SignInView extends View {    private int width, height;    private int monthDays = 31;//本月有31天    private Paint paint;    private RectF oval = new RectF();    private float strokeWidth = 10;    private Bitmap checkBitmap, uncheckBitmap, closeGiftBitmap, openGiftBitmap;    private int backColor = Color.parseColor("#C3DEEA"),            rashColor = Color.parseColor("#B2CADB"),            textColor = Color.parseColor("#60ADE5");    private List<Bitmap> bitmapList = new LinkedList<>();    private int signInCount = 9;    public SignInView(Context context) {        this(context, null);    }    public SignInView(Context context, @Nullable AttributeSet attrs) {        this(context, attrs, 0);    }    public SignInView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        init(context, attrs);    }    private void init(Context context, AttributeSet attrs) {        paint = new Paint();        paint.setAntiAlias(true);        strokeWidth = DensityUtil.dip2px(6);        checkBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon_sign_in_check_img);        uncheckBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon_sign_in_uncheck_img);        closeGiftBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon_close_gift_img);        openGiftBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon_open_gift_img);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        height = MeasureSpec.getSize(heightMeasureSpec);        width = MeasureSpec.getSize(widthMeasureSpec);        super.onMeasure(widthMeasureSpec, heightMeasureSpec);    }        public void setMonthDays(int monthDays) {        this.monthDays = monthDays;        if (monthDays == 0) {            this.monthDays = 31;        }        postInvalidate();    }        public void setProgress(int days) {        this.signInCount = days;        postInvalidate();    }    @Override    protected void onDraw(Canvas canvas) {        paint.setColor(backColor);        paint.setStrokeWidth(strokeWidth);        int rowCount = (monthDays % 7 == 0 ? monthDays / 7 : monthDays / 7 + 1);        int rowHeigh = height / (rowCount);        int startX = 0 + rowHeigh / 2;        int endX = width - rowHeigh / 2;        int days = 0;        for (int a = 0; a < rowCount; a++) {            if (a + 1 == rowCount) {                endX = (endX - startX) / 7 * (monthDays % 7 == 0 ? 7 : (monthDays % 7)) + checkBitmap.getWidth() / 2;            }            paint.setStrokeWidth(strokeWidth);            int y = rowHeigh * a + rowHeigh / 2;            canvas.drawLine(startX, y, endX, y, paint);            paint.setColor(rashColor);            paint.setStrokeWidth(1);            canvas.drawLine(startX, y, endX, y, paint);            // 这里是来判断,是否需要画出左半边还是右半边的半圆弧度?            if (a % 2 != 0) {                if (a + 1 != rowCount) {                    drawLeftOrRightArc(true, canvas, 0 + strokeWidth, y, 0 + rowHeigh + strokeWidth, y + rowHeigh);                }            } else {                if (a + 1 != rowCount) {                    drawLeftOrRightArc(false, canvas, endX - rowHeigh / 2 - strokeWidth, y, endX + rowHeigh / 2 - strokeWidth, y + rowHeigh);                }            }            // 这里是来判断,本次这根线上画出的礼物的点,以及顺序是顺画,还是倒画出。            bitmapList.clear();            int lastDay = (monthDays % 7) == 0 ? 7 : (monthDays % 7);            for (int b = 0; b < (a + 1 == rowCount ? (lastDay) : 7); b++) {                days++;                if (days <= signInCount) {                    if (days == 3 || days == 8 || days == 14 || days == 21 || days == monthDays) {                        bitmapList.add(a % 2 != 0 ? 0 : bitmapList.size(), openGiftBitmap);                    } else {                        bitmapList.add(a % 2 != 0 ? 0 : bitmapList.size(), checkBitmap);                    }                } else {                    if (days == 3 || days == 8 || days == 14 || days == 21 || days == monthDays) {                        bitmapList.add(a % 2 != 0 ? 0 : bitmapList.size(), closeGiftBitmap);                    } else {                        bitmapList.add(a % 2 != 0 ? 0 : bitmapList.size(), uncheckBitmap);                    }                }            }            drawImgs(bitmapList, startX, endX, y, canvas);        }        super.onDraw(canvas);    }        private void drawImgs(List<Bitmap> bitmapList, float startX, float endX, float y, Canvas canvas) {        if (!bitmapList.isEmpty()) {            startX = startX - bitmapList.get(0).getWidth() / 2;            int count = bitmapList.size();            float bitmap_width = (endX - startX) / (count - 1);            for (int a = 0; a < count; a++) {                Bitmap bitmap = bitmapList.get(a);                canvas.drawBitmap(bitmap, startX + (bitmap_width * a), y - bitmap.getHeight() / 2, paint);            }        }    }        private void drawLeftOrRightArc(boolean isLeft, Canvas canvas, float left, float top, float right, float bottom) {        paint.setStrokeWidth(strokeWidth);        paint.setColor(backColor);        if (isLeft) {            paint.setStyle(Paint.Style.STROKE);            oval.setEmpty();            oval.set(left, top, right, bottom);            canvas.drawArc(oval, 90, 180, false, paint);            paint.setStrokeWidth(1);            paint.setColor(rashColor);            canvas.drawArc(oval, 90, 180, false, paint);        } else {            paint.setStyle(Paint.Style.STROKE);            oval.setEmpty();            oval.set(left, top, right, bottom);            canvas.drawArc(oval, 270, 180, false, paint);            paint.setStrokeWidth(1);            paint.setColor(rashColor);            canvas.drawArc(oval, 270, 180, false, paint);        }        paint.setStrokeWidth(strokeWidth);        paint.setColor(backColor);    }}

布局文件使用:

 <com.sjl.keeplive.track.SignInView        android:layout_width="match_parent"        android:layout_height="match_parent"        android:visibility="visible"/>

关于怎么在Android中实现一个签到足迹功能就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 怎么在Android中实现一个签到足迹功能

本文链接: https://lsjlt.com/news/270554.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么在Android中实现一个签到足迹功能
    这篇文章将为大家详细讲解有关怎么在Android中实现一个签到足迹功能,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。@Override    prot...
    99+
    2023-06-14
  • Android 实现签到足迹功能
    目录首先我们把线画出来,大概这个样子然后再在线上画出礼物数量最后,我们在最后一条线最后的位置,画出文字UI 妹纸又给了个图叫我做,我一看是这样的: 我们首先把这个控件划分成&nbs...
    99+
    2024-04-02
  • 怎么在HTML5中实现签到 功能
    本篇文章给大家分享的是有关怎么在HTML5中实现签到 功能 ,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。//生成日期数据    fun...
    99+
    2023-06-09
  • 怎么在Android中实现一个摇一摇功能
    本篇文章给大家分享的是有关怎么在Android中实现一个摇一摇功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。步骤1:声明一个SensorManager对象步骤2:重写Act...
    99+
    2023-06-14
  • 怎么在php中使用laravel 实现一个二维码签到功能
    怎么在php中使用laravel 实现一个二维码签到功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。框架及拓展包laravelovertrue/laravel-wechat&...
    99+
    2023-06-15
  • 怎么在Android中实现一个计步器功能
    本篇文章给大家分享的是有关怎么在Android中实现一个计步器功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。activity_main.xml<xml ve...
    99+
    2023-06-14
  • 怎么在Android中实现一个倒计时功能
    本篇文章给大家分享的是有关怎么在Android中实现一个倒计时功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。以30分钟为例写的一个倒计时:public class Main...
    99+
    2023-05-31
    android roi %d
  • 怎么在Android应用中实现一个跳转到主界面功能
    怎么在Android应用中实现一个跳转到主界面功能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。//homeIntent intent= new Intent(Intent.A...
    99+
    2023-05-31
    android roi
  • 怎么在Android实现一个双击TitleBar回到顶部功能
    今天就跟大家聊聊有关怎么在Android实现一个双击TitleBar回到顶部功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。双击返回顶部代码public class&nb...
    99+
    2023-05-30
    android titlebar
  • 怎么在Android中实现一个自动打卡功能
    这篇文章给大家介绍怎么在Android中实现一个自动打卡功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。提前准备首先我们需要一直不用的Android手机,插上公司的电源。下载安装钉钉并设置为极速打卡。自动打开我们只需...
    99+
    2023-06-14
  • 怎么在Android 应用中实现一个换肤功能
    今天就跟大家聊聊有关怎么在Android 应用中实现一个换肤功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Android换肤技术总结背景纵观现在各种Android app,其换肤...
    99+
    2023-05-31
    android roi
  • 使用canvas怎么实现一个在线签名功能
    这期内容当中小编将会给大家带来有关使用canvas怎么实现一个在线签名功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。什么是 Canvas?Canvas 是 HTML5 新增的元素,用于在网页上绘制图形...
    99+
    2023-06-09
  • Android中怎么实现一个截屏功能
    这篇文章给大家介绍Android中怎么实现一个截屏功能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1:build.gradlecompileSdkVersion 21   &n...
    99+
    2023-06-20
  • php如何实现一个用户签到功能
    这篇文章主要介绍了php如何实现一个用户签到功能的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇php如何实现一个用户签到功能文章都会有所收获,下面我们一起来看看吧。一、 前置条件在实现用户签到前,我们需要进行如...
    99+
    2023-07-06
  • 怎么在Android应用中实现一个实时通信功能
    今天就跟大家聊聊有关怎么在Android应用中实现一个实时通信功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。实现原理就是将发送端,接收端分别放进一个线程去运行,然后利用线程通信类...
    99+
    2023-05-31
    android roi
  • 怎么在Android中实现一个双重选择框功能
    这期内容当中小编将会给大家带来有关怎么在Android中实现一个双重选择框功能,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。原理:定义四个RadioGroup,通过第一个RadioGroup的选择来控制其...
    99+
    2023-05-30
    android
  • 怎么在Android中实现一个多线程下载功能
    怎么在Android中实现一个多线程下载功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。布局      &nb...
    99+
    2023-05-30
    android 多线程
  • 怎么在Android中利用IntentUtil实现一个跳转功能
    本文章向大家介绍怎么在Android中利用IntentUtil实现一个跳转功能的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。Android是什么Android是一种基于Linux内核的自由及开放源代码的操作系统...
    99+
    2023-05-30
    android intentutil
  • 怎么在Android应用中实现一个选项卡功能
    怎么在Android应用中实现一个选项卡功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。选项卡(TabHost)方便的在窗口上设置多个标签页,每个标签页相当于获得一个与外...
    99+
    2023-05-31
    android roi
  • 怎么在Android中实现一个滑动退出Activity功能
    怎么在Android中实现一个滑动退出Activity功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。实现Android 滑动退出Activity的功能and...
    99+
    2023-05-30
    android activity roi
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作