Как определить независимую от пикселя высоту в методе onDraw () - PullRequest
7 голосов
/ 11 августа 2011

Я расширил вид, чтобы создать собственный виджет. Я хотел бы определить высоту виджета с независимой единицей пикселей. Я думаю, что это можно сделать, умножив плотность пикселей на желаемую высоту, но я не знаю, как это сделать.

Что у меня есть (минимизировано):

public class Timeline extends View 
{

    @Override
    protected void onDraw(Canvas canvas) {
        //super.onDraw(canvas);
        int canvasWidth = canvas.getWidth();
        this.widgetWith = canvasWidth;


        this.setBackgroundGradientNoVideo();
        RectF rect = new RectF();
        rect.set(0, 0, canvasWidth, 50);
        //Dessin d'un rectangle de fond
        canvas.drawRoundRect(rect, 10, 10, this.paint);

    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // TODO Auto-generated method stub
        //super.onMeasure(widthMeasureSpec, 50);
        this.setMeasuredDimension(widthMeasureSpec, 50);
        this.widgetWith = MeasureSpec.getSize(widthMeasureSpec);
    }
}

Так что я хотел бы изменить строки

this.setMeasuredDimension(widthMeasureSpec, 50);

и

rect.set(0, 0, canvasWidth, 50);

К чему-то независимому от пикселей.

Спасибо

Ответы [ 2 ]

17 голосов
/ 11 августа 2011

умножьте значения пикселей на getResources().getDisplayMetrics().density, чтобы сделать пиксели независимыми от плотности. Если вы рисуете текст, вы можете вместо этого использовать scaledDensity.

плотность = 1 на дюйм, 1,5 на дюйм, и 0,75 на дюйм я считаю.

Чтобы завершить ответ, некоторые исходный код:

Либо используйте следующее при работе с представлениями или изображениями

int px = getResources().getDisplayMetrics().density * dp;  

Или при работе с текстом:

int px = getResources().getDisplayMetrics().scaledDensity * sp;
13 голосов
/ 11 августа 2011

Чтобы получить значения px из значений dp, вычислите

int px = getResources().getDisplayMetrics().density * dp;

Я рекомендую разместить где-нибудь статический метод, который принимает значение dp в качестве параметра, чтобы сделать это с меньшим количеством кода.Например, я создал класс ResolutionHelper, который при запуске приложения инициализируется с правильным значением плотности и имеет статический метод dipToPx (int dip), который затем можно использовать из любого места.

...