Android实现自带横线的EditText
(一)问题
怎样实现带有横栏的EditText(像记事本的编辑界面那样)?
(二)初步思路
1.通过修改EditText背景来实现(系统背景是一个框形图片,内部透明,替换为一个带有横栏的图片即可)
2.通过重绘EditText来实现(自定义组件,自己画线)
3.用ListView实现(ListView本身就会显示横线)
(三)深入分析
1.EditText显示多行文本时会自动拉伸背景,若要保证边框不会失真,需要用9patch图片来做背景,或许能够实现
2.毫无疑问,自定义EditText一定可以实现横线的显示(没有枪炮就自己造...),但是自定义组件比较麻烦(需要重写很多东西),能用其他方法解决当然更好
3.ListView用来显示多行文本可能比较好(将Text分割为等长String存入Array,作为ListView的Adapter),但是若要编辑文本则明显不合适
(四)初步实践
1.通过多次测试发现改变EditText的背景图能够显示横栏,但仅限于SingLine的文本,因为输入多行文本时背景图会向下拉伸(横线没了...)。所以测试结果是:用自定义背景图只能显示带下划线的单行文本,方案一失败!但是在此过程中学到了9patch图片的用处,算是一点小收获。
2.通过重写EditText的onDraw方法来绘制需要的横线,如何确定横线的位置成为核心问题(本质是获取一组起点坐标和一组对应的终点坐标),此方法在下面展开详述
3.ListView的缺点在上面已经说过了,但是经过对方案一的尝试,我们很容易发现方案一和方案三恰好互补(把方案一得到的EditText作为ListView的Item),此时应该为EditText自定义selector,设置focus时不发光即可。测试结果是:单行EditText负责按行显示文本,ListView负责画线,方案一组合方案三可行。
(五)自定义EditText实现横栏的显示
[自定义myEditText类]
package com.ayqy.app_test; import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.widget.EditText; public class myEditText extends EditText{ private int lineColor;//横线颜色
private float lineWidth;//横线宽度 public myEditText(Context context) {
super(context); //设置默认颜色和横线宽度
lineColor = Color.BLUE;//默认蓝色线
lineWidth = 2f;//宽度为2
} public myEditText(Context context,int color,float width) {
super(context); //设置颜色和横线宽度
this.lineColor = color;
this.lineWidth = width;
} @Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas); //创建画笔
Paint mPaint = new Paint();
mPaint.setStrokeWidth(lineWidth);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(lineColor); //获取参数
int w = this.getWidth();//获取控件宽度
int h = this.getHeight();//获取控件高度
int padB = this.getPaddingBottom();//获取底部留白
int padL = this.getPaddingLeft();//获取左边留白
int padR = this.getPaddingRight();//获取右边留白
float size = this.getTextSize() * 7 / 6;//获取横栏间距(TextSize的默认值为18)
/*设置size的值是一个核心问题,size的值要适应不同的字体大小(不同大小字体的行距也不同)
*经过多次尝试发现以字体大小的7/6倍作为横栏间距最合适
* */
int lines = (int)(h / size);//获取行数 //从下向上画线
for(int i = 0;i < lines;i++)
canvas.drawLine(padL//startX
, this.getHeight() - padB - size * i//startY
, this.getWidth() - padR//endX
, this.getHeight() - padB - size * i//endY
, mPaint);
} public int getLineColor() {
return lineColor;
} public void setLineColor(int color) {
this.lineColor = color;
} public float getLineWidth() {
return lineWidth;
} public void setLineWidth(float width) {
this.lineWidth = width;
} }
[布局文件]
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" > </LinearLayout>
[测试类]
package com.ayqy.app_test; import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.LinearLayout; public class MainActivity extends Activity { LinearLayout root;//声明根布局 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); root = (LinearLayout) findViewById(R.id.root);//获取根布局
//创建自定义EditText控件对象
myEditText txt = new myEditText(this);
//设置多行文本
txt.setText("这是一个很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长很长的测试内容");
//用来测试是否能够适应不同大小的字体
//txt.setTextSize(48);
//txt.setTextSize(24);
root.addView(txt);//添加控件
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }
[P.S.以上源码本机测试无误,若在测试中发现任何问题请在下方留言]
(六)测试结果图片



