在项目中尝试用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上。