- 浏览: 662896 次
- 性别:
- 来自: 深圳
-
文章分类
最新评论
-
ZHOU452840622:
少了一个构造函数 晕
Android画图之Matrix(一) -
ZHOU452840622:
06-30 17:39:19.193: E/AndroidRu ...
Android画图之Matrix(一) -
ZHOU452840622:
为什么报错哦
Android画图之Matrix(一) -
悬空90:
只是获取activity的名字而已, 没有实例。 反射 ...
获取屏幕上正在显示的activity -
night_iv:
重写下面两个函数EditText完全作废,点击没有反应没有光标 ...
Android自由选择TextView的文字
用过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; } }
评论
@Override
public boolean getDefaultEditable() {
return false;
}
@Override
protected MovementMethod getDefaultMovementMethod() {
return null;
}
这样写出来的程序是可以正常选择文字了,但是老是有光标闪动,有什么方法可以
把光标去掉呢?我尝试调用clearFocus方法,不管在Textpage初始化调用还是
在外面使用到它的实例处调用都不好用,请问有什么好方法吗?
貌似有个属性是设置光标不可见.我用过.但是记不清具体名字了.你可以查看下API文档
这样写出来的程序是可以正常选择文字了,但是老是有光标闪动,有什么方法可以
把光标去掉呢?我尝试调用clearFocus方法,不管在Textpage初始化调用还是
在外面使用到它的实例处调用都不好用,请问有什么好方法吗?
发表评论
-
Android NFC内部机制分析
2012-08-06 19:48 3一、初始 一般需要使用nfc ... -
Android NFC简介
2012-08-03 11:31 4395目录: Android NFC ... -
Android放大镜的实现
2011-02-24 20:29 14385快三个月了没写博客了,因为工作调动,很多经验、心得都没 ... -
Android简单的圆盘形菜单
2010-12-01 17:10 15536今天偶然看到一个圆盘形的菜单,还可以转动,感觉挺 ... -
Android的3D旋转
2010-11-29 12:27 23234见过没有用opengl的3D动画,看了一下,是 ... -
让自己的Android应用支持appwidget
2010-11-26 13:25 7884经常看到一些教程教你如何写appwidget, ... -
ConditionVariable的用法
2010-11-07 21:35 8774线程操作经常用到wait和notify,用起来稍显 ... -
Android自定义长按事件
2010-11-06 20:34 44754Android系统自带了长按事件,setOnLongC ... -
Android获取应用程序的大小
2010-10-22 23:53 11304今天碰到个问 ... -
Android获取其他包的Context实例然后干坏事
2010-09-12 14:55 25156Android中有Context ... -
android监听文件和目录的创建删除移动等事件
2010-09-11 21:18 13694android.os下的FileObserver类 ... -
解决android自定义标题栏充满的问题
2010-09-10 15:27 10820一个接着一个的activity,写啊写,调啊调 ... -
Android中用AsyncTask简单实现多线程
2010-09-07 14:11 5252一般情况下在an ... -
NDK入门、提高和实战
2010-08-04 18:25 3331网上也有一些对NDK ... -
linux下用adb连接手机的问题解决
2010-08-02 16:17 6090在linux里面,模拟器可以直接识别,使用adb也 ... -
Android系统事件的recycle原理
2010-07-22 19:07 6274最近封装一些功能 ... -
Android画图之Matrix(二)
2010-07-15 22:01 34114上一篇Android画图之Matrix(一) 讲 ... -
Android画图之Matrix(一)
2010-07-13 22:54 32926Matrix ,中文里叫矩阵, ... -
Android画图之Bitmap(二)
2010-07-11 22:21 10851前面一篇博文Android画图之Bitma ... -
Android画图之Bitmap(一)
2010-07-11 19:51 15712最近写电子书 ...
相关推荐
在Android开发中,TextView是用于显示单行或多行文本的基本组件。然而,系统默认的TextView在长按时会弹出一个菜单,允许用户复制文本或执行其他操作。在某些情况下,开发者可能希望禁用这些功能,以实现自定义的...
background=”@null” 用于去掉 EditText 的背景线,android:textCursorDrawable=”@null” 用于去掉游标,android:editable=”false” 用于禁止编辑,而 android:textIsSelectable=”true” 则用于启用文字选择功能...
综上所述,"Android可伸缩的TextView"是一种实用的UI组件,它通过自定义和扩展原生的TextView功能,实现了文本的动态展开和折叠,使得在有限的屏幕空间内,用户可以自由地查看和隐藏详细信息。开发者可以基于这个...
本篇文章将深入探讨如何在Android WebView中实现自由复制和选择文字的功能,这对于增强用户体验至关重要,特别是对于那些包含大量文本内容的应用来说。 通常情况下,WebView默认并不支持用户直接复制文本,因此我们...
通过这样的自定义,我们可以自由地控制TextView中的文字旋转效果,为Android应用带来更丰富的视觉体验。 总结来说,自定义TextView实现文本旋转功能涉及到Android视图绘制的基本原理,包括自定义视图类、覆盖`...
标题中的"可拖动TextView"指的是一个可以被用户在界面上自由移动的文本视图组件。 首先,我们需要了解TextView的基本概念。TextView是Android系统提供的一个基本UI组件,用于显示单行或多行文本。在自定义可拖动的...
开发者可以使用Android内置的`TextView`属性,如`setTextSize()`、`setTypeface()`、`setShadowLayer()`等进行调整。 6. **使用示例**: 在实际项目中,你可以创建一个`StickTextView`实例,并在XML布局文件中配置...
2. **自定义样式**:除了基本的文字颜色和字体大小,`MultipleTextView`可能提供了更多的自定义样式选项,如文本阴影、描边效果、渐变色等,让开发者可以更自由地定制文本外观。 3. **文本高亮**:为了突出显示部分...
MTextView支持在文本中插入图片,可以自由调整图片与文字的相对位置,如左对齐、右对齐或居中,同时还能设置图片与文字的间距,满足不同设计需求。这种功能的实现是通过解析文本中的特定标记,然后在绘制时动态插入...
2. **TextView与自定义View**:在Android中,TextView是显示文本的基本组件,但若要实现文字的自由移动,可能需要自定义View来扩展其功能。自定义View允许开发者重写onDraw()方法,实现更复杂的绘制逻辑,例如动态...
在Android开发中,TextView通常用于显示纯文本内容,但其实它也可以通过一些方式来显示图片。这个"Android高级应用源码-textView显示图片的例子_TextImage.zip"是一个示例项目,展示了如何在TextView中嵌入图像,这...
"Android应用源码动画文字自由移动源码.zip" 提供了一个具体的实例,展示了如何在Android平台上实现文字的动态移动效果。这个源码项目对于初学者和有经验的开发者来说,都是一个宝贵的资源,可以深入理解Android动画...
这个“android应用源码动画文字自由移动.zip”源码资源提供了一个很好的实例,展示了如何在Android平台上实现文字的动态移动效果。以下是对该资源及其相关知识点的详细解读: 1. **Android 动画系统**:Android提供...
至于文字显示,你可以在自定义View的`onDraw()`方法里计算并绘制文字,或者使用TextView与自定义进度条结合。如果在XML布局文件中使用,可以通过`android:text`属性设置初始值,然后在代码中更新文本。 最后,`...
2. **自定义View**:为了实现文字自由移动,开发者可能创建了自定义的TextView或者继承自View类,重写onDraw()方法,结合Matrix类来改变文字的位置。Matrix类用于二维几何变换,可以实现平移、旋转、缩放等效果。 3...
这个"安卓Android源码——动画文字自由移动.zip"文件提供了一种实现文字在屏幕上自由移动的动画效果的源代码示例。通过深入理解并分析这个示例,我们可以学习到几个关键的Android动画技术和实践。 首先,Android...
通过这些技术,开发者可以自由地定制TextView的外观和交互,提升用户的使用体验。在实际开发中,还可以结合`SpannedStringBuilder`、`CharacterStyle`等工具进一步丰富文本的展示效果。了解并熟练掌握这些技巧,对于...
在Android开发中,`TextView`是用于展示文本的常用组件,但其默认功能并不支持用户自由选择和操作文本。`TextPage`项目则提供了一种扩展,使得`TextView`能够支持用户选择、复制、高亮等操作,提升了用户体验。本文...
通过以上方法,你可以自由地定制TextView,使其符合各种视觉设计需求。不过要注意,过度自定义可能会影响性能,因此在实现时要权衡美观和效率。在实际项目中,结合XML属性和代码动态设置,可以更好地控制TextView的...