2015-01-10 2 views
1

У меня есть 4 Strings. Я хотел бы нарисовать прямоугольник вокруг каждого, и они будут равны расстоянию друг к другу. У меня есть код, который «работает», но мне нужно 3 пробела для моего последнего прямоугольника, чтобы сделать расстояние равным, и я не понимаю, почему. Я использую LG G Watch R, если это имеет значение.Android холст нарисовать несколько прямоугольников равного расстояния

private void drawDate(Canvas canvas, float centerX, float centerY) 
    { 
     float x = centerX + 75f; 
     float y = centerY + 50f; 
     String dayOfWeek = daysOfWeek[mTime.weekDay] + ","; 
     String month = months[mTime.month]; 
     String monthDay = mTime.monthDay + ","; 
     String year = Integer.toString(mTime.year); 
     float height = outLinePaint.getTextSize(); 
     float totalWidth = outLinePaint.measureText(String.format("%s %s %s %s", dayOfWeek, month, monthDay, year)); 
     final float spaceWidth = outLinePaint.measureText(" "); 
     x -= totalWidth/2f; 
     outLinePaint.setStyle(Paint.Style.FILL); 

     float halfWidth = outLinePaint.measureText(dayOfWeek)/2f; 
     canvas.drawRect(x - halfWidth, y - height, x + halfWidth, y + height /2f , whitePaint); 
     canvas.drawText(dayOfWeek, x, y, outLinePaint); 

     x += (halfWidth*2f)+spaceWidth; 
     halfWidth = outLinePaint.measureText(month)/2f; 
     canvas.drawRect(x - halfWidth, y - height, x + halfWidth, y + height /2f , whitePaint); 
     canvas.drawText(month, x, y, outLinePaint); 

     x += (halfWidth*2f)+spaceWidth; 
     halfWidth = outLinePaint.measureText(monthDay)/2f; 
     canvas.drawRect(x - halfWidth, y - height, x + halfWidth, y + height /2f , whitePaint); 
     canvas.drawText(monthDay, x, y, outLinePaint); 

     //THIS LINE 
     x += (halfWidth*2f)+spaceWidth+spaceWidth+spaceWidth; 
     //it looks right on the canvas, but why can I not simply 
     //x += (halfWidth*2f)+spaceWidth; like above? 
     halfWidth = outLinePaint.measureText(year)/2f; 
     canvas.drawRect(x - halfWidth, y - height, x + halfWidth, y + height /2f , whitePaint); 
     canvas.drawText(year, x, y, outLinePaint); 

     outLinePaint.setStyle(Paint.Style.STROKE); 
    } 

Примечание: Эта "BUG" только эффекты последней строки

Это то, что я ожидаю (И что я получу, если я использую x += (halfWidth*2f)+spaceWidth+spaceWidth+spaceWidth;):

"Correct"

Однако если я использую x += (halfWidth*2f)+spaceWidth;, как я это делаю с другими моими 3, я получаю:

enter image description here

+0

Это может помочь, если вы разместили изображение того, что вы ожидаете от того, что получаете сейчас. – Karakuri

+0

@ Karakuri, обновленный с изображениями. – MeetTitan

+0

Вы делаете это слишком сложным, почему вы используете оправдание центра? Также все это можно сделать легко, используя BackgroundColorSpan – pskink

ответ

0

Я решил. Я не мог заставить пример @ pskink работать на жизнь меня (он не рисовал на моем полотне). Проблема заключалась в моем выравнивании по центру.

x был в середине моего Rect не слева. В то время как я ожидал, что x будет самой левой точкой в ​​моем Rect, когда я добавил ее ширину в x.

Я установил его, установив выравнивание текста влево (так что x IS моей крайней левой точки), и изменение моего drawDate() метода:

float spaceWidth; 
private void drawDate(float centerX, float centerY) 
{ 
    float x = centerX + centerX*DATE_AND_COMPASS_X_OFFSET; 
    float y = centerY + centerY*DATE_AND_COMPASS_Y_OFFSET; 
    String dayOfWeek = daysOfWeek[mTime.weekDay] + ","; 
    String month = months[mTime.month]; 
    String monthDay = mTime.monthDay + ","; 
    String year = Integer.toString(mTime.year); 
    float height = outLinePaint.getTextSize(); 
    float totalWidth = outLinePaint.measureText(String.format("%s %s %s %s", dayOfWeek, monthnthDay, year)); 
    spaceWidth = outLinePaint.measureText(" "); 
    outLinePaint.setStyle(Paint.Style.FILL); 
    x-=totalWidth/2; 
    x+=drawDateInline(dayOfWeek, x, y, height); 
    x+=drawDateInline(month, x, y, height); 
    x+=drawDateInline(monthDay, x, y, height); 
    drawDateInline(year, x, y, height); 
    outLinePaint.setStyle(Paint.Style.STROKE); 
} 

private float drawDateInline(String word, float x, float y, float height) { 
    float width = outLinePaint.measureText(word); 
    canvas.drawRect(x, y - height, x + width, y + height /2f, whitePaint); 
    canvas.drawText(word, x, y, outLinePaint); 
    return width+spaceWidth; 
} 

Я также не уверен, как это " плохой подход ".

+0

«Плохо подход "- это сумма вашего кода, теперь сравните его с моим решением, и вывод очевиден – pskink

+0

@pskink, ваше« решение »не сработало для меня. Вывод для меня очень очевиден. Если бы вы могли предоставить мне пример РАБОТЫ, который был бы короче/элегантнее, я был бы более чем счастлив, чтобы голосовать, принимать и использовать ответ. – MeetTitan

+0

, если у вас возникли проблемы с интеграцией моего фрагмента, это класс COMPLETE: http://pastebin.com/nKmhifvS с объяснением, как использовать его в методе Activity.onCreate, я могу опубликовать скриншот, показывающий результат, если вы хотите – pskink

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