当前位置: 首页 > news >正文

Android鬼点子 使用Kotlin编写的颜色选择器

正式入坑Kotlin,今后的自定义View不出意外都将会使用Kotlin实现,这次的demo放到了Github上哟,链接看文末。

这个颜色选择器分为3个部分,最外层白-中间选中色-黑,中层 红绿蓝渐变,中心显示选中颜色。

中间的红绿蓝渐变使用的6钟颜色渐变完成:

mSweepGradient = SweepGradient((width / 2).toFloat(), (width / 2).toFloat(), intArrayOf(0xffff0000.toInt(), 0xffffff00.toInt(), 0xff00ff00.toInt(), 0xff00ffff.toInt(), 0xff0000ff.toInt(), 0xffff00ff.toInt(), 0xffff0000.toInt()), floatArrayOf(0f, 1 / 6f, 1 / 3f, 1 / 2f, 2 / 3f, 5 / 6f, 1f))
复制代码

这个控件的难点是怎么知道手指触摸点的颜色,本来是想通过计算得出,因为红绿蓝的渐变是与角度相关的。但是想了想,计算量过大,于是换成了现在的方式。

首先,把红绿蓝的渐变画在一个bitmap上,然后通过手指触摸坐标,在bitmap上通过坐标获取触摸点的颜色。代码中就是bufferCanvas和bitmap。就是传说中双缓存的套路。

控件默认等宽高(宽或高较小的为准),然后是说明一下变量,方便大家使用的时候修改。

使用的方式很简单,直接放在xml里面,然后通过代码获取选中颜色:

布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <top.greendami.mykotlinapp.PPColorPicker
        android:layout_marginTop="10dp"
        android:layout_centerHorizontal="true"
        android:id="@+id/PPColorPicker21"
        android:layout_width="200dp"
        android:layout_height="200dp" />

    <Button
        android:layout_centerInParent="true"
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="我是按钮"/>


</RelativeLayout>
复制代码

获取颜色

class MainActivity  : Activity(){
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        button.setOnClickListener {
            button.setBackgroundColor(PPColorPicker21.chooseColor)
            button.text = "RGB:${PPColorPicker21.rgb}"
        }
    }
}
复制代码

最后总结一下遇到Kotlin的坑,这是我第二篇使用Kotlin自定义View的文章了,上一次是使用AndroidStudio2.3,插件的方式。这一次是使用的AS3.0的第三个版本。环境搭建上完全没有遇坑,十分顺利。撸代码的时候,只有一个地方,一开始我继承的View,实现了只有一个参数的构造方法(但是我PPColorPicker的默认构造方法是实现的2个参数的那个)

class PPColorPicker(context: Context?, attrs: AttributeSet? = null) : View(context) {}
复制代码

这样的。问题是在Activity中一直找不到控件,无论是使用FindViewById还是直接用ID都不行。一直报空指针异常。改成2个参数的就可以了。

最后还是要安利一下Kotlin,特别是配合Anko,可以大大提高开发效率。

Github 求star。

相关文章:

  • 合唱队形
  • 复选框提交功能
  • [cb]UIGrid+UIStretch的自适应
  • 对于软件生产能解决到痛点的容器技术就是好!Wise2C睿云智合如何运行
  • 从零开始机器学习001-线性回归数学推导
  • 小白接口(OkayApi.com),免开发,直接可用的云端数据接口
  • C++代码书写规范——给新手程序员的一些建议
  • 成为优秀Java程序员的10大技巧
  • 2.6相对和绝对路径 2.7cd命令 2.8创建和删除目录mkdir/rmdir 2.9rm命令
  • debian 8 解压安装mysql(版本5.7.19)
  • 电脑网络连接问题汇总
  • 线程精进指南之线程池进阶
  • ifdef ANDROID总是不好用
  • 如何阅读slow日志
  • 11.18 Apache用户认证
  • python3.6+scrapy+mysql 爬虫实战
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • Fastjson的基本使用方法大全
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Laravel5.4 Queues队列学习
  • Python 反序列化安全问题(二)
  • React-Native - 收藏集 - 掘金
  • session共享问题解决方案
  • 半理解系列--Promise的进化史
  • 缓存与缓冲
  • 回流、重绘及其优化
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 坑!为什么View.startAnimation不起作用?
  • 你真的知道 == 和 equals 的区别吗?
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 用 Swift 编写面向协议的视图
  • ​Spring Boot 分片上传文件
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • ###STL(标准模板库)
  • #NOIP 2014# day.2 T2 寻找道路
  • #pragma once与条件编译
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (C语言)fread与fwrite详解
  • (转)shell调试方法
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • .bat批处理(六):替换字符串中匹配的子串
  • .Net CF下精确的计时器
  • .NET Framework .NET Core与 .NET 的区别
  • .net MySql
  • .NET 设计一套高性能的弱事件机制
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .net中调用windows performance记录性能信息
  • .php文件都打不开,打不开php文件怎么办
  • // an array of int
  • @AliasFor注解
  • @TableLogic注解说明,以及对增删改查的影响
  • [100天算法】-二叉树剪枝(day 48)
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