资讯专栏INFORMATION COLUMN

酷炫的日间夜间模式切换按钮

sixgo / 647人阅读

摘要:前言最近看到一个酷炫的日间夜间模式切换按钮,于是就动手写了仿写了一个。云朵的动态效果二夜间模式主要分为夜间模式打开状态。

前言

最近看到一个酷炫的日间夜间模式切换按钮,于是就动手写了仿写了一个。
这里是Github链接,欢迎star,fork...
PO上效果图,录制的不太好

主要的编写思路

这里主要是用属性动画中的ValueAnimator来产生具有一组有规律数字,然后主要绘制日间模式(云朵跳动的效果),夜间模式(星星闪烁的效果,月亮逆向旋转的效果),全局设计有四种固定的模式(SWITCH_ANIMATION_OFF, SWITCH_ANIMATION_ON, SWITCH_ON, SWITCH_OFF)分别对应着按钮动画关闭,按钮动画打开,打开,关闭,这几种具体的状态。

一、日间模式

主要分为日间模式打开状态。

private void drawSwitchOn(Canvas canvas) {
        float[] rectAttrs = compRoundRectAttr(SWITCH_OFF_POS);
        drawRoundRect(canvas, switchOnColor, rectAttrs);//按钮主题的背景

        float[] ovalAttrs = compOvalAttr(SWITCH_ON_POS);
        drawOval(canvas, spotOnColor, ovalAttrs);//绘制太阳
        drawOvalIn(canvas, spotOnColorIn, ovalAttrs);
        drawCloud(canvas, 1);//绘制云朵

        drawRoundRectStroke(canvas, DEFAULT_SWITCH_ON_COLOR_OUT);
    }

日间模式动画打开状态。

private void drawSwitchOnAnim(Canvas canvas) {
        float[] rectAttrs = compRoundRectAttr(SWITCH_OFF_POS);
        drawRoundRect(canvas, switchOnColor, rectAttrs);

        rectAttrs = compRoundRectAttr(currentPos);
        drawRoundRect(canvas, switchOffColor, rectAttrs);

        float[] ovalShadeOnAttrs = compRoundRectShadeOnAttr(currentPos * 3/2);
        float[] ovalAttrs = compOvalAttr(currentPos* 3/2);
        int color = compColor(currentPos, DEFAULT_SPOT_OFF_COLOR, DEFAULT_SPOT_ON_COLOR);
        int colorIn = compColor(currentPos, DEFAULT_SPOT_OFF_COLOR_IN, DEFAULT_SPOT_ON_COLOR_IN);
        drawRoundRect(canvas, color, ovalShadeOnAttrs);
        drawOval(canvas, color, ovalAttrs);
        drawOvalIn(canvas, colorIn, ovalAttrs);
        if(currentPos > 0.6) {
            drawCloud(canvas, currentPos);//云朵的动态效果
        }

        int strokeColor = compColor(currentPos, DEFAULT_SWITCH_OFF_COLOR_OUT, DEFAULT_SWITCH_ON_COLOR_OUT);
        drawRoundRectStroke(canvas, strokeColor);
    }
二、夜间模式

主要分为夜间模式打开状态。

float[] rectAttrs = compRoundRectAttr(SWITCH_OFF_POS);
        drawRoundRect(canvas, switchOffColor, rectAttrs);

        float[] ovalAttrs = compOvalAttr(SWITCH_OFF_POS);
        drawOval(canvas, spotOffColor,  ovalAttrs);
        drawOvalIn(canvas, spotOffColorIn, ovalAttrs);
        drawCircleDot(canvas, spotOffColor, spotOffColorIn, 1, ovalAttrs);
        drawCircleDot2(canvas, spotOffColor, spotOffColorIn, 1, ovalAttrs);//绘制月亮上的原点
        drawCircleDot3(canvas, spotOffColor, spotOffColorIn, 1, ovalAttrs);//绘制月亮上的原点
        drawStar(canvas, DEFAULT_SPOT_OFF_COLOR_IN, 1);//绘制星星

        drawRoundRectStroke(canvas, DEFAULT_SWITCH_OFF_COLOR_OUT);

主要分为夜间模式动画打开状态。

