老套路先看效果图:

一个特别简单的字母排序列表如上图:

先看下有哪些属性:

 <com.xiayiye.honorfirst.custom.CustomNumViewandroid:id="@+id/cn_view"android:layout_width="40dp"android:layout_height="match_parent"android:layout_alignParentRight="true"android:background="@android:color/holo_blue_bright"app:num_text_center="false"app:num_text_color="@android:color/white"app:num_text_left="true"app:num_text_right="true"app:num_text_size="20sp" />

非常简单,就加了五个自定义属性分别是:文字字母居中,居左,居右,文字字母大小,颜色等。如何自定义的呢?

1.我们需要在value文件夹下面新建一个attrs文件,然后定义一些属性如下:

<?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="CustomNumView"><attr name="num_text_color" format="reference|color" /><attr name="num_text_size" format="dimension" /><attr name="num_text_left" format="boolean" /><attr name="num_text_right" format="boolean" /><attr name="num_text_center" format="boolean" /></declare-styleable>
</resources>

然后写个类继承view。实现相关的三四个构造方法。字母是通过onDraw方法画上去的,具体计算步骤就不讲解了

然后通过TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomNumView);拿到自定义的xml文件里面的自己定义的相关属性

textColor = typedArray.getColor(R.styleable.CustomNumView_num_text_color, Color.WHITE);float dimension = typedArray.getDimension(R.styleable.CustomNumView_num_text_size, 10);isLeft = typedArray.getBoolean(R.styleable.CustomNumView_num_text_left, false);isCenter = typedArray.getBoolean(R.styleable.CustomNumView_num_text_center, false);isRight = typedArray.getBoolean(R.styleable.CustomNumView_num_text_right, false);typedArray.recycle();

上面就是拿到的自定义属性的五个属性方法

