我有ImageSpan
一段文字.我注意到的是,周围的文本总是在文本行的底部绘制 - 更准确地说,文本行的大小随着图像的增长而增加,但文本的基线不会向上移动.当图像明显大于文本大小时,效果相当难看.
这是一个示例,大纲显示的界限TextView
:
我试图让周围的文本相对于正在显示的图像垂直居中.以下是蓝色文本显示所需位置的相同示例:
以下是我受约束的约束:
我已尝试android:gravity="center_vertical"
在TextView上使用该属性,但这没有任何效果.我认为这只是文本行的垂直居中,但在文本行中,文本仍然在底部绘制.
我目前的思路是创建一个自定义跨度,根据行的高度和当前文本大小来移动文本的基线.这个跨度将包含整个文本,我将不得不计算与ImageSpan
s 的交集,所以我也可以避免移动图像.这听起来相当令人生畏,我希望有人能提出另一种方法.
任何和所有的帮助表示赞赏!
似乎为了在Android中将SpanSpan添加到Spannable,我必须用Image替换一些文本.例如:
Spannable span = new SpannableString("Foo imageplace Bar!");
Drawable android = context.getResources().getDrawable(R.drawable.android);
android.setBounds(0, 0, 32,32);
ImageSpan image = new ImageSpan(android, ImageSpan.ALIGN_BASELINE);
span.setSpan(image, 4, 14, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
Run Code Online (Sandbox Code Playgroud)
这将用图像替换"imageplace".因为我正在处理复杂的多跨文本和重复,所以在我想要android图标的每个地方插入无意义的文本有点令人头疼.但看起来如果跨度的开始和结束是相同的,则不会包含图像.有没有办法解决?
我正在创建聊天应用程序,我从服务器获取EMOJI(IMAGE URLS).
我使用这个图像(表情符号网址)在我TextView
的下面的代码行中的文本.
String stringWithHtml = "Sample string with an <img src=\"http://MY_SERVER.emoji.s3.amazonaws.com/cf68/5794d5f7895fa10a8f8e1350/imgList/5794d5f7895fa10a8f8e136a.png\"></img>" +
"<img src=\"http://MY_SERVER.emoji.s3.amazonaws.com/cf68/5794d5f7895fa10a8f8e1350/imgList/5794d5f7895fa10a8f8e135a.png\"></img>"+
"<img src=\"http://MY_SERVER.emoji.s3.amazonaws.com/cf68/5794d5f7895fa10a8f8e1350/imgList/5794d5f7895fa10a8f8e135b.png\"></img>";
Drawable drawable = Drawable.createFromStream(new URL(source).openStream(), "src name");
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
Spanned spannedValue = Html.fromHtml(stringWithHtml, drawable, null);
MY_TEXTVIEW.setText(spannedValue);
Run Code Online (Sandbox Code Playgroud)
这一切,我正在使用AsynTask
并获得如下预期结果: -
现在我将所有表情符号(图像)存储在我的设备上,并希望在我的文本中使用它TextView
.
我的问题是我们如何在TextView上使用带有文本的设备(存储图像)?
我在SO上搜索了它但没有得到预期的结果.请检查我访问过的以下链接.
我已经使用了ImageSpan
它,但另一个问题出现了,我已经在SO 上发布了问题点击这里
请帮我解决这个问题.谢谢
我有这个功能在Android 4.4.1上工作正常,但在5.0+上断.
public static SpannableStringBuilder prependImage(Drawable drawable, String text) {
SpannableStringBuilder builder = new SpannableStringBuilder(" " + text);
builder.setSpan(new ImageSpan(drawable), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return builder;
}
Run Code Online (Sandbox Code Playgroud)
我这样使用它:
class MyButton extends Button {
// ... snip ...
setText(
prependImage(
getDrawable(imageResource, color),
getContext().getString(stringResource)),
BufferType.SPANNABLE);
Run Code Online (Sandbox Code Playgroud)
这是getDrawable()
上面引用的方法:
private Drawable getDrawable(int resource, int color) {
final Resources resources = getContext().getResources();
Drawable drawable = resources.getDrawable(resource);
if (drawable != null) {
drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
}
return drawable;
}
Run Code Online (Sandbox Code Playgroud)
当我调试时,一切似乎都成功了,但没有绘制图像.我有什么想法可能做错了吗?
我想将我ImageSpan
的文本基线对齐,但我还需要在行之间添加一些间距.
问题是,当我添加行间距时,ImageSpan
它不会与文本的基线对齐,而是与文本的基线对齐baseline+lineSpacing
,因此它看起来比它应该低.
这有解决方法吗?
编辑:进一步说明:
没有 它的样子lineSpacing
(箭头是ImageSpan
).它与基线正确对齐.
如果我添加,它看起来如何 android:lineSpacingMulitiplier="1.2"
编辑2代码:
XML:
<com.kushtrim.example.views.CustomTypefaceTextView
android:id="@+id/descId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lines="3"
android:gravity="center_vertical"
android:layout_marginLeft="@dimen/_45"
android:layout_marginTop="@dimen/_6"
android:layout_marginBottom="@dimen/_20"
app:font_type="merriweather_regular"
android:textSize="@dimen/f40"
android:lineSpacingMultiplier="1.2"
android:textColor="@color/black"
android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit."
android:ellipsize="end" />
Run Code Online (Sandbox Code Playgroud)
其他相关方法:
private Spannable getContentText(ContactRaport contactRaport) {
DateTime dateTime = new DateTime(contactRaport.contactDate);
String datePart = dateTime.getDayOfMonth() + " " + dateTime.monthOfYear().getAsShortText(new Locale("nl")) + "; ";
String completeText = datePart + contactRaport.note;
Typeface font1 = Typeface.createFromAsset(context.getAssets(), "MyFont1.ttf"); …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序,用户从库中选择一个图像,它将添加到editText中,现在我想如果用户点击editText中的图像,它应该在fullScreen中打开,我使用下面的代码: -
public void addToEdt(Bitmap bitmap){
SpannableString ss = new SpannableString("abc");
Drawable d = new BitmapDrawable(getResources(), bitmap);
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
ss.setSpan(span, 0, 3, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
edt_note.setTransformationMethod(null);
edt_note.getText().insert(edt_note.getSelectionStart(), ss);
final int start = ss.getSpanStart(span);
final int end = ss.getSpanEnd(span);
ClickableSpan click_span = new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(getApplicationContext(),"Clicked",Toast.LENGTH_LONG).show();
}
};
ClickableSpan[] click_spans = ss.getSpans(start, end, ClickableSpan.class);
if(click_spans.length != 0) {
// remove all click spans
for (ClickableSpan c_span : click_spans) { …
Run Code Online (Sandbox Code Playgroud) 我将Image Drawable设置为Textn的SpannableString,但图像比文本更大,使它看起来很奇怪.我需要减小imagespan的大小,使其与文本的高度相同:
这是我尝试过的:
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
SpannableStringBuilder builder = new SpannableStringBuilder(holder.temptext.getText());
builder.setSpan(new ImageSpan(drawable), selectionCursor - ":)".length(), selectionCursor, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
holder.temptext.setText(builder);
holder.temptext.setSelection(selectionCursor);
holder.caption.setText(builder);
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用tablayout制作标签符合此https://guides.codepath.com/android/Google-Play-Style-Tabs-using-TabLayout#add-custom-view-to-tablayout
现在我正在尝试使用imagespan显示图标而不是文本.但没有运气,任何人都可以帮助指出本教程中缺少的内容吗?
这是代码
public class HomeActivity extends FragmentActivity {
//Fragments List
public ArrayList <Fragment> fragmentList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
setUpFragmentList();
// Get the ViewPager and set it's PagerAdapter so that it can display items
ViewPager viewPager = (ViewPager) findViewById(R.id.home_viewpager);
viewPager.setAdapter(new HomeFragmentPagerAdapter(getSupportFragmentManager(), HomeActivity.this, fragmentList));
// Give the TabLayout the ViewPager
TabLayout tabLayout = (TabLayout) findViewById(R.id.sliding_tabs);
//start this 2 are to set the tab to fill entire screen
tabLayout.setTabMode(TabLayout.MODE_FIXED);
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
//end this 2 are to set the …
Run Code Online (Sandbox Code Playgroud) 我的复选框中有一个 ImageSpan 和 ClickableSpan,用于在复选框文本末尾显示图标并处理单击它。但是单击它会更改复选框的选中状态,这是不需要的。
当用户单击 ClickableSpan 时,如何防止更改复选框状态?
cancelPendingInputEvents()
只是我需要API 16+ 的一些等效方法。另外,我不想将复选框与复选框和文本视图分开。
我想在 Android 中动态应用图像范围的背景颜色。
您能提出一些想法吗?
android textview spannablestring imagespan android-spannable