- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个自定义 TextView,它的 onDraw
方法被覆盖以在 TextView 周围绘制红色边框。
当我将重力设置为左侧以外的其他值时 AND singleLine=true :不绘制边框。
以下屏幕截图说明了问题:第二个 textView 没有边框
TL 表示 TOP|LEFT ; C 表示 CENTER ; SL表示单线; T 表示真实; F 表示错误
这是代码(可以复制/粘贴并运行 - 不需要布局文件)
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.Gravity;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class MyActivity extends Activity {
private final int TEXT_VIEW_WIDTH_PX = 400;
private final int TEXT_VIEW_HEIGHT_PX = 60;
private Paint borderPaint = new Paint();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
RelativeLayout rootView = new RelativeLayout(this);
getWindow().setContentView(rootView);
borderPaint.setColor(Color.RED);
MyTextView text1 = makeTextView("Grav=TL ; SL=F",100);
rootView.addView(text1);
MyTextView text2 = makeTextView("Grav=C ; SL=T",200);
//combination of the 2 following attributes cause the issue
text2.setSingleLine(true);
text2.setGravity(Gravity.CENTER);
rootView.addView(text2);
MyTextView text3 = makeTextView("Grav=C ; SL=F",300);
text3.setGravity(Gravity.CENTER);
rootView.addView(text3);
MyTextView text4 = makeTextView("Grav=TL ; SL=T",400);
text4.setSingleLine(true);
rootView.addView(text4);
}
/**
* Custom TextView with red border
*/
private class MyTextView extends TextView {
private MyTextView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawLine(1,1,1,TEXT_VIEW_HEIGHT_PX-1,borderPaint);
canvas.drawLine(1,1,TEXT_VIEW_WIDTH_PX-1,1,borderPaint);
canvas.drawLine(TEXT_VIEW_WIDTH_PX-1,1,TEXT_VIEW_WIDTH_PX-1,TEXT_VIEW_HEIGHT_PX-1,borderPaint);
canvas.drawLine(1,TEXT_VIEW_HEIGHT_PX-1,TEXT_VIEW_WIDTH_PX-1,TEXT_VIEW_HEIGHT_PX-1,borderPaint);
}
}
/**
* create a MyTextView with 'text' context and located at x=50 ; y=marginTop
* (nothing relevant for the issue here)
*/
private MyTextView makeTextView(String text, int marginTop){
MyTextView textView = new MyTextView(this);
textView.setText(text);
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(TEXT_VIEW_WIDTH_PX,TEXT_VIEW_HEIGHT_PX);
lp.topMargin = marginTop;
lp.leftMargin = 50;
textView.setLayoutParams(lp);
return textView;
}
}
最佳答案
感谢 pskink 的深入研究(来自对我的另一个答案的评论):
If you want to know why custom
onDraw
doesn't draw anything, justLog.d
the value ofcanvas.getMatrix()
.[It] seems that canvas is translated/horizontally scrolled (at least in my case) 8159 pixels to the left, so calling
canvas.translate(8159, 0)
fixes the issue, of course 8159 is not a magic number and can vary.I found it, see
VERY_WIDE
constant inTextView
, it is set to 16384 (2**14), in my caseTextView
has width of 66 and now (16384-66)/2 == 8159, voila!...but VERY_WIDE is private so you cannot access it :-(
从这里开始,我想知道是否可以通过编程方式检索偏移量,并且确实可以通过 getScrollX()
轻松检索。这种方法通过取消水平滚动来平移 Canvas 而不是“破解”单行。单线显示更自然。
在自定义 TextView
中:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// translate the canvas before drawing onto it, fixing the position
canvas.translate(getScrollX(), 0);
canvas.drawLine(1, 1, 1, TEXT_VIEW_HEIGHT_PX - 1, borderPaint);
canvas.drawLine(1, 1, TEXT_VIEW_WIDTH_PX - 1, 1, borderPaint);
canvas.drawLine(TEXT_VIEW_WIDTH_PX - 1, 1, TEXT_VIEW_WIDTH_PX - 1,
TEXT_VIEW_HEIGHT_PX - 1, borderPaint);
canvas.drawLine(1, TEXT_VIEW_HEIGHT_PX - 1, TEXT_VIEW_WIDTH_PX - 1,
TEXT_VIEW_HEIGHT_PX - 1, borderPaint);
}
此代码尚未针对所有情况进行彻底测试。我只确认了OP提供的4个案例
关于android - 你能解释一下 TextView + Gravity + SingleLine 和 Canvas 的行为吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25501185/
我有一个按钮: public class MyButton extends Button{ private float degrees; public MyButton(C
这是我的 AutoCompleteTextView 代码。 问题是我想输入一些文本,然后点击软键盘上的Next。 Next 出现在软键盘上,但它没有将光标移动到下一个 EditText。在同一个屏幕
我有一个 TextView,它位于屏幕左侧,设置为重力 =“right”,它设置为 SingleLine = “true”。 如果这个 View 中的文本变得太长,我希望它从 View 的左侧消失。我
我想将 edittext 条目限制为单行,但是当我添加行 android:singleline = "true" 时,提示消失,输入 26 个字符后光标向下. 这是我的 XML 代码: 最佳答
我认为 singleLine="true" 等同于 maxLines="1" 但我看到 Android Studio 中的以下预填充字段两者都有。有区别吗?是否存在导致两者都需要的已知错误? 这是来
我正在尝试匹配文件的某个结尾,其中“文件的某个结尾”可能会跨越多行。 我的正则表达式如下所示: "\s\w$" 我想要做的:查找所有以空格字符结尾的文件,并在文件的最末尾加上“人类可读字符”。 Reg
我正在尝试让一个 TextView 采用多行并按父级的大小进行切割。 这并不强制它只是这个 View 的宽度。文本离开屏幕。 TextView 只有在我给它一个像素数
我的风格如下 @dimen/text_size_penny @color/color_default true 后来我有了另一种风格,除了不是单行外,其他都是一样的。所以我
我如何动态地启用和禁用 android:singleLine?我有一个 ListView ,我想在 listView 中使用文本 singleLine true 和一些 sinleLine false
我最近使用了 TextInputEditText,我得到 singleLine 属性 Deprecated 的 lint 错误 删除线如下: 有没有其他方法可以解决这个问题? 最佳答案 andro
只有当 EditText 具有焦点时,我才需要将一个 EditText 限制在 1 行,但当它具有焦点时它什么也不做,只有当它具有焦点并且我关闭应用程序时才有效。我不知道为什么会这样,我尝试了一些方法
我使用以下样式来布局按钮: wrap_content wrap_content true web 按钮本身嵌套在一些 LinearLayouts 中,这些 Line
我有一个 TextView,我想知道它是否由于 XML 中的 singleLine="true"而被截断。 有什么想法可以实现这一点而无需传递显示的文本,而仅使用 TextView 检测它? 最佳答案
我遇到了 android:ellipsize 的问题,它在 TextView 中不起作用。但要适用于 android:singleLine。 我听说 android:singleLine 已被“弃用”
我需要为我的 edittext 设置 actiondone 而不设置单行选项(我需要多行输入)。我该怎么做? 这是代码: 最佳答案 这对我有用: 关于android - 没有 singl
singleLine 是/曾在 TextView 和 EditText 的 xml 布局文件中使用,如下所示: Some people在 SO 上说 singleLine 已弃用,而 other p
找不到更改 TextField 的光标位置并使其成为单行的方法。有人找到办法吗? 这个时候我用的是最新的jetpack-compose 1.0.0-alpha03版本。 最佳答案 要设置光标,您需要像
我有以下 AutoCompleteTextView : 此 AutoCompleteTextView 的输入是通过我创建的“拨号器”布局完成的,因此此 AutoCompleteTextVi
我有一个自定义 TextView,它的 onDraw 方法被覆盖以在 TextView 周围绘制红色边框。 当我将重力设置为左侧以外的其他值时 AND singleLine=true :不绘制边框。
我注意到android:singleLine="true"如果用在ListView中Listitem的TextView中,会导致滚动很卡顿。虽然我找到了替代的 android:maxLines="1"
我是一名优秀的程序员,十分优秀!