Android实现文字和图片混排(文字环绕图片)效果

这篇文章主要介绍了Android实现文字和图片混排的方法,实例分析了文字环绕图片效果的具体功能显示及页面布局实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
本文实例讲述了Android实现文字和图片混排(文字环绕图片)效果。分享给大家供大家参考,具体如下:
在平时我们做项目中,或许有要对一张图片或者某一个东西进行文字和图片说明,这时候要求排版美观,所以会出现文字和图片混排的情况,如图:
这里写图片描述

这种情况就是上下两个文字说明是连续在一起的,这就要求我们计算上面的文字说明怎么和下面的文字说明连贯结合在一起呢,这就要求我们进行计算了,下面给出代码,代码中也有详细的注释,原理也很简单。

因为算是比较简单,直接就在activity中去计算了:

package com.example.test;
import android.app.Activity;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity extendsActivity {
  booleanimageMeasured = false;
  TextView tv_right;
  TextView tv_bottom;
  staticfinal String text = "叶凡:小说主角,与众老同学在泰山聚会时一同被九龙拉棺带离地球," +
      "进入北斗星域,得知自己是荒古圣叶凡 叶凡体。历险禁地,习得源术,斗圣地世家,战太古生物,"+
      "重组天庭,叶凡辗转四方得到许多际遇和挑战,功力激增,眼界也渐渐开阔。一个浩大的仙侠世界,"+
      "就以他的视角在读者面前展开。姬紫月:姬家小姐,出场年龄十七岁。被叶凡劫持一同经历青铜古殿历险,"+
      "依靠碎裂的神光遁符解除禁制,反过来挟持叶凡一同进入太玄派寻找秘术。"+
      "在叶凡逃离太玄后姬紫月在孔雀王之乱中被华云飞追杀,又与叶凡[2]相遇,被叶凡护送回姬家"+
      ",渐渐对叶凡产生微妙感情。后成为叶凡的妻子,千载后于飞仙星成仙,在叶凡也进入仙路后再见庞博:"+
      "叶凡大学时最好的朋友,壮硕魁伟,直率义气。到达北斗星域后因服用了圣果被灵墟洞天作为仙苗,"+
      "在青帝坟墓处为青帝十九代孙附体离去,肉身被锤炼至四极境界。后叶凡与黑皇镇压老妖神识,"+
      "庞博重新掌控自己身躯,取得妖帝古经和老妖本体祭炼成的青莲法宝,习得妖帝九斩和天妖八式,"+
      "但仍伪装成老妖留在妖族。出关后找上叶凡,多次与他共进退。星空古路开启后由此离开北斗,"+
      "被叶凡从妖皇墓中救出,得叶凡授予者字秘、一气化三清,与叶凡同闯试炼古路,一起建设天庭";
  // 屏幕的高度
  intscreenWidth = 0;
  // 总共可以放多少个字
  intcount = 0;
  // textView全部字符的宽度
  floattextTotalWidth = 0.0f;
  // textView一个字的宽度
  floattextWidth = 0.0f;
  Paint paint =new Paint();
  @Override
  publicvoid onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tv_right = (TextView) findViewById(R.id.test_tv_right);
    tv_bottom = (TextView) findViewById(R.id.test_tv_bottom);
    finalImageView imageView = (ImageView) findViewById(R.id.test_image);
    imageView.setImageResource(R.drawable.ee);
    screenWidth = getWindowManager().getDefaultDisplay().getWidth();
    /**
     * 获取一个字的宽度
     */
    textWidth = tv_right.getTextSize();
    paint.setTextSize(textWidth);
    /**
     * 因为图片一开始的时候,高度是测量不出来的,通过增加一个监听器,即可获取其图片的高度和长度
     */
    ViewTreeObserver vto = imageView.getViewTreeObserver();
    vto.addOnPreDrawListener(newViewTreeObserver.OnPreDrawListener() {
      publicboolean onPreDraw() {
        if(!imageMeasured) {
          imageMeasured =true;
          intheight = imageView.getMeasuredHeight();
          intwidth = imageView.getMeasuredWidth();
          drawImageViewDone(width, height);
        }
        returnimageMeasured;
      }
    });
  }
  privatevoid drawImageViewDone(intwidth, int height) {
    // 一行字体的高度
    intlineHeight = tv_right.getLineHeight();
    // 可以放多少行
    intlineCount = (int) Math.ceil((double) height / (double) lineHeight);
    // 一行的宽度
    floatrowWidth = screenWidth - width - tv_right.getPaddingLeft() - tv_right.getPaddingRight();
    // 一行可以放多少个字
    intcolumnCount = (int) (rowWidth / textWidth);
    // 总共字体数等于 行数*每行个数
    count = lineCount * columnCount;
    // 一个TextView中所有字符串的宽度和(字体数*每个字的宽度)
    textTotalWidth = (float) ((float) count * textWidth);
    measureText();
    tv_right.setText(text.substring(0, count));
    // 检查行数是否大于设定的行数,如果大于的话,就每次减少一个字符,重新计算行数与设定的一致
    while(tv_right.getLineCount() > lineCount) {
      count -=1;
      tv_right.setText(text.substring(0, count));
    }
    tv_bottom.setPadding(0, lineCount * lineHeight - height,0, 0);
    tv_bottom.setText(text.substring(count));
  }
  /**
   * 测量已经填充的长度,计算其剩下的长度
   */
  privatevoid measureText() {
    String string = text.substring(0, count);
    floatsize = paint.measureText(string);
    intremainCount = (int) ((textTotalWidth - size) / textWidth);
    if(remainCount > 0) {
      count += remainCount;
      measureText();
    }
  }
}

