热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

AndroidUI设计系列之自定义TextView属性实现带下划线的文本框(4)

这篇文章主要介绍了AndroidUI设计系列之自定义TextView属性实现带下划线的文本框,具有一定的实用性和参考价值,感兴趣的小伙伴们可以参考一下

在Android开发过程中,如果Android系统自带的属性不能满足我们日常开发的需求,那么就需要我们给系统控件添加额外的属性了。假如有个需求是实现带下划线的文本显示(下划线),如果不使用自定义属性的话实现起来也不太难(起码我认为的实现方式是有许多种的),今天就讲解一下如何使用自定义属性来实现上述带下划线的文本框吧。还好Android中自定义属性不是很复杂,也可以归纳为三步走吧。
老规矩,还是先贴出工程目录吧:

一、添加属性文件

在values文件夹中新建attrs.xml文件,在文件中新建属性文件,代码如下:

<&#63;xml version="1.0" encoding="utf-8"&#63;> 
 
 
  
  
  
  
  
  
  
  
  
 
 

其中需要说明的是,自定义属性文件的根节点页是,在根节点内创建你所需要的属性值,自定义属性的节点是以开始的,它表示的是个属性集可以包含众多属性,其中name="BorderTextView"是属性集名。接着在中定义我们需要的以为节点的属性,attr表示属性的意思name表示当前属性的名称,format表示的是属性值的类型,例如我们当前定义的属性类型为boolean类型,也就是说当前定义的属性取值只能为boolean类型的,format可以表示的的类型有好多种,最常见的如:string,boolean,integer,dimension,reference等这,里就不再详细讲解了,如果谁有疑问,可以自己动手问问度娘,她知道的比我多,呵呵

二、使用自定义属性

在attrs.xml文件中定义好了属性,就可以在布局文件中使用了,接下来看看在布局文件中如何使用自定义属性吧,代码如下:

<&#63;xml version="1.0" encoding="utf-8"&#63;> 
 
  
 
  
  
 
  
  
 
  
  
 
  
  
 
  
  
 

使用自定义控件也很简单就是包名+自定义控件名,为了使用我们自定义的属性,必须在布局文件的根节点中加上xmlns:greendroid="http://schemas.android.com/apk/res/com.llew.e"这句话,其中xmlns:greendroid表示的是命名空间名称,greendroid只是个名字是我们使用自定义属性的前缀,可以随便取值(只要不是android就行了),com.llew.e是在manifest中的package的对应值,使用自定义属性就想代码中的那样:greendroid:layout_borderLeft="true",(*^__^*) 嘻嘻……,是不是可简单?

三、根据自定义属性值做相应操作

完成自定义属性文件之后,我们就来为控件添加自定义的属性了,自定义控件我认为最简单的实现就是使用继承,在继承的基础上进行扩充来实现我们所要的功能,所以为了实现带边框的文本组件,我就直接继承了TextView组件,在它的基础上进行扩充了,代码如下:

public class BorderTextView extends TextView { 
 
 /** 
 * 四周是否带有边框【true:四周带有边框】【false:四周不带边框】 
 */ 
 boolean borders = false; 
 /** 
 * 左边是否带有边框【true:左侧带有边框】【false:左侧不带边框】 
 */ 
 boolean borderLeft = false; 
 /** 
 * 顶部是否带有边框【true:顶部带有边框】【false:底部不带边框】 
 */ 
 boolean borderTop = false; 
 /** 
 * 右侧是否带有边框【true:右侧带有边框】【false:右侧不带边框】 
 */ 
 boolean borderRight = false; 
 /** 
 * 底部是否带有边框【true:底部带有边框】【false:底部不带边框】 
 */ 
 boolean borderBottom = false; 
 /** 
 * 边框颜色 
 */ 
 String textColor = "#ff000000"; 
 
 public BorderTextView(Context context) { 
 this(context, null); 
 } 
 
 public BorderTextView(Context context, AttributeSet attrs) { 
 this(context, attrs, android.R.attr.textViewStyle); 
 } 
 
