Android自定义一个车牌字母选择键盘

news2024/11/25 6:37:29

在一般和车相关的应用,难免会和车牌打交道,组成车牌的要素,国内无非就是省份简称+地区代码+英文或者数字组成,比如京A12345,在需要输入车牌的功能上,就需要有省份简称键盘和英文数字键盘了,在上篇的文章《Android自定义一个省份简称键盘》,总结了省份简称键盘的实现,本篇我们继续完成英文和数字键盘的实现。

今天的内容大致如下:

1、最终实现效果及简单分析

2、设置属性,制定可扩展效果

3、部分源码剖析

4、开源地址及使用总结

一、最终实现效果及简单分析

以上就是本篇文章最终要实现的效果,和省份简称键盘不同的是,数据源上和边距有所差别之外,其他的实现方式均是一样的,采用外部垂直LinearLayout,内部多个横向的LinearLayout的搭配方式。

需要注意的是,英文和数字键盘,默认状态下,顶部的数字是禁止的,也就是输入完地区代码之后,数字的禁止状态才会释放;由于距离左右的边距不同,其在数据源的判断上也会有不同,这个也是需要注意的。

二、设置属性,制定可扩展效果

其相关属性和上篇的省份键盘基本上没有太大的出入,主要就是动态化设置,设置一些,文字的背景,大小,颜色以及格子之间的编辑等,大概罗列了以下属性:

属性

类型

概述

ek_background

color

整体的背景颜色

ek_rect_spacing

dimension

格子的边距

ek_rect_height

dimension

格子的高度

ek_rect_margin_top

dimension

格子的距离上边

ek_margin_left_right

dimension

左右距离

ek_margin_top

dimension

上边距离

ek_margin_bottom

dimension

下边距离

ek_rect_background

reference

格子的背景

ek_rect_select_background

reference

格子选择后的背景

ek_rect_text_size

dimension

格子的文字大小

ek_rect_text_color

color

格子的文字颜色

ek_rect_select_text_color

color

格子的文字选中颜色

ek_is_show_complete

boolean

是否显示完成按钮

ek_complete_text_size

dimension

完成按钮文字大小

ek_complete_text_color

color

完成按钮文字颜色

ek_complete_text

string

完成按钮文字内容

ek_complete_margin_top

dimension

完成按钮距离上边

ek_complete_margin_bottom

dimension

完成按钮距离下边

ek_complete_margin_right

dimension

完成按钮距离右边

ek_other_lines_margin

dimension

其他行边距

ek_is_num_prohibit

boolean

数字是否禁止

ek_text_prohibit_color

color

数字禁止颜色

ek_text_click_effect

boolean

是否触发点击效果,true点击后背景消失,false不消失

设置回调函数

方法

概述

keyboardContent

获取点击的省份简称简称信息

keyboardDelete

删除省份简称简称信息

keyboardComplete

键盘点击完成

openProhibit

打开禁止(使领学港澳),使其可以点击

三、部分源码剖析

这里只贴出部分的关键性代码,整体的代码,大家滑到底部查看源码地址即可。

定义字母和数字数组

   private val mEnglishList = arrayListOf(
        "1", "2", "3", "4", "5", "6", "7", "8", "9", "0",
        "Q", "W", "E", "R", "T", "Y", "U", "O", "P",
        "A", "S", "D", "F", "G", "H", "J", "K", "L",
        "Z", "X", "C", "V", "B", "N", "M"
    )

定义遍历数字和字母

由于在数据源上使用的是同一个,那么需要做截取分别进行遍历,便于控制左右的边距和本身的格子大小。

 //遍历数字
        eachData(mEnglishList.subList(0, 10), mLength, true)
        //遍历字母
        eachData(mEnglishList.subList(10, mEnglishList.size), mLength - 1, false)
        //追加最后一个删除按钮View,动态计算宽度
        addEndView(mLineLayout)

遍历数据

