ImageSpan

自定义ImageSpan继承类,可以设置图片大小和位置

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Paint.FontMetricsInt;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.text.style.ImageSpan;

import com.xuehu365.xuehu.utils.LogHelp;

/**
 * Created by Administrator on 2016/10/20.
 */
public class MyImageSpan extends ImageSpan {
    public MyImageSpan(Context arg0, int arg1) {
        super(arg0, arg1);
    }

    public int getSize(Paint paint, CharSequence text, int start, int end,
                       Paint.FontMetricsInt fm) {
        Drawable d = getDrawable();
//        Drawable d2 = zoomDrawable(d, 50, 50);
        Rect rect = d.getBounds();
        if (fm != null) {
            FontMetricsInt fmPaint = paint.getFontMetricsInt();
            int fontHeight = fmPaint.bottom - fmPaint.top;
            int drHeight = rect.bottom - rect.top;

            int top = drHeight / 2 - fontHeight / 4;
            int bottom = drHeight / 2 + fontHeight / 4;

            fm.ascent = -bottom;
            fm.top = -bottom;
            fm.bottom = top;
            fm.descent = top;
        }
        return rect.right;
    }

    @Override
    public void draw(Canvas canvas, CharSequence text, int start, int end,
                     float x, int top, int y, int bottom, Paint paint) {
        Drawable b = getDrawable();
        canvas.save();
        int transY = 0;
        transY = ((bottom - top) - b.getBounds().bottom) / 2 + top;
        canvas.translate(x, transY);
        b.draw(canvas);
        canvas.restore();
    }

    public Drawable zoomDrawable(Drawable drawable, int w, int h) {
        int width = drawable.getIntrinsicWidth();
        int height = drawable.getIntrinsicHeight();
        Bitmap oldbmp = drawableToBitmap(drawable);// drawable转换成bitmap
        Matrix matrix = new Matrix();   // 创建操作图片用的Matrix对象
        float scaleWidth = ((float) w / width);   // 计算缩放比例
        LogHelp.i("move", "width:" + width + ";;w:" + w + ";;scaleWidth:" + scaleWidth);
        float scaleHeight = ((float) h / height);
        matrix.postScale(scaleWidth, scaleHeight);         // 设置缩放比例
        Bitmap newbmp = Bitmap.createBitmap(oldbmp, 0, 0, width, height, matrix, true);       // 建立新的bitmap,其内容是对原bitmap的缩放后的图
        return new BitmapDrawable(newbmp);       // 把bitmap转换成drawable并返回
    }

    public Bitmap drawableToBitmap(Drawable drawable)// drawable 转换成bitmap
    {
        int width = drawable.getIntrinsicWidth();   // 取drawable的长宽
        int height = drawable.getIntrinsicHeight();
        Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565;         // 取drawable的颜色格式
        Bitmap bitmap = Bitmap.createBitmap(width, height, config);     // 建立对应bitmap
        Canvas canvas = new Canvas(bitmap);         // 建立对应bitmap的画布
        drawable.setBounds(0, 0, width, height);
        drawable.draw(canvas);      // 把drawable内容画到画布中
        return bitmap;
    }
}
时间: 2024-10-11 00:56:58

ImageSpan的相关文章

关于Android使用TextView+ImageSpan同一行文字图片居中的问题

项目开发中遇到了这样一个需求,标签(图片)和文字,标签显示在标题的开头,自然而然想到了用TextView+ImageSpan的方式来弄,开始没有思路,网上搜索一下基本上都有说到,但是都没有解决一个问题,就是居中.怎么设置都设置不了!后来找到一篇文章里面介绍了ImageSpan的getSize()方法设置了展示位置!下面给出自定义修改的ImageSpan,至于怎么用ImageSpan就不多说了 /** * 垂直居中的ImageSpan * * @author KenChung */ public

[bug修复方案分享]ImageSpan居中问题

1.背景及原因分析: 之前我们自定义的ImageSpan,居中的算法是这样: 这个计算方法使用bottom这一参数为基准,进行居中计算.如果一个textview设置了行距,在android5及以上的操作系统,textview在单行和多行是这个bottom值是不一样的(单行文本无行距).导致居中的显示有误. 2.解决办法: 须要找到一个合理的基准,我以y这个参数为基准.从源码上观察,y即字体排印学中的基线(wiki地址,可能被墙). 则新的计算方法为:

Android ImageSpan与TextView中的text居中对齐问题解决(无论TextView设置行距与否)

先解释一个类:Paint.FontMetrics,它表示绘制字体时的度量标准.google的官方api文档对它的字段说明如下: ascent: 字体最上端到基线的距离,为负值. descent:字体最下端到基线的距离,为正值. 看下图: 中间那条线就是基线,基线到上面那条线的距离就是ascent,基线到下面那条线的距离就是descent. 回到主题,我们要让imagespan与text对齐,只需把imagespan放到descent线和ascent线之间的中间位置就可以了.实现方式为重写Imag

Android笔记:TextView和编辑框中添加图片,ImageSpan,SpannableStringBuilder用法

在TextView或者编辑框EditText中添加图片的方法,代码如下: import java.util.regex.Matcher; import java.util.regex.Pattern; import android.os.Bundle; import android.app.Activity; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text

我的Android进阶之旅------>Android关于ImageSpan和SpannableString的初步了解

最近要实现一个类似QQ聊天输入框,在输入框中可以同时输入文字和表情图像的功能.如下图所示的效果: 为了实现这个效果,先去了解了一下ImageSpan和SpannableString的用法.下面用一个小实例来看看具体的用法,效果如下: 代码如下: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.acti

android 图文一起 textview SpannableString和ImageSpan类的使用

今天讲解一下SpannableString和ImageSpan类 Bitmap bitmap = null; bitmap = BitmapFactory.decodeResource(getResources(), imageIds[arg2 % imageIds.length]); //第一个参数包括整个图片资源,第二个指定id ImageSpan imageSpan = new ImageSpan(NeighborCommunicationMessageActivity.this, bit

android平台TextView使用ImageSpan展示GIF图片

android-gif-drawable(https://github.com/koral--/android-gif-drawable/releases)开源项目---是一个蛮不错的android gif显示实现.本文在android-gif-drawable基础上介绍如何实现TextView.EditText上展示Gif动态图. 网上有蛮多介绍这个框架使用的文章,比如http://www.open-open.com/lib/view/open1404888098200.html. 核心类Gi

Android ImageSpan的使用

编辑框中加图片 代码如下: mSubjectDetailView = (TextView) findViewById(R.id.subject_detail); CharSequence text = "如图所示★,dsfdsfdddd,如果fdsfs★东东"; SpannableStringBuilder builder = new SpannableStringBuilder(text); String rexgString = "★"; Pattern pat

AndroidRichText 让Textview轻松的支持富文本(图像ImageSpan、点击效果等等类似QQ微信聊天)

代码地址:https://github.com/Luction/AndroidRichText AndroidRichText帮助实现像QQ,微信一样的,一个TextView里既有文字又有表情又有图片的效果,采用插件化的框架,代码简单,可拓展性强. 基础框架包只有四个java文件, RichTextWrapper :TextView的包裹类,实现支持富文本,通过new RichTextWrapper(TextView v)来构造. RTMovementMethod: 继承自Android原生的L