专栏首页微卡智享实战|流式代码封装及ViewBadger角标的应用(附源码)

实战|流式代码封装及ViewBadger角标的应用(附源码)

学更好的别人,

做更好的自己。

——《微卡智享》

本文长度为4220,预计阅读10分钟

前言

本来这章只是想讲一个Android中的角标ViewBadger的使用,在写的过程中想起来前面文章中Glide的开源库加载网络图片用一行代码就可以直接实现了,这种代码风格我们叫做流式代码,写起来非常的方便,所以自己也想着做一个ViewBadger静态类,从外部用流式代码可以直接实现。

流式代码

下面这张图就是自己封装好的ViewBadger的类调用的方式,可以看出来就是用的流式代码的风格

实现效果

流式代码实现方法

流式代码其实和写静态类的方式基本差不多,只不过在后面觉得可以再扩展的方法里面加上类的反回值即可

在Kotlin中我们定义静态类直接用object,然后对应的函数方法后面都返回当前静态类,如下图:

ViewBadger介绍

微卡智享

ViewBadger是一个很方便的应用程序徽章的开源库,不过很长时间没有更新了,实现的效果如下图

使用方法

首先在工程的build.gradle中加入依赖项

android {
    repositories {
        jcenter()
        maven { url "https://jitpack.io" }
    }
}

dependencies {
    implementation 'com.github.deano2390:android-viewbadger:1.0.0'
}

调用ViewBadger方法

//获取添加“徽章”的目标View
  View target = (TextView) findViewById(R.id.text);
  BadgeView badge = new BadgeView(this, target);
  badge.setText("1");
  //设置文本颜色
  badge.setTextColor(Color.BLACK);
  //设置背景颜色
  badge.setBadgeBackgroundColor(Color.YELLOW);
  //显示
  badge.show();

使用上面的方法,ViewBadger就可以显示出来了。ViewBadger中基本的方法也是什么settext,settextsize,setTextColor等,这块我就不再说了,下面列几个别的可能用到的方法

方法

参数

说明

badgePosition

Int

徽章存在的位置,默认的右上,可以自己通过BadgerView中的参数定义

setBadgeMargin

Int

设置位置的水平或垂直的偏移量

increment

Int

计数增加,增加个数参数中自己输入

decrement

Int

计数减少,减少个数参数中自己输入

toggle

改变当前状态,如果是显示则隐藏,如果隐藏则显示

基本上上面ViewBadger中的常用方法都已经列出来了,接下来我们就说说封装的静态类的思路

思路

1. 静态类中定义一个当前正在使用的ViewBadger,然后再定义一个ViewBadger的集合

2. 写一个getBadgeView方法用于获取当前的VIewBadger,获取方式为先从集合中查找对应的ViewBadger,如果没有则进行创建。

3. 针对获取到的ViewBadger进行操作

核心方法

//获取当前的badgeview方法
    private fun getBadgeView(context: Context, view: View) {
        try {
            badgeView = badgeviewlist.first { it.target == view }
            Log.i(TAG, "text:" + badgeView.text.toString())
        } catch (e: Exception) {
            Log.i(TAG, e.message.toString())
            badgeView = BadgeView(context, view)
            badgeviewlist.add(badgeView)
        }
    }

上面的方法就是按思路2中写的首先从集合里查找,如果不存在则直接创建并加入到集合中的实现,外部再通过写一个build的方法进行调用。

//创建badgeView
    fun build(context: Context, view: View): BadgeViewUtil {
        getBadgeView(context, view)
        return BadgeViewUtil
    }

完整的静态类

package dem.vac.viewbagder

import android.content.Context
import android.graphics.Color
import android.util.Log
import android.view.View
import android.view.animation.Animation
import com.readystatesoftware.viewbadger.BadgeView

/**
 * 作者:Vaccae
 * 邮箱:3657447@qq.com
 * 创建时间:2019-12-24 10:49
 * 功能模块说明:
 */
object BadgeViewUtil {
    private val TAG = "badgeview"
    //定义存在的集合
    private val badgeviewlist = ArrayList<BadgeView>()
    //当前操作的badgeView
    private lateinit var badgeView: BadgeView

    //获取当前的badgeview方法
    private fun getBadgeView(context: Context, view: View) {
        try {
            badgeView = badgeviewlist.first { it.target == view }
            Log.i(TAG, "text:" + badgeView.text.toString())
        } catch (e: Exception) {
            Log.i(TAG, e.message.toString())
            badgeView = BadgeView(context, view)
            badgeviewlist.add(badgeView)
        }
    }

    //创建badgeView
    fun build(context: Context, view: View): BadgeViewUtil {
        getBadgeView(context, view)
        return BadgeViewUtil
    }

    //设置文字
    fun setText(title: String):BadgeViewUtil {
        badgeView.text = title
        return BadgeViewUtil
    }

