通过扩展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;
)来缩放视图,但这对低分辨率的设备没有影响,但是会使视图占据整个屏幕更多的空间(您看不到它)在高分辨率设备上
那么为不同设备制作自定义视图的最佳方法是什么?我是在正确的路线上吗,还是有另一种方法呢?
您可以使用维度资源并使用
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像素,在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();
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句