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; } }