1

我必须在视图上均匀分布文本。一直无法想出满足所有屏幕尺寸甚至常见屏幕尺寸的方法。我想要实现的布局如下所示。 分布式文本

红色框告诉我正在尝试处理的文本视图。

我尝试了以下方法:

1) 尝试使用带有和不带有九个补丁的图像,它不能正确缩放。2) 尝试使用不同大小的存储桶,例如 sw320 sw480 sw600 和 sw720。虽然它确实为我能够测试的设备解决了这个问题,但它并不可靠。我在这些存储桶中放置了不同的文本大小。

我讨厌在表格、网格或线性布局中使用 24 个 texview。

我还有什么其他选择?解决方案 2 使用起来非常令人沮丧,从尺寸导航到布局再返回大约 20 次。应该有更简单的方法来做到这一点,如果没有,请告诉我。

4

1 回答 1

1

使用自定义视图并覆盖 onDraw 来绘制数字。包含 View 的布局可以使用尺寸(来自 res/values/)指定其大小,并且 View 将根据这些尺寸自动计算出字体大小和数字之间的间距。

例如

自定义视图:

public class ColumnNumbersView extends View
{
    private final static int NUMBER_OF_COLUMNS = 25;
    private float textSize;
    private final Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    ...

获取尺寸:

    @Override 
    protected void onLayout(...
    {
        super.onLayout(...

        // work out our text size from getHeight()
        textSize = getHeight()/2; // or something like that

        // work out the spacing between the numbers along the x axis
        textPosXInc = (getWidth() / NUMBER_OF_COLUMNS) / 2; // or something like that
    }

做图:

    @Override
    protected void onDraw(final Canvas canvas)
    {
        super.onDraw(canvas);

        int x = 0;
        for(int i=0; i < NUMBER_OF_COLUMNS; i++)
        {
           final String number = String.valueOf(i);
           final int halfWidth = textPaint.measureText(number) / 2;

           canvas.drawText(number, x - halfWidth, 0, textPaint);

           x += textPosXInc; 
        }
    }

那应该会接近一些东西,但是第一个和最后一个数字不会正确绘制,我会留给你解决。

编辑

请记住,您不能将 wrap_content 用于此视图的尺寸,因为它没有通过覆盖 onMeasure() 来指定要包装的尺寸。所以它需要设置特定的尺寸,或者 match_parent。

于 2013-03-01T08:00:56.990 回答