(七)总结
尝试是解决问题的最好方法,即便最终问题得不到解决,其间的思考也是一种锻炼
(八)BUG修正
此版本存在BUG,详情及修正方法见 http://www.cnblogs.com/ayqy/p/3600289.html
Android实现自带横线的EditText的更多相关文章
- 35.Android之带删除按钮EditText学习
今天实现Android里自定义带删除功能的EditText,效果如下: 当输入内容时,EditText变为带有一个删除功能按钮的编辑框,如图: 实现代码很简单,直接上代码, 布局文件xml: < ...
- Android实现自定义带文字和图片的Button
Android实现自定义带文字和图片的Button 在Android开发中经常会需要用到带文字和图片的button,下面来讲解一下常用的实现办法. 一.用系统自带的Button实现 最简单的一种办法就 ...
- 安卓自动化测试:Android studio 自带的 Record Espresso Test || [ Appium & (Android studio || Python|| Eclipse ) ]
1.Android studio 自带的 Record Espresso Test https://developer.android.com/studio/test/espresso-test-r ...
- 手把手让你爱上Android sdk自带“9妹”(9patch 工具)
前几天群成员讨论过关于9patch的工具[我比较喜欢喊它9妹子,西西(*^_^*)].然后研究了一下,比较简单但是很实用的一个Android sdk 自带工具.这里给大家做一个分享下经验! 1.什么是 ...
- 网络编程之PC版与Android手机版带断点续传的多线程下载
一.多线程下载 多线程下载就是抢占服务器资源 原理:服务器CPU 分配给每条线程的时间片相同,服务器带宽平均分配给每条线程,所以客户端开启的线程越多,就能抢占到更多的服 ...
- Android中实现全屏、无标题栏的两种办法(另附Android系统自带样式的解释)
在进行UI设计时,我们经常需要将屏幕设置成无标题栏或者全屏.要实现起来也非常简单,主要有两种方法:配置xml文件和编写代码设置. 1.在xml文件中进行配置 在项目的清单文件AndroidManife ...
- 【Android】自带Theme
[Android]自带Theme android之uses-permission 在编写Android程序时经常会忘记添加权限,下面是网上收集的关于Android uses-permission的 ...
- Android SurfaceView实战 带你玩转flabby bird (下)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43063331,本文出自:[张鸿洋的博客] 1.概述 在Android Surfa ...
- 运行Android Studio自带模拟器报:Guest isn't online after 7 second...
今天在运行Android Studio自带的手机模拟器时,出现如下异常情况 : 解决办法: 1.打开Android Virtue Device Manager,点击编辑选项 2.点击show Adva ...
随机推荐
- Excel Sheet Column Title (STRING - TYPE CONVERTION)
QUESTION Given a positive integer, return its corresponding column title as appear in an Excel sheet ...
- 一些unity问题的收集
---恢复内容开始--- 1.Mono打不开且鼠标点击标签页无反应的解决办法 http://answers.unity3d.com/questions/574157/monodevelop-not-o ...
- day6:vcp考试
Q101. Refer to the Exhibit.Which tab shows the Hardware Acceleration support status?A. DevicesB. Pro ...
- Writing A Better JavaScript Library For The DOM 阅读记录
原文地址:http://coding.smashingmagazine.com/2014/01/13/better-javascript-library-for-the-dom/ 主要观点: live ...
- JFinal开发框架简介
JFinal 中的Controller Controller是JFinal核心类之一,该类作为MVC模式中的控制器.基于JFinal的Web应用的控制器需要继承该类.Controller是定义Acti ...
- SQL Cursor 基本用法[用两次FETCH NEXT FROM INTO语句?]
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/--> ...
- BZOJ 2726 [SDOI2012] 任务安排 - 斜率优化dp
题解 转移方程与我的上一篇题解一样 : $S\times sumC_j + F_j = sumT_i \times sumC_j + F_i - S \times sumC_N$. 分离成:$S\t ...
- PS、AI、AE常用快捷键大全
PS,AI,AE最常用的快捷键来了. 注意:Mac用户请自觉把Ctrl换成Command理解就行. 2017 Adobe Photoshop CC 快捷键 2017Adobe Illustrator快 ...
- Autotest Weekly Report
Autotest Weekly Report Reported by: 12/16/2013 What I Did Last Week Debug autotest scripts of ‘smart ...
- IE8以下支持css3 border-radius渲染方法
这两天在做个集团网站,web前端妹子技术水平不咋样,写个web和wap 真够费劲的,对之前流行的H5和css3 响应式看来不太会用,扔给我一个半成品~~·非说各种canvas和border-radiu ...