遍历数据的逻辑和上篇保持一致,当和定义的长度取模为0时,就需要换行,换行就是重新创建一个水平的LinearLayout,添加至垂直的LinearLayout之中,需要做判断的是,左右的边距。

/**
     * AUTHOR:AbnerMing
     * INTRODUCE:遍历数据
     */
    private fun eachData(
        list: List<String>,
        len: Int,
        isNumber: Boolean = false
    ) {
        list.forEachIndexed { index, s ->
            if (index % len == 0) {
                //重新创建,并添加View
                mLineLayout = createLinearLayout()
                mLineLayout?.weightSum = len.toFloat()
                addView(mLineLayout)
                val params = mLineLayout?.layoutParams as LayoutParams
                params.apply {
                    topMargin = mRectMarginTop.toInt()
                    height = mRectHeight.toInt()
                    if (isNumber) {
                        //是数字
                        leftMargin = mMarginLeftRight.toInt()
                        rightMargin = mMarginLeftRight.toInt() - mSpacing.toInt()
                    } else {
                        //是字母
                        leftMargin = mOtherLinesMargin.toInt()
                        rightMargin = mOtherLinesMargin.toInt() - mSpacing.toInt()
                    }
                    mLineLayout?.layoutParams = this
                }
            }

            //创建文字视图
            val textView = TextView(context).apply {
                text = s
                //设置文字的属性
                textSize = px2sp(mRectTextSize)
                //禁止
                if (isNumber) {
                    //是数字
                    if (mNumProhibit) {
                        setTextColor(mRectTextColor)
                    } else {
                        setTextColor(mNumProhibitColor)
                    }
                } else {
                    setTextColor(mRectTextColor)
                }
                setBackgroundResource(mRectBackGround)
                gravity = Gravity.CENTER
                setOnClickListener {
                    //每个格子的点击事件
                    if (isNumber && !mNumProhibit) {
                        //如果是数字,根据规则暂时不触发点击
                        return@setOnClickListener
                    }
                    changeTextViewState(this)
                }
            }
            //是数字
            if (isNumber) {
                mTempTextViewList.add(textView)
            }
            addRectView(textView, mLineLayout, 1f)
        }
    }

添加视图

设置每个格子的宽高和权重。

 /**
     * AUTHOR:AbnerMing
     * INTRODUCE:追加视图
     */
    private fun addRectView(view: View, layout: LinearLayout?, w: Float) {
        layout?.addView(view)
        val textParams = view.layoutParams as LayoutParams
        textParams.apply {
            weight = w
            width = 0
            height = LayoutParams.MATCH_PARENT
            //每行的最后一个
            rightMargin = mSpacing.toInt()
            view.layoutParams = this
        }

    }

至于最后一个删除按钮,也需要动态的计算其本身的宽高,基本上和上篇一致,就不过多赘述了。

四、开源地址及使用总结

开源地址:https://github.com/AbnerMing888/EnglishKeyboardView

关于如何使用,有两种方式,一种是下载源码,直接把源码复制出来,二是可以使用以下的远程Maven依赖方式。

Maven具体调用

1、在你的根项目下的build.gradle文件下,引入maven。

allprojects {
    repositories {
        maven { url "https://gitee.com/AbnerAndroid/almighty/raw/master" }
    }
}

2、在你需要使用的Module中build.gradle文件下,引入依赖。

dependencies {
    implementation 'com.vip:board:1.0.0'
}

代码使用

<com.vip.board.EnglishKeyboardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

总结

属性配置了有很多,可以实现多种自定义的相关效果,大家可以查找第二项中的属性介绍,进行自定义配置,还是那句话,本身的实现方式有很多种,本篇只是其中的一个简单的案例,仅供大家作为一个参考。

自定义英文和数字键盘,大家有没有发现了少了一个字母,为什么会没有这个字母呢?你知道原因吗?

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/614628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习(自编码器)