    //设置字体大小
    fun setTextSize(size: Float): BadgeViewUtil {
        badgeView.setTextSize(size)
        return BadgeViewUtil
    }

    //设置位置微调
    fun setBadgeMargin(size: Int = 2): BadgeViewUtil {
        badgeView.setBadgeMargin(2)
        return BadgeViewUtil
    }

    fun setBadgeMargin(size: Int, size2: Int): BadgeViewUtil {
        badgeView.setBadgeMargin(size, size2)
        return BadgeViewUtil
    }

    //设置颜色
    fun setColor(
        textcolor: Int = Color.WHITE,
        bgcolor: Int = Color.RED
    ): BadgeViewUtil {
        //设置文本颜色
        badgeView.setTextColor(textcolor)
        //设置背景颜色
        badgeView.badgeBackgroundColor = bgcolor
        return BadgeViewUtil
    }

    //设置位置
    fun setPosition(position: Int = BadgeView.POSITION_TOP_RIGHT): BadgeViewUtil {
        badgeView.badgePosition = position
        return BadgeViewUtil
    }

    //计数加一
    fun increment(offset: Int = 1): BadgeViewUtil {
        badgeView.increment(offset)
        return BadgeViewUtil
    }

    //计数减一
    fun decrement(offset: Int = 1): BadgeViewUtil {
        badgeView.decrement(offset)
        if (badgeView.text == "0") {
            badgeView.hide()
        }
        return BadgeViewUtil
    }

    //修改当前状态,如果显示则隐藏,如果隐藏则显示
    fun toggle(animation: Animation? = null) {
        if (animation == null) badgeView.toggle()
        else badgeView.toggle(animation, animation)
    }

    //显示
    fun show(animation: Animation? = null) {
        if (animation == null) badgeView.show()
        else badgeView.show(animation)
    }

    //隐藏
    fun hide(animation: Animation? = null) {
        if (animation == null) badgeView.hide()
        else badgeView.hide(animation)
    }

    //获取文本
    fun getText(): String {
        return badgeView.text.toString()
    }

}

源码地址

https://github.com/Vaccae/ViewBagderTest.git

写在最后,刚写完这篇后,我在网上又找到了BadgeView的开源库,里面的扩展性要比现在这个ViewBadger多了不少,调用方式也是可以直接用流式代码风格,而且调用的方法和我这个基本差不多,所以用起也看这个很非常方便,地址为

https://github.com/qstumn/BadgeView.git

如果想用徽章的朋友可以直接用上面这个,我的这篇更多的是在于让大家了解了一下怎么样写流式的静态类。

本文分享自微信公众号 - 微卡智享(VaccaeShare),作者:Vaccae

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-01-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android利用SurfaceView显示Camera图像爬坑记(三)

    前一章《Android利用SurfaceView显示Camera图像爬坑记(二)》我们已经利用SurfaceTexture通过生成的Bitmap图片用canva...

    Vaccae
  • 【干货】C++ OpenCV案例实战---卡号获取

    前面我们学习了《【干货】C++ OpenCV案例实战---卡片截取(附代码)》,根据照出来的照片直接截取到卡片后,在卡片识别里面下一步我们肯定就会用到了卡号的获...

    Vaccae
  • c# 调用Oracle带有游标的存储过程

    我们在写Oracle存储过程时经常会需要返回数据,像这种方式一般都输出游标的方式。我们今天就来做个用C#程序调用Oracle带有游标输出的存储过程并展示出数据。

    Vaccae
  • IC重大项目落户南京浦口高新区,AI芯片“双目视觉”成亮点

    同时,南京集成电路产业联盟正式成立,为支持集成电路产业垂直整合及并购重组,建立总规模200亿美元的南京市集成电路产业投资基金。

    镁客网
  • 重温统计学③集中趋势

    集中趋势(Central Tendency)是指一组数据项某一中心值靠拢的程度,它反映了一组数据中心点的位置所在。

    统计学家
  • 后台优化:使用应用性能管理工具

    在没有应用性能管理工具(APM,即application performance management )的时候,当我们需要对应用优化,我们就需要不断的调试、阅...

    Phodal
  • 使用Python快速制作可视化报表

    pyecharts是一个用于生成Echarts图标的类库。实际就是Echarts与Python的对接。

    py3study
  • 万能的python-画图

    pyecharts是一个用于生成Echarts图标的类库。实际就是Echarts与Python的对接。

    py3study
  • Vue框架Element UI教程-时间选择器(二)

    Element UI手册:https://cloud.tencent.com/developer/doc/1270 中文文档:http://element-c...

    祈澈菇凉
  • OLEDB 枚举数据源

    在之前的程序中,可以看到有这样一个功能,弹出一个对话框让用户选择需要连接的数据源,并输入用户名和密码,最后连接;而且在一些数据库管理软件中也提供这种功能——能够...

    Masimaro

扫码关注云+社区

领取腾讯云代金券