 public BorderTextView(Context context, AttributeSet attrs, int defStyle) { 
 super(context, attrs, defStyle); 
 // 获取自定义属性集 
 TypedArray typedArray = context.obtainStyledAttributes(attrs, 
  R.styleable.BorderTextView); 
 // 是否设置全部边框,默认为false 
 borders = typedArray.getBoolean( 
  R.styleable.BorderTextView_layout_borders, false); 
 // 是否设置左侧边框,默认为false 
 borderLeft = typedArray.getBoolean( 
  R.styleable.BorderTextView_layout_borderLeft, false); 
 // 是否设置顶部边框,默认为false 
 borderTop = typedArray.getBoolean( 
  R.styleable.BorderTextView_layout_borderTop, false); 
 // 是否设置右侧边框,默认为false 
 borderRight = typedArray.getBoolean( 
  R.styleable.BorderTextView_layout_borderRight, false); 
 // 是否设置底部边框,默认为false 
 borderBottom = typedArray.getBoolean( 
  R.styleable.BorderTextView_layout_borderBottom, false); 
 // 获取文本颜色值,用来画边框的,便于和文本颜色匹配 
 textColor = attrs.getAttributeValue( 
  "http://schemas.android.com/apk/res/android", "textColor"); 
 typedArray.recycle(); 
 } 
 
 @Override 
 public void draw(Canvas canvas) { 
 super.draw(canvas); 
 // 创建画笔 
 Paint paint = new Paint(); 
 // 获取该画笔颜色 
 int color = paint.getColor(); 
 // 设置画笔颜色 
 paint.setColor(Color.parseColor(textColor)); 
 // 如果borders为true,表示左上右下都有边框 
 if (borders) { 
  canvas.drawLine(0, 0, 0, this.getHeight() - 1, paint); 
  canvas.drawLine(0, 0, this.getWidth() - 1, 0, paint); 
  canvas.drawLine(this.getWidth() - 1, 0, this.getWidth() - 1, 
   this.getHeight() - 1, paint); 
  canvas.drawLine(0, this.getHeight() - 1, this.getWidth() - 1, 
   this.getHeight() - 1, paint); 
 } else { 
  if (borderLeft) { 
  // 画左边框线 
  canvas.drawLine(0, 0, 0, this.getHeight() - 1, paint); 
  } 
  if (borderTop) { 
  // 画顶部边框线 
  canvas.drawLine(0, 0, this.getWidth() - 1, 0, paint); 
  } 
  if (borderRight) { 
  // 画右侧边框线 
  canvas.drawLine(this.getWidth() - 1, 0, this.getWidth() - 1, 
   this.getHeight() - 1, paint); 
  } 
  if (borderBottom) { 
  // 画底部边框线 
  canvas.drawLine(0, this.getHeight() - 1, this.getWidth() - 1, 
   this.getHeight() - 1, paint); 
  } 
 } 
 // 设置画笔颜色归位 
 paint.setColor(color); 
 } 
} 

其实给BorderTextView添加边框也是很简单,原理就是其draw方法中绘画出边框罢,我们都知道每一个View控件在屏幕上显示出来大致可以归纳为三大步骤,首先调用View控件的onMesure方法,其次调用View控件的onLayout方法,再次调用View控件的onDraw方法,所以我们只需要在draw方法中绘制出边框就行了,绘制边框的步骤很简单,代码注释也很详细,就不再详细讲解了

最后运行一下程序来看一下效果图吧,呵呵

好了,今天的自定义属性实现带边框的TextView控件就讲解完了,谢谢大家的阅读。

源码下载:Android UI实现带下划线的文本框

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
  • 本文深入探讨了 com.example.android.sunshine.data.TestUtilities 中 validateThenCloseCursor() 方法的使用方法及其代码示例,旨在帮助开发者更好地理解和应用该方法。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 本文介绍了多个关于JavaScript的书籍资源、实用工具和编程实例,涵盖从入门到进阶的各个阶段,帮助读者全面提升JavaScript编程能力。 ... [详细]
  • 分享一个简化版的Silverlight链接图项目:Link Map Simplified
    本文介绍了一个使用Silverlight开发的可视化工具,主要用于展示和操作复杂的实体关系图(Graph)。该工具在犯罪调查系统中得到了广泛应用,帮助用户直观地获取和理解相关信息。 ... [详细]
  • 探讨如何从数据库中按分组获取最大N条记录的方法,并分享新年祝福。本文提供多种解决方案,适用于不同数据库系统,如MySQL、Oracle等。 ... [详细]
author-avatar
太阳神夜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有