深度学习目录 自适应线性单元 (Widrow and Hoff, 1960)神经认知机 (Fukushima, 1980)GPU-加速 卷积网络 (Chellapilla et al., 2006)深度玻尔兹曼机 (Salakhutdinov and Hinton, 2009a)无监督卷积网络 (Jarrett et al., 2009b)GPU-加速 多层感知机 (Ciresan et al., 2010)分布…

人工影响天气期末复习笔记

&#xff08;一&#xff09;什么是人工影响天气 利用自然云微物理不稳定性&#xff0c;通过一定的技术方法改变云的微结构&#xff0c;从而改变云降水的发展过程&#xff0c;从而达到增加降水&#xff0c;防雹&#xff0c;消云雾等目的 &#xff08;二&#xff09;为什么要人工…

【历史上的今天】6 月 6 日:世界 IPv6 启动纪念日;《俄罗斯方块》发布;小红书诞生

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 6 月 6 日&#xff0c;在 2019 年的今天&#xff0c;工信部正式发放 5G 牌照。这一天&#xff0c;有四家企业被颁发了基础电信业务经营许可证&#xff0c;从此…

社区团购系统源码后台解析

近年来&#xff0c;随着购物方式的改变&#xff0c;社区团购可以说是越来越受关注了&#xff0c;大家应该对社区团购多多少少有一些认知&#xff0c;其实社区团购这样的商业模式拥有强大的赚钱的潜力&#xff0c;主要就是因为它的运营成本低&#xff0c;而且上手也不需要很复杂…

FPGA设计的指导性原则 (四)

在FPGA Express/FPGA Compiler II中,用鼠标右键单击编译后的芯片图标, 在弹出的命令对话框中选择“Edit Constraints”命令编辑综合约束文件(扩展 名为CTL),选择端口(Ports)选项卡,指定所需信号的全局时钟域为 “DONT USE”。图22所示为在FPGA Express综合约束编辑器中…

私有化部署低代码开发工具:jvs-rules 规则引擎决策流参数说明

JVS规则引擎决策调用 通过决策流水号查询入参变量 [请求参数]决策流 ​ GET/mgr/risk//test/parameter/flow/{no} 请求数据类型 application/x-www-form-urlencoded 响应数据类型 [ "*/*" ] 请求参数 参数名称 参数说明 请求类型 是否必须 数据类型 sch…

【Flutter混合开发】开发一个简单的快速启动框架

目录 前言启动插件Flutter代码Android代码IOS代码 启动模块使用android端ios端 前言 因为在移动端中启动Flutter页面会有短暂空白&#xff0c;虽然官方提供了引擎预热机制&#xff0c;但是需要提前将所有页面都进行预热&#xff0c;这样开发成本较高&#xff0c;在研究了闲鱼的…

通过点引导掩码表示的弱半监督实例分割

文章目录 The Devil is in the Points: Weakly Semi-Supervised Instance Segmentation via Point-Guided Mask Representation摘要本文方法Weakly Semi-Supervised Instance Segmentation using Point LabelsMask Refinement Network 实验结果消融实验 The Devil is in the Po…

【JavaEE】HTTP状态码-HTTP数据报的构造

HTTP状态码HTTP数据报的构造 文章目录 JavaEE & HTTP状态码 & HTTP数据报的构造1. HTTP状态码1.1 200 - OK1.2 404 - Not Found1.3 403 - Forbidden1.4 500 - Internal Server Error1.5 504 - Gateway Timeout1.6 302/301 重定向 2. 构造HTTP请求2.1 浏览器搜索栏输入u…

Express应用之记账本项目总结

前言 在学完nodejs相关知识后第一个实践就是这个记账本项目&#xff0c;本篇文章是对项目遇到的问题的总结。 先聊聊技术栈&#xff1a; 前端技术&#xff1a;h5结合bootstrap框架&#xff1b; 后端技术&#xff1a;nodejsExpress框架lowdb数据库。 gitee地址&#xff1a;ht…

FinalShell界面左侧为什么能够监测系统指标动态变化的原理并用python实现

