1.这次给大家带来了一个自定义控件:edittext,话不多说,老规矩先上图

2.控件继承自frameLayout,内部包含了3个子控件:editText,textView,imageView,其中editText是用于输入文字,textView的作用是显示“测试”的标签并执行移动缩小动画,imageView的作用是在输入文字后显示删除按钮。接下来是重点代码分析部分:

测量子控件的大小onMeasure():控件高度等于editText+textView的高度,为移动动画提供空间。

    private int measureHeight(int heightMeasureSpec) {int specMode = MeasureSpec.getMode(heightMeasureSpec);int specSize = MeasureSpec.getSize(heightMeasureSpec);int result = 0;if (specMode == MeasureSpec.EXACTLY) {result = specSize;} else {result = mEditText.getMeasuredHeight() + mLabel.getMeasuredHeight();result += getPaddingTop() + getPaddingBottom();result = Math.max(result, getSuggestedMinimumHeight());if (specMode == MeasureSpec.AT_MOST) {result = Math.min(result, specSize);}}return result;}

确认控件位置:onLayout()

editText的位置等于自身的高度+textView的高度

    @Overrideprotected void onLayout(boolean changed, int left, int top, int right, int bottom) {final int childLeft = getPaddingLeft();final int childRight = right - left - getPaddingRight();int childTop = getPaddingTop();final int childBottom = bottom - top - getPaddingBottom();layoutChild(mLabel, childLeft, childTop, childRight, childBottom);layoutChild(mEditText, childLeft, childTop + mLabel.getMeasuredHeight(), childRight, childBottom);layoutChild(mDel, childLeft, childTop, childRight, childBottom);}private void layoutChild(View child, int parentLeft, int parentTop, int parentRight, int parentBottom) {if (child.getVisibility() != GONE) {final FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) child.getLayoutParams();final int width = child.getMeasuredWidth();final int height = child.getMeasuredHeight();int childLeft;final int childTop = parentTop + lp.topMargin;if (child.getId() == mDel.getId()) {childLeft = parentLeft + lp.leftMargin + mEditText.getMeasuredWidth() - width - 10;} else {childLeft = parentLeft + lp.leftMargin;}Log.d("layoutChild", child.getId() + "位置:" + childLeft + ";" + childTop + ";" + (childLeft + width) + ";" + (childTop + height));child.layout(childLeft, childTop, childLeft + width, childTop + height);}}

最后一步绘制,并没有调用onDraw()放法,而是在控件init时,直接将xml布局文件添加到frameLayout parent上了。

        View rootView = inflate(context, R.layout.libui_edittextlabel, this);mEditText = (EditText) findViewById(R.id.libui_edittext_edittext);mLabel = (TextView) findViewById(R.id.libui_edittext_label);mDel = (ImageView) findViewById(R.id.libui_edittext_del);

到此控件绘制完毕。至于动画效果,参见源码:https://github.com/sougoucm/editTextView

转载于:https://www.cnblogs.com/androiddream/p/9258437.html

自定义控件-----输入框相关推荐

  1. Qt自定义控件(IP输入框,windows下)

    1.建立自定义控件项目 组代表后来能从哪里找到 剩下的点"下一步"就行了 2.编辑代码 在生成项目的cpp中添加自己的内容(没有.ui界面了,设计tab是灰色的) 放一下我的代码 ...

  2. QT自定义控件--键盘输入框

    一.效果展示 二.原理详解 这个键盘不是标准的键盘,而是个人项目中定制化的键盘控件,这个控件属于组合控件,不是通过QPinter绘制的,而是通过Qt自带的类相互结合自定义的控件.键盘采用QPushBu ...

  3. MFC中制作一个似命令行的输入框

    在做一个MFC软件的时候有一个这样的需求,就是要有类似与AutoCad的命令输入框,如下图所示: 本着不重写已有功能的原则,在MFC中发掘了一圈,没发现有可用的现成控件,上网搜了一下,发现有人做过,但 ...

  4. 介绍几个好用的android自定义控件

    首先看效果图, 看下这两个界面,第一个中用到了一个自定义的FlowRadioGroup,支持复合子控件,自定义布局: 第二个界面中看到了输入的数字 自动4位分割了吧:也用到了自定义的DivisionE ...

  5. ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇

    第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是行不 通.如果大家开发的是WinForm中的事件,之前的定义可能没有什 ...

  6. Android UI编程之自定义控件初步(下)——CustomEditText

    概述: 基于对上一篇博客<Android UI编程之自定义控件初步(上)--ImageButton>的学习,我们对自定义控件也有了一个初步的认识.那现在我们可以再试着对EditText进行 ...

  7. 编写Qt Designer自定义控件(一)——如何创建并使用Qt自定义控件

    在使用Qt Designer设计窗体界面时,我们可以使用Widget Box里的窗体控件非常方便的绘制界面,比如拖进去一个按钮,一个文本编辑器等.虽然Qt Designer里的控件可以满足我们大部分的 ...

  8. Android开发技巧——自定义控件之自定义属性

    Android开发技巧--自定义控件之自定义属性 掌握自定义控件是很重要的,因为通过自定义控件,能够:解决UI问题,优化布局性能,简化布局代码. 上一篇讲了如何通过xml把几个控件组织起来,并继承某个 ...

  9. Qt编写自定义控件及插件的使用

    在使用Qt Designer设计窗体界面时,我们可以使用Widget Box里的窗体控件非常方便的绘制界面,比如拖进去一个按钮,一个文本编辑器等.虽然Qt Designer里的控件可以满足我们大部分的 ...

最新文章

  1. 团体——L1-006 连续因子 (C语言)
  2. ef延迟加载不到导航属性问题
  3. [Win32]IP数据报的首部如何定义
  4. 一个简单自激振荡器电路分析
  5. js处理url中的请求参数(编码/解码)
  6. 【数据结构与算法】之深入解析“寻找旋转排序数组中的最小值”的求解思路与算法示例
  7. php 对象赋值后改变成员变量影响赋值对象
  8. 线程池优化之充分利用线程池资源
  9. django mysql 修改密码_Django更改sqlite数据库使用mysql数据库 - 李金龙
  10. 数据库中常用使用场景
  11. Flask 蓝图(Blueprint)
  12. 如何将response里header的date转化为当地时间_将产品20元利润提升到2000元,靠的是卖体验!...
  13. [Micropython]TPYBoard开发板点亮心形8*8点阵
  14. 微软半日游,和CSDN同学们走进名企
  15. iOS 开发 code sign 代码签名深入剖析
  16. unity3d新手入门必备教程
  17. python群聊聊天室程序_Python聊天室程序(基础版)
  18. Smart3D之手动配置 S3C 索引加载全部的OSGB瓦片数据
  19. Python常用库大全(转)
  20. 了解GAC:从“找不到Microsoft.SqlServer.SqlClrProvider.dll”的问题开始

热门文章

  1. 计算机硬件配置和软件有哪些,BIM软件对电脑硬件配置有什么要求?
  2. transformers task_summary
  3. jinja filter
  4. Java Servlet ServletContext
  5. flask-sqlAlchemy 创建表
  6. Bokeh 借力其他库
  7. 问题 | kali2019.04版中文语言安装后就会乱码
  8. SQLite学习总结(1)——SQLite简介及快速入门
  9. Java基础学习总结(78)——Java main方法深入研究学习
  10. 你应该知道的大数据领域12大动向