在项目中尝试用surfaceview自绘UI来提高用户滑动体验,其中要在特定区域中绘制Text,而且要求固定长度,这就需要自己计算Text所占的宽度,并进行处理。
最终效果:
float text_size = 25.0f;
public void drawBooks() {
Canvas canvas = new Canvas(bmp_shelf);
int i=0;
float row_average = d.screen_width/4.0f;
int offset_x = (int)((row_average - bmp_book.getWidth())/2.0f);
int offset_y = rowheight - bmp_book.getHeight() - 20;
int title_offset_y = (int)(90.0f*dpi/240.0f);
TextPaint textPaint = new TextPaint();
textPaint.setARGB(0xff, 255, 255, 255);
textPaint.setTextSize(text_size);
textPaint.setTextAlign(Align.RIGHT);
textPaint.setAntiAlias(true);
for(Iterator<BookData> itr=d.list_book.iterator();itr.hasNext();) {
BookData bd = itr.next();
int r = i/4;
int book_x = (int)((i%4)*(row_average)+offset_x);
int book_y = r*rowheight+offset_y;
canvas.drawBitmap(bmp_book, book_x, book_y, null);
String title = measureTitle(bd.title);
StaticLayout layout = new StaticLayout(title, textPaint, 240, Alignment.ALIGN_NORMAL, 1.0F, 0.0F, true);
canvas.translate(book_x+bmp_book.getWidth(), book_y+title_offset_y);
layout.draw(canvas);
canvas.translate(-book_x-bmp_book.getWidth(), -book_y-title_offset_y);
i++;
}
}
public String measureTitle(String title) {
TextPaint textPaint = new TextPaint();
textPaint.setTextSize(text_size);
if(textPaint.measureText(title, 0, title.length())<bmp_book.getWidth())
return title;
int i; String str=null;
for(i=title.length();i>0;i--) {
str = title.substring(0, i) + "...";
float width = textPaint.measureText(str);
if(width<bmp_book.getWidth()) {
break;
}
}
return str;
}
其中关键代码在measureTitle上。