自定義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; } }