不同设备的自定义视图大小

时间:2013-12-11 18:14:09

标签: android android-layout android-view android-custom-view

我通过扩展View类来创建自定义视图。目前我有一个int来定义视图的大小。然后我重写onMeasure方法并使宽度和高度等于int。

像这样:

private int DEFAULT_SIZE = 80;
public Paint mOuterCirclePaint = new Paint();

@Override
protected void onDraw(Canvas canvas) {

mOuterCirclePaint.setStyle(Style.STROKE);
    mOuterCirclePaint.setStrokeWidth(5.0f);
    mOuterCirclePaint.setDither(true);
    mOuterCirclePaint.setAntiAlias(true);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

    setMeasuredDimension(
            DEFAULT_SIZE + 5
                    + (int) mOuterCirclePaint.getStrokeWidth() / 2,
            DEFAULT_SIZE + 5
                    + (int) mOuterCirclePaint.getStrokeWidth() / 2);

}


public void setSize(int defaultSize) {
    DEFAULT_SIZE = defaultSize;
    invalidate();

}

但这意味着我的观点在不同分辨率的不同设备上无法很好地扩展。在高分辨率设备上,视图看起来很小,但在低分辨率设备上,视图很大。

我不认为为每个分辨率创建新视图是个好主意。我尝试将视图缩放DEFAULT_SIZE乘以设备的密度(float scale = getResources().getDisplayMetrics().density;),但这对低分辨率设备没有影响,但会使视图占用超过高分辨率设备上的整个屏幕(你看不到它)

那么为不同的设备制作自定义视图的最佳方法是什么?我是在正确的界限还是有另一种方式呢?

1 个答案:

答案 0 :(得分:3)

您可以使用维度资源并使用

int defaultSize = (int)context.getResources().getDimension(R.dimen.default_size);

res / values / dimes.xml中的自定义视图的构造函数中

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="default_size">80dp</dimen>
</resources>

现在,由于设备屏幕的密度,尺寸将缩放。

以下是测量视图的简单示例:

public class MeasuredView extends View
{
    private int m_defaultSize;

    public MeasuredView(Context context)
    {
        super(context);

        init(context);
    }

    public MeasuredView(Context context, AttributeSet attrs)
    {
        super(context, attrs);

        init(context);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
    {
        setMeasuredDimension(m_defaultSize, m_defaultSize);
    }

    private void init(Context context)
    {
        m_defaultSize = (int)context.getResources().getDimension(R.dimen.default_value);
    }
}

在xhdpi尺寸为160 px,在hdpi为120,在mdpi为80.

您应该知道setSize(int defaultSize)将参数值作为像素,因此如果您想将其设置为dp,则可以编写方法

public void setDefaultSizeDp(int defaultSizeDp)
    {
        int defaultSizePx = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, defaultSizeDp, getResources().getDisplayMetrics());

        m_defaultSize = defaultSizePx;
        invalidate();
    }