float[] rectAttrs = compRoundRectAttr(SWITCH_OFF_POS);
        if (currentPos != 1) {
            drawRoundRect(canvas, switchOffColor, rectAttrs);
        }
        //夜间模式的背景
        rectAttrs = compRoundRectAttr(1 - currentPos);
        drawRoundRect(canvas, switchOffColor, rectAttrs);

        float[] ovalAttrs;
        if(currentPos > 2.0/3){
            ovalAttrs = compOvalAttr(0);
        }else{
            ovalAttrs = compOvalAttr(1 - currentPos * 3/2);
        }
        float[] ovalShadeOffAttrs = compRoundRectShadeOffAttr(1 - currentPos * 3/2);
        int color = compColor(currentPos, DEFAULT_SPOT_ON_COLOR, DEFAULT_SPOT_OFF_COLOR);
        int colorIn = compColor(currentPos, DEFAULT_SPOT_ON_COLOR_IN, DEFAULT_SPOT_OFF_COLOR_IN);
        drawRoundRect(canvas, color, ovalShadeOffAttrs);
        drawOval(canvas, color, ovalAttrs);
        drawOvalIn(canvas, colorIn, ovalAttrs);
        drawCircleDot(canvas, DEFAULT_SPOT_OFF_COLOR, DEFAULT_SPOT_OFF_COLOR_IN, currentPos, ovalAttrs);//绘制月亮上的动态旋转的原点
        drawCircleDot2(canvas, DEFAULT_SPOT_OFF_COLOR, DEFAULT_SPOT_OFF_COLOR_IN, currentPos, ovalAttrs);
        drawCircleDot3(canvas, DEFAULT_SPOT_OFF_COLOR, DEFAULT_SPOT_OFF_COLOR_IN, currentPos, ovalAttrs);
        if(currentPos > 0.6) {
            drawStar(canvas, DEFAULT_SPOT_OFF_COLOR_IN, currentPos);//绘制闪烁的星星
        }

        int strokeColor = compColor(currentPos, DEFAULT_SWITCH_ON_COLOR_OUT, DEFAULT_SWITCH_OFF_COLOR_OUT);
        drawRoundRectStroke(canvas, strokeColor);
最后

具体的代码见我的Github,先写这么多,有空再来继续补全文章。这里是Github链接,欢迎star,fork...谢谢

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/13168.html

相关文章

  • Android夜间模式实践

    摘要:现在我采用的就是这种简单粗暴的方法,用户体验比较不友好,后期需要参考知乎的实现,改进实现。参考链接夜间模式最佳实践知乎和简书的夜间模式实现套路夜间模式,你所不知道的坑 前言 由于项目需要,近段时间开发的夜间模式功能。主流的方案如下: 1、通过切换theme实现 2、通过resource id映射实现 3、通过Android Support Library的实现 方案选择 切换the...

    junfeng777 评论0 收藏0
  • Android夜间模式官方api实现(AppCompatDelegate)

    摘要:比如在中设置为日间模式,而在当前中调用该会显示为夜间模式覆盖原来的模式。只作用于新生成的组件,对原先处于任务栈中的不起作用。当然可以提前在中保存好相关属性值重建时使用。 Android夜间模式官方api实现(AppCompatDelegate) Android夜间模式可以通过手动设置不同的Theme来实现,也有第三方框架可拿来用,Api 23.0.0后可以使用AppCompatDele...

    didikee 评论0 收藏0
  • 夜间模式切换的实现库,三行代码实现流畅切换

    摘要:用最简单的方式实现夜间模式,支持。例第四步页面调用代码在要立即切换效果的页面调用此方法在其他页面调用此方法设置切换夜间活日间模式切换日间模式切换夜间模式在调用代码调用三步,即可开始夜间之旅。 Implementation of night mode for Android. 用最简单的方式实现夜间模式,支持ListView、RecyclerView。 项目GitHub地址: ht...

    Worktile 评论0 收藏0
  • 简洁优雅地实现夜间模式

    摘要:而在正式版中,夜间模式也没有出现。如何开启这项功能,可以参考少数派的这一篇文章,帮你找回夜间模式的款应用。毫不夸张的说,夜间模式现在已经是阅读类的标配了。事实上,日间模式与夜间模式就是给定义并应用两套不同颜色的主题。 前言 Android 6.0 Marshmallow 预览版中曾经短暂出现过相关的夜间模式的功能,只是在正式版中被移除了,在Android 7.0 Nougat上,用户们...

    zhaofeihao 评论0 收藏0
  • 简洁优雅地实现夜间模式

    摘要:而在正式版中,夜间模式也没有出现。如何开启这项功能,可以参考少数派的这一篇文章,帮你找回夜间模式的款应用。毫不夸张的说,夜间模式现在已经是阅读类的标配了。事实上,日间模式与夜间模式就是给定义并应用两套不同颜色的主题。 前言 Android 6.0 Marshmallow 预览版中曾经短暂出现过相关的夜间模式的功能,只是在正式版中被移除了,在Android 7.0 Nougat上,用户们...

    tomlingtm 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<