- 浏览: 230825 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
sfshine:
非常好非常好
Android 窗口管理 -
mthhk:
...
android3.0之Fragment(碎片)基础 -
FrankHB1989:
“C/C++标准不会保证这样的代码一定不会出错”的依据?你要说 ...
Duff's Device -
2006003845:
请问知道 刚体之间怎么不碰撞嘛 ?相互穿插
JBOX2D分析
用过EditText的都知道,EditText有个特点,当在里面长按的时 候,会出现一个ContextMenu,提供了选择文字,复制,剪切等功能。有时候,我们会想,如果不出现这个ContextMenu,直接就在view 上选择文字,那多美好啊。相信很多人抱有这样的想法,很不幸,我也是。于是我就研究了一下EditText和TextView的代码,然后将这个问题解决 了。
网上很多资料都说,要选择一段文字,只需要用Selection.getSelectionStart()和 Selection.getSelectionEnd()确定选择的文字的头和尾,然后加颜色就行。简直是胡扯啊,我敢说这样的代码根本就没有经过验证, 就发到网上了,然后一大堆人互相转载,结果导致误导了很多人,杯具 啊!!
好,我们来分析一下解决办法。
TextView是很多View的基类,如Button、EditText都是继承自他,所以EditText里面的代码很少。我们看一下 EditText的源码,有一个Override的getDefaultEditable方法,看名字的意思是是否可编辑,这个方法直接返回true。还 有一个getDefaultMovementMethod方法,它返回的是ArrowKeyMovementMethod.getInstance(), 通过查看ArrowKeyMovementMethod的源码,基本确定这个方法就是弹出ContextMenu和轨迹球监听的“元凶”。
下面,我们自己做一个view来打造自己的EditText。
我取名TextPage,继承EditText,在里面覆盖getDefaultEditable和getDefaultMovementMethod。
- @Override
- public boolean getDefaultEditable() {
- return false ;
- }
- @Override
- protected MovementMethod getDefaultMovementMethod() {
- return null ;
- }
现在测试一下,发现长按没反应了,所料不错,就是 getDefaultMovementMethod方法控制了ContextMenu。
看一下ArrowKeyMovementMethod的代码,里面提供了KeyEvent、轨迹球事件onTrackballEvent和touch事件 onTouchEvent的处理。这些事件在何处调用的呢?我们看看TextView的onTouchEvent、onTrackballEvent和 onKeyEvent方法里面就明白了,在这些事件回调中调用了ArrowKeyMovementMethod里面的这些方法。
还有个问题,ContextMenu在哪里触发的?这个问题,用过ContextMenu的都知道,view里面要使用ContextMenu,需要覆盖 一个onCreateContextMenu方法,然后在里面创建ContextMenu的各个选项。在TextView里面找 onCreateContextMenu,果然有,里面定义了选择、复制、粘贴等选项。
既然找到了这个,那么我们就可以进一步分析选择是如何做到的。
onCreateContextMenu只是创建菜单,那么菜单点击之后,触发了什么呢?onCreateContextMenu里面定义了一个 MenuHandler对象,然后作为参数传递给setOnMenuItemClickListener,找到MenuHandler,发现里面的 onMenuItemClick返回的是onTextContextMenuItem函数,找到onTextContextMenuItem,OMG,终 于找到点击menu触发的函数了。但是里面貌似没有关键的东西,选择的部分不在这里。那么,就应该在上面所说的那些事件里面了。
重点分析ArrowKeyMovementMethod的onTouchEvent方法。发现一个重要的方法getLayout(),然后获取一个 Layout对象,通过x和y坐标知道当前字符串的offset位置。
那么,问题就可以完美的解决了。你可以点击任何地方然后拖动,释放之后,中间的文字就会被选中,so beautiful!
- import android.content.Context;
- import android.graphics.Color;
- import android.text.Layout;
- import android.text.Selection;
- import android.view.ContextMenu;
- import android.view.Gravity;
- import android.view.MotionEvent;
- import android.widget.EditText;
- /**
- * @author chroya
- */
- public class TextPage extends EditText {
- private int off; //字符串的偏移值
- public TextPage(Context context) {
- super (context);
- initialize();
- }
- private void initialize() {
- setGravity(Gravity.TOP);
- setBackgroundColor(Color.WHITE);
- }
- @Override
- protected void onCreateContextMenu(ContextMenu menu) {
- //不做任何处理,为了阻止长按的时候弹出上下文菜单
- }
- @Override
- public boolean getDefaultEditable() {
- return false ;
- }
- @Override
- public boolean onTouchEvent(MotionEvent event) {
- int action = event.getAction();
- Layout layout = getLayout();
- int line = 0 ;
- switch (action) {
- case MotionEvent.ACTION_DOWN:
- line = layout.getLineForVertical(getScrollY()+ (int )event.getY());
- off = layout.getOffsetForHorizontal(line, (int )event.getX());
- Selection.setSelection(getEditableText(), off);
- break ;
- case MotionEvent.ACTION_MOVE:
- case MotionEvent.ACTION_UP:
- line = layout.getLineForVertical(getScrollY()+(int )event.getY());
- int curOff = layout.getOffsetForHorizontal(line, ( int )event.getX());
- Selection.setSelection(getEditableText(), off, curOff);
- break ;
- }
- return true ;
- }
- }
发表评论
-
Java中循环嵌套跳出的高效写法
2014-04-24 19:31 3152(下面写的这些并不是Jdk的新特性,也不是Java某个版本提供 ... -
Android各版本新增功能一览(转)
2013-12-05 20:43 1689Android3.0新增功能:主要增加全息主题 ... -
NotificationManager和Notification的使用总结(转)
2013-11-26 12:51 614这几天一直在修改twig ... -
Android应用程序资源的编译和打包过程分析 (转自老罗的博客)
2013-11-13 10:57 15529我们知道,在一个APK文件中,除了有代码文件之外,还 ... -
Proguard 源码分析 (七) 混淆
2013-11-10 21:19 1794本章我们讲Proguard非常重要的一个步骤:混淆Obfu ... -
Proguard源码分析(六)前文总结
2013-11-05 14:40 1068目前,我们读了Proguard的 ... -
Proguard源码分析(五) ConfigurationParser.keep参数
2013-10-31 14:43 3923本章节我们绕回来讲Keep参数,也就是Configurat ... -
Proguard源码分析(四) 压缩
2013-10-30 10:59 1115上一次我们讲了seed文件,这次我们说压缩,对应的输出文件是 ... -
Proguard源码分析(三)Seed文件
2013-10-29 12:45 1520Seed文件就是保持住的类文件,直白一点就是不被混淆的文件, ... -
Proguard源码分析(二)输出文件
2013-10-28 10:28 902ProGuard outputs thefollowing ... -
Android 2.2.2到Android 4.2.2源码下载地址(转)
2013-10-28 10:13 994Android 2.2.2到Android 4.2.2源码下 ... -
代码混淆器Proguard源码分析(一) 读取
2013-10-22 19:40 2297Proguard是Android中经常用的混淆工具,当然你也 ... -
Android内存之VSS/RSS/PSS/USS
2013-09-25 14:07 684Terms VSS - Vi ... -
chrome开源工程(转)
2013-09-13 10:42 1309在chrome地址栏输入about:credits就可以看 ... -
dex文件结构(转)
2013-09-03 14:10 1015Dex文件和Dalvik虚拟机 在Android系统中 ... -
android clipPath切割画布
2013-08-29 12:00 6227(转自:http://wallage.blog.163.co ... -
Android WebView控件
2013-06-06 11:46 2242android.webkit库聚合了webkit内核的浏览器 ... -
dumpsys命令~(非常有用~)
2013-04-03 12:02 0dumpsys是系统中重要的函数,我们来看看它如何使用,都能 ... -
内存监控命令~
2013-04-03 00:30 0meminfo 命令:cat /proc/meminfo ... -
adb常用命令
2013-04-03 00:17 1088Android 调试桥(adb)是多种用途的工具,该工具可以 ...
相关推荐
在Android开发中,TextView是用于显示单行或多行文本的基本组件。然而,系统默认的TextView在长按时会弹出一个菜单,允许用户复制文本或执行其他操作。在某些情况下,开发者可能希望禁用这些功能,以实现自定义的...
综上所述,"Android可伸缩的TextView"是一种实用的UI组件,它通过自定义和扩展原生的TextView功能,实现了文本的动态展开和折叠,使得在有限的屏幕空间内,用户可以自由地查看和隐藏详细信息。开发者可以基于这个...
Android TextView 是安卓开发中最常用的控件之一,然而在实际开发中,我们经常需要实现长按自由选择复制功能,以便用户可以方便地复制文字内容。下面我们就来探索这种功能的实现方法。 首先,我们需要在布局文件中...
通过这样的自定义,我们可以自由地控制TextView中的文字旋转效果,为Android应用带来更丰富的视觉体验。 总结来说,自定义TextView实现文本旋转功能涉及到Android视图绘制的基本原理,包括自定义视图类、覆盖`...
本篇文章将深入探讨如何在Android WebView中实现自由复制和选择文字的功能,这对于增强用户体验至关重要,特别是对于那些包含大量文本内容的应用来说。 通常情况下,WebView默认并不支持用户直接复制文本,因此我们...
在Android开发中,文本输入和显示是至关重要的部分,而`TextView`作为系统提供的基础控件,被广泛用于展示各种文本信息。然而,系统默认的`TextView`在使用时可能会存在一些不便,例如其默认的内边距可能不符合...
在Android应用开发中,有时我们需要实现一种功能,允许用户在图片上添加文字或者图形,就像贴纸一样,这种功能在社交、编辑类应用中非常常见。`StickTextView` 就是这样一个组件,专为Android平台设计,用于实现图片...
标题中的"可拖动TextView"指的是一个可以被用户在界面上自由移动的文本视图组件。 首先,我们需要了解TextView的基本概念。TextView是Android系统提供的一个基本UI组件,用于显示单行或多行文本。在自定义可拖动的...
在Android开发中,TextView通常用于显示纯文本内容,但其实它也可以通过一些方式来显示图片。这个"Android高级应用源码-textView显示图片的例子_TextImage.zip"是一个示例项目,展示了如何在TextView中嵌入图像,这...
至于文字显示,你可以在自定义View的`onDraw()`方法里计算并绘制文字,或者使用TextView与自定义进度条结合。如果在XML布局文件中使用,可以通过`android:text`属性设置初始值,然后在代码中更新文本。 最后,`...
2. **TextView与自定义View**:在Android中,TextView是显示文本的基本组件,但若要实现文字的自由移动,可能需要自定义View来扩展其功能。自定义View允许开发者重写onDraw()方法,实现更复杂的绘制逻辑,例如动态...
MTextView支持在文本中插入图片,可以自由调整图片与文字的相对位置,如左对齐、右对齐或居中,同时还能设置图片与文字的间距,满足不同设计需求。这种功能的实现是通过解析文本中的特定标记,然后在绘制时动态插入...
在Android开发中,TextView是用于显示文本的基本组件,它的自定义功能强大,允许开发者根据需求进行各种视觉调整。本文将详细讲解如何通过编程实现TextView的字体、颜色、行距、样式、独立样式、内部超链接以及与...
"Android应用源码动画文字自由移动源码.zip" 提供了一个具体的实例,展示了如何在Android平台上实现文字的动态移动效果。这个源码项目对于初学者和有经验的开发者来说,都是一个宝贵的资源,可以深入理解Android动画...
这个“android应用源码动画文字自由移动.zip”源码资源提供了一个很好的实例,展示了如何在Android平台上实现文字的动态移动效果。以下是对该资源及其相关知识点的详细解读: 1. **Android 动画系统**:Android提供...
2. **自定义View**:为了实现文字自由移动,开发者可能创建了自定义的TextView或者继承自View类,重写onDraw()方法,结合Matrix类来改变文字的位置。Matrix类用于二维几何变换,可以实现平移、旋转、缩放等效果。 3...
在Android开发中,`TextView`是用于展示文本的常用组件,但其默认功能并不支持用户自由选择和操作文本。`TextPage`项目则提供了一种扩展,使得`TextView`能够支持用户选择、复制、高亮等操作,提升了用户体验。本文...
在Android开发中,TextView是用于显示文本的常用组件。它支持多种样式和格式,包括文本颜色、字体样式以及超链接。本文将详细介绍如何使用TextView来设置文本样式和创建超链接,以及相关的操作技巧。 首先,我们...
在安卓开发中,手绘图片处理画板是一个有趣且实用的功能,它允许用户在屏幕上自由绘制,添加个性化元素,甚至可以结合文字动画来提升用户体验。本压缩包中的资源主要涉及了TextView图片中间的文字产生随机动画,这在...