当您使用 xml 时,指定的尺寸以 dp - 与密度无关的像素为单位。但是在您的代码中,绘图函数将实际像素作为参数,您必须考虑到这一点并自己计算正确的值。
根据您的设备声明的屏幕密度 1dp 将转换为:
- LDPI (120 dpi) - 0.75 像素
- mdpi (160 dpi) - 1 像素
- 高清 (240 dpi) - 1.5 像素
- xhdpi (320 dpi) - 2 像素
- xxhdpi (480 dpi) - 3 像素
- xxxhdpi (640 dpi) - 4 像素
实际像素的计算公式为px = dp * (dpi / 160)
public class MyView extends EditText {
float mDensityScale;
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs, defStyleAttr);
}
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs, 0);
}
public MyView(Context context) {
super(context);
init(context, null, 0);
}
private void init(Context context, AttributeSet attrs, int defStyle)
{
final DisplayMetrics dm = context.getResources().getDisplayMetrics();
mDensityScale = dm.density;
}
private float pix(float dp)
{
return dp * mDensityScale;
}
@Override
protected void onDraw(Canvas canvas) {
Paint paint = new Paint();
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.GRAY);
RectF oval1 = new RectF(pix(50), pix(50), pix(300), pix(300));
canvas.drawOval(oval1, paint);
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.RED);
RectF oval2 = new RectF(pix(55), pix(55), pix(295), pix(295));
canvas.drawOval(oval2, paint);
}
}
您可以阅读更多内容:
- 支持多屏 http://developer.android.com/guide/practices/screens_support.html
- Android 中 px、dp、dip 和 sp 之间的区别? https://stackoverflow.com/questions/2025282/difference-between-px-dp-dip-and-sp-in-android