2013-07-11 3 views
1

Я застрял в canvas.drawLines().Android drawLines - ширина линии отличается

В моем приложении отображается дорожка om map view, но результирующие строки ужасные. Кто-нибудь видел такое поведение? I., линии не имеют такой же ширины, даже не «квадратные», а ромбы, а иногда даже исчезают!

Я тестировал с() {drawLine()} вместо этого, а drawPath - то же самое.

Скриншот принял 10" таблетки 1280x800, Fujitsu. Lenovo планшет показывает то же самое.

http://jpegshare.net/c8/1d/c81daa6cff15e3d14cb1268679bb1af1.png.html

borderPaint = new Paint(); 
    borderPaint.setAntiAlias(true); 
    borderPaint.setStrokeWidth(5);   
    borderPaint.setStyle(Paint.Style.STROKE); 
    borderPaint.setColor(Color.WHITE); 
    //borderPaint.setAlpha(190);  


    fillPaint = new Paint(); 
    fillPaint.setAntiAlias(true); 
    fillPaint.setStyle(Paint.Style.STROKE); 
    fillPaint.setStrokeWidth(3); 
    fillPaint.setColor(Color.RED); 

.... 
    canvas.drawLines(linepoints, 0, linepoints_count, borderPaint); 
    canvas.drawLines(linepoints, 0, linepoints_count, fillPaint); 

, где linepoints является массив путевых линий рисовать. Каждая строка устанавливается из 4-х чисел с плавающей точкой .

+0

Ну, я понял свою проблему. – user2574421

ответ

2

Ну, я понял, моя проблема. Надеюсь, что это может помочь кому-то.

Перед нанесением линии, я

canvas.translate(X, Y); 

где значения X и Y являются ОГРОМНЫМИ. Как 10E + 6..10E + 7 или что-то в этом роде.

Когда рисую линии, их значения xy тоже огромны, но отрицательные, поэтому в координатах экрана это xy + XY дает что-то внутри экрана, но этот факт имеет значение и создает проблему, описанную в моем собственном первом сообщении. Почему это происходит? Я нашел ключ. Когда алгоритм drawLine пытается нарисовать линию, он перепутал с координатами линии (деление, умножение), и поскольку машинная арифметика ограничена в точности, алгоритм получает неправильные числа.

How this was solved? 

I dicarded canvas.translate() и calulate COORDS экрана на лету, как раз перед рисованием.

Теперь, как этот

screen_line_coords_x = line_coord_x - X; //X is offset applied in translate.   
screen_line_coords_y = line_coord_y - Y; //Y is offset applied in translate. 

canvas.drawLine(screen_line_coords_x, screen_line_coords_y, ...); 
... or drawLines() or drawPath() - all give good results. 

Надеется, что это может помочь.

0

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

Попробуйте пересмотреть свои расчеты, чтобы работать внутри отображаемых координат.

+0

Ваш ответ не ясен. Если вы столкнулись с одним и тем же, какое решение? и на каких «переводах/поворотах/масштабирования» вы ссылаетесь? – yakobom

Смежные вопросы