¿Cuál sería la mejor manera de determinar el tamaño de la pantalla en una clase externa y luego ajustar el ancho del trazo de una vista de captura de escritura a mano, para que se escale bien?

Tengo esta clase SignatureCanvas.java, en una biblioteca externa. Como puede ver, configuré el ancho del trazo en una constante, lo que funciona (¡nada extraño allí!). Sin embargo, como he estado probando en varios dispositivos y emuladores (de diferentes tamaños de pantalla), el ancho del trazo no se traduce en ningún tipo de píxel->inmersión debajo del capó (¡lo cual es comprensible!). Entonces, en tamaños de pantalla más antiguos o más pequeños, este ancho de trazo de 8, en realidad parece que es 14, y la firma se vuelve ilegible.

Hice una lluvia de ideas y se me ocurrió la idea de generalizar las resoluciones de pantalla y tener un ancho de trazo predeterminado para cada 'soporte' (por así decirlo), y aplicarlo cuando lo necesite. Sin embargo, eso parece un poco tonto y me preguntaba si alguien ha tenido este dilema anteriormente y cómo lo resolvió.

La clase está aquí puramente con fines de demostración, no hay nada malo con el código en sí.

 package com.goosesys.gooselib.Views;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuff;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class SignatureCanvas extends View {
    private final float STROKE_WIDTH = 8f;
    private final boolean ANTI_ALIAS = true;
    private final int DEFAULT_PEN_COLOUR = 0xFF000000;

    private Path drawPath;
    private Paint drawPaint;
    private Paint canvasPaint;
    private int paintColour = DEFAULT_PEN_COLOUR;

    private Canvas drawCanvas;
    private Bitmap canvasBitmap;

    /*
     * Constructors
     */

    // Main in-code constructor //
    public SignatureCanvas(Context context) {
        super(context);
        setupDrawing();
    }

    // Constructor for use in UI layout tool - Custom Views
    public SignatureCanvas(Context context, AttributeSet attributeSet){
        super(context, attributeSet);
        setupDrawing();
    }   


    /*
     * Methods
     */
    private void setupDrawing(){
        drawPath = new Path();
        drawPaint = new Paint();

        // set initial colour for drawing
        drawPaint.setColor(paintColour);

        // setup paths
        drawPaint.setAntiAlias(ANTI_ALIAS);
        drawPaint.setStrokeWidth(STROKE_WIDTH);
        drawPaint.setStyle(Paint.Style.STROKE);
        drawPaint.setStrokeJoin(Paint.Join.ROUND);
        drawPaint.setStrokeCap(Paint.Cap.ROUND);

        // finally create a new canvas paint object
        canvasPaint = new Paint(Paint.DITHER_FLAG);
    }

    public void clearCanvas(){
        drawCanvas.drawColor(0, PorterDuff.Mode.CLEAR);
        invalidate();   
    }

    public Bitmap saveSignature(){
        return Bitmap.createBitmap(canvasBitmap);
    }

    /*
     * (non-Javadoc)
     * @see android.view.View#onSizeChanged(int, int, int, int)
     */
    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh){
        super.onSizeChanged(w, h, oldw, oldh);
        // view given size

        canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
        drawCanvas = new Canvas(canvasBitmap);
    }

    @Override
    protected void onDraw(Canvas canvas){
        // draw view
        canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
        canvas.drawPath(drawPath, drawPaint);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event){
        // detect user touch
        float touchX = event.getX();
        float touchY = event.getY();

        switch(event.getAction()){
        case MotionEvent.ACTION_DOWN:
            drawPath.moveTo(touchX, touchY);
            break;
        case MotionEvent.ACTION_MOVE:
            drawPath.lineTo(touchX, touchY);
            break;
        case MotionEvent.ACTION_UP:
            drawCanvas.drawPath(drawPath, drawPaint);
            drawPath.reset();
            break;
        default:
            return false;
        }

        invalidate();
        return true;
    }   
}
respuesta
public static int convertDpsToPixels(Context context, int dps) {
    // http://developer.android.com/guide/practices/screens_support.html

    // Convert the dps to pixels
    final float scale = context.getResources().getDisplayMetrics().density;
    final float dpsFloat = dps;
    return (int) (dpsFloat * scale + 0.5f);

}