其中xml文件布局如下:

<?xmlversion="1.0"encoding="utf-8"?>
<ScrollViewxmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:orientation="vertical">
  <RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">
    <ImageView
      android:id="@+id/test_image"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:scaleType="fitXY"/>
    <TextView
      android:id="@+id/test_tv_right"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:layout_toRightOf="@id/test_image"
      android:gravity="fill_horizontal"
      android:paddingLeft="7dp"
      android:textSize="16sp"/>
    <TextView
      android:id="@+id/test_tv_bottom"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:layout_below="@id/test_image"
      android:gravity="fill_horizontal"
      android:textSize="16sp"/>
  </RelativeLayout>
</ScrollView>

代码很少,原理也很简单,后来发现这种做法在大部分手机运行是完美的,但是少部分手机还是有点问题。是什么问题呢,是在我们测量textView的长度的是,因为是我们刚刚进行setText,然后马上进行测量,这样得到的结果是不正确的,所以大家可以优化一下。温馨提示,当我们setText之后,可以延时一些时间再去测量,这样获取的值就是挣钱的了,当然那个延迟的时间很短50毫秒就可以了,因为我们要相信textView的绘制速度还是很快的。

希望本文所述对大家Android程序设计有所帮助。

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现图文,可以使用一个自定义的 EditText 控件,并在其中添加一个 ImageView 控件来实现。 以下是实现方法: 1.创建一个自定义的带有 ImageView 控件的 EditText 控件。 ```java public class RichEditText extends androidx.appcompat.widget.AppCompatEditText { public RichEditText(Context context) { super(context); } public RichEditText(Context context, AttributeSet attrs) { super(context, attrs); } public RichEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } //插入图片 public void insertImage(Bitmap bitmap) { SpannableString ss = new SpannableString(" "); ImageSpan span = new ImageSpan(getContext(), bitmap); ss.setSpan(span, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); append(ss); } } ``` 2.在布局文件中使用自定义的 EditText 控件。 ```xml <com.example.richedittextdemo.RichEditText android:id="@+id/edit_text" android:layout_width="match_parent" android:layout_height="wrap_content" /> ``` 3.在 Activity 中获取自定义的 EditText 控件,并添加一个点击事件。 ```java public class MainActivity extends AppCompatActivity { private RichEditText editText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = findViewById(R.id.edit_text); editText.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //调用选择图片的方法 chooseImage(); } }); } //选择图片 private void chooseImage() { Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, 1); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK && requestCode == 1) { try { Uri selectedImage = data.getData(); InputStream inputStream = getContentResolver().openInputStream(selectedImage); Bitmap bitmap = BitmapFactory.decodeStream(inputStream); editText.insertImage(bitmap); } catch (FileNotFoundException e) { e.printStackTrace(); } } } } ``` 4.在 onActivityResult 方法中获取选择的图片,并调用自定义的 EditText 控件的 insertImage 方法,将图片插入到 EditText 中。 以上就是在 Android实现 EditText 插入图片实现图文的方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值