然后根据拿到的方法进行相应的逻辑判断处理后在xml布局中就可以使用了

 @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);for (int i = 0; i < data.length; i++) {String str = data[i];float textWidth = paint.measureText(str);float textHeight = bounds.height();
//            float x = geZiWidth * 0.5f - textWidth * 0.5f;float y = (geZiHeight * 0.5f + textHeight * 0.5f) + i * geZiHeight;float x = 0;if (isCenter) {//xml中定义了居中就居中显示x = geZiWidth * 0.5f - textWidth * 0.5f;} else if (isLeft) {//xml中定义了左边就左边显示x = 0;} else if (isRight) {//xml中定义了右边就右边显示x = geZiWidth - textWidth;} else {//默认居中x = geZiWidth * 0.5f - textWidth * 0.5f;}paint.getTextBounds(str, 0, str.length(), bounds);paint.setColor(selectNum == i ? Color.RED : textColor);canvas.drawText(str, x, y, paint);//            canvas.drawText(str, geZiWidth * 0.5f - paint.measureText(str) * 0.5f, getHeight()/26*(i+1), paint);}}

咱们来看下最终的效果图:

源码已上传GitHub:点击浏览

字母列表view源码页面:点击浏览

Android开发之自定义控件的基本介绍(附源码)相关推荐

  1. Android开发之拍照功能实现(附源码)

    大家好,这是一个简单的拍照功能,很简单的界面,一个显示图像区域SurfaceView一个"拍照"按钮.直接上代码! 1.CameraDemoActivity.java(主界面) p ...

  2. Android开发的单词本APP项目介绍及源码(大作业)

    该单词本APP的功能主要有两个: 1.翻译功能:调用百度翻译API实现 翻译界面图片如下: 2.收藏.添加单词的功能 点击右下角加号可进行手动添加单词记录: 也可在翻译界面(即本篇文章第一张图片),点 ...

  3. vscode中安装webpack_leaflet-webpack 入门开发系列一初探篇(附源码下载)

    前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载 webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址w ...

  4. Adroid游戏开发实例讲解(三)-小蝌蚪找妈妈附源码

    Adroid游戏开发实例讲解(三)-小蝌蚪找妈妈附源码 程序之美 从小就听着小蝌蚪找妈妈的故事长大,我相信小伙伴们一定都不陌生,因为小学课本中,我们早早的就学过了小蝌蚪找妈妈这篇文章,它既是一篇文章, ...

  5. 基于QT开发的音乐播放器(附源码)

    基于QT开发的音乐播放器(附源码) 一.简介 1.介绍 2.功能描述 3.系统功能层次模块图 4.各模块功能描述 (1)播放界面 (2)歌词 (3)歌曲信息 (4)歌曲列表 5.文件格式 6.运行环境 ...

  6. 小程序云开发实现登录与注册(附源码)

    小程序云开发实现登录与注册(附源码) 1. 看效果 2.wxss <view class="v1"><!-- v2父容器 子view使用绝对布局 -->&l ...

  7. 【Java游戏开发合集】毕业设计(附源码+资料+课件)

    为正在准备毕业设计的小伙伴们以及想自学一些Java练手项目,小编终于整理出了本套视频课程(附源码+资料+课件),快来白嫖吧!!! 视频教程链接: 全站最全Java游戏合集!毕业设计!(附源码课件)8款 ...

  8. 仿酷狗音乐播放器开发日志二十一 开发动态调色板控件(附源码)

    转载请说明原出处,谢谢~~ 上一篇仿酷狗日志结束后,整个换肤功能就只剩下调色板功能没有做了,我本以为会很简单,但是研究了酷狗的调色板功能后发现不是那么简单的事情.首先看一下酷狗的调色板的样子: 我原本 ...

  9. Android开发之购物车加减按钮(附加源码)

    老套路,先看效果图 直接上代码: package com.xiayiye.shopcarnumberadd.view;import android.content.Context; import an ...

最新文章

  1. 使用scrapy抓取股票代码
  2. Ubuntu14.04重启网卡不生效
  3. NFS mount.nfs: access denied by server while mounting 一个解决办法
  4. 【19行代码AC,简洁】1029 Median (25 分)
  5. 1491. Look and Say
  6. Swift - 警告提示框(UIAlertController)的用法
  7. 为什么vsdebug没有生成obj文件_用iPad实时扫描生成模型??两款实用App
  8. 【Python】如何解决“TabError: inconsistent use of tabs and spaces in indentation”问题
  9. 【我的物联网成长记7】物联网主流通信协议解读【华为云分享】
  10. 中移4G模块-ML302-OpenCpu开发-2-MQTT连接阿里云
  11. java 托盘开发_基于java开发之系统托盘的应用
  12. LightweightCTI开发实录(5)板卡适配器概述
  13. 2020牛客多校训练1 I 1or2(拆点拆边带花树一般图最大匹配)
  14. 网页设计软件列表HTML,【网站设计用什么软件】网页设计软件具体有哪些,常见的十种网页设计软件介绍!...
  15. EXPLORING BALANCED FEATURE SPACES FOR REP-RESENTATION LEARNING(2022.5.18)
  16. oracle里如何求及格率,统计出每个教师每门课的及格人数和及格率
  17. 使用OpenSSL库接口,实现AES CBC加密,基于X509 base64编码证书的RSA非对称加密例子
  18. 51单片机LCD1602液晶屏调试工具
  19. 关于STM32的SPI外设时钟分频对应的SCK速率
  20. 有苦有乐的算法 --- 一个int类型的数,换成二进制后,提取最右侧的1所在位置

热门文章

  1. php板块模板,有没有办法制作模板,但没有在板块php渲染它
  2. dockerclient 查看端口占用_docker 端口被占用问题解决
  3. form标签的action之前 加密_金士顿KC2000自加密功能测试
  4. 好吧,又是两分钟看完一道投机取巧的算法题
  5. python_装饰器
  6. Python - Seaborn可视化:图形个性化设置的几个小技巧
  7. Spork: Pig on Spark实现分析
  8. linux系统服务器可能被攻击的几种攻击方式
  9. SHD0新建屏幕变式
  10. c# gdi设置画刷透明