我通过扩展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;
),但这对低分辨率设备没有影响,但会使视图占用超过高分辨率设备上的整个屏幕(你看不到它)
那么为不同的设备制作自定义视图的最佳方法是什么?我是在正确的界限还是有另一种方式呢?
答案 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();
}