前言&#xff1a; 我们可以看出FinalShell是用Java写的&#xff0c;具体怎么看出来的&#xff0c;不能光看界面logo是Java的logo&#xff0c;还要进它的安装目录下进行查看是否真是用Java编写的&#xff01;&#xff01;&#xff01; 具体查看如下&#xff1a; 查看finalshe…

软件外包开发在线监测工具

软件系统上线后需要在线网络工具监测系统的运行&#xff0c;这样在系统出现故障时第一时间通知到系统维护人员&#xff0c;对于软件系统的稳定运行是必不可少的监测工具。今天和大家分享一些常用的在线监测工具&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#…

Vue.js 中的 TypeScript 支持是什么?如何使用 TypeScript?

Vue.js 中的 TypeScript 支持 Vue.js 是一款流行的前端框架&#xff0c;它提供了一种简单、灵活的方式来构建用户界面。随着 TypeScript 的普及&#xff0c;Vue.js 也开始支持 TypeScript&#xff0c;使得开发者可以使用类型检查等 TypeScript 特性来提高代码质量和可维护性。…

看完这篇卡尔曼滤波原理,我被惊到了!

在网上看了不少与卡尔曼滤波相关的博客、论文&#xff0c;要么是只谈理论、缺乏感性&#xff0c;或者有感性认识&#xff0c;缺乏理论推导。能兼顾二者的少之又少&#xff0c;直到我看到了国外的一篇博文&#xff0c;真的惊艳到我了&#xff0c;不得不佩服作者这种细致入微的精…

Vue-- 锚点实现左右两栏联动--scrollIntoView方法

官网&#xff1a;scrollintoView 通过滚动浏览器窗口或某个容器元素&#xff0c;调用元素就可以出现在视窗中。 利用scrollIntoView() 函数 默认是true document.getElementById(需要滚动的div的id).scrollIntoView() 如果给该方法传入true作为参数&#xff0c;或者不传入任何参…

什么是 Vue.js 中的 computed 属性?

什么是 Vue.js 中的 computed 属性&#xff1f; 在 Vue.js 中&#xff0c;computed 属性是一个非常重要的概念。它提供了一种方便的方式来计算和监听 Vue.js 实例中的属性&#xff0c;从而使得代码更加简洁、易于维护。在本文中&#xff0c;我们将详细介绍 computed 属性的原理…

【SVN】设置ubuntu下SVN服务开机自启

目录 0.背景环境 1.开机自启步骤 0.背景环境 1&#xff09;ubuntu下&#xff0c;已搭建好svn版本库&#xff0c;具体搭建方法参考文末的其他博客链接 2&#xff09;在搭svn服务器的过程中&#xff0c;发现ubuntu重启后&#xff0c;svn服务就关闭了 svn正常开启时见下图 所以…

ps技术的革命创新-photoshop beta版

Photoshop 2023 Beta功能介绍 全新的Generative Fill功能现已加入Photoshop Beta桌面应用程序&#xff0c;可以让用户在非破坏性的基础上轻松地添加、扩展或删除图像内容&#xff0c;实现令人惊喜、高兴和震撼的真实效果&#xff0c;仅需数秒。使用此功能&#xff0c;只需要选…

Java编程中必须掌握的抽象类和接口

抽象类与接口是J--a中两个重要的概念&#xff0c;都用于实现多态性和代码重用。在本文中&#xff0c;将会介绍这两个概念的特点以及如何使用它们来实现继承父类同时实现接口&#xff0c;还有接口的多继承。 老规矩&#xff0c;思维导图我已经整理好放在文末&#xff0c;需要自…

【ARM AMBA AXI 入门 1 - AXI 握手协议】

文章目录 1.1 AXI 双向握手机制简介1.1.1 信号列表1.1.2 双向握手目的1.1.3 握手过程 1.2 数据通路的握手要求1.2.1 读数据通路1.2.2 读地址通路1.2.3 写数据通路1.2.4 写地址通路1.2.5 写回复通路1.2.6 全信号 1.3 不同数据通路间的约束关系1.3.1 读操作约束关系1.3.2 写操作约…