2015-08-13 3 views
1

После создания рисунка ниже я заметил, что по некоторым причинам некоторые черные линии появляются слабо, тогда как некоторые из них хорошо видны. Какой код можно использовать для обеспечения того, чтобы ширина черных линий между серыми ящиками составляла ровно 1dp, а ширина красных прямоугольников - ровно 5dp?Линии, кажущиеся слабыми на холсте

enter image description here

public class RectangleTextView extends View { 
    private final Paint mBackPaint = new Paint(); 
    private final Paint mRedPaint = new Paint(); 
    private int mSideRectWidth = 10; 

    public RectangleTextView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mBackPaint.setColor(Color.BLACK); 
     mRedPaint.setColor(Color.RED); 
    } 

    @Override protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     if (getWidth() == 0) 
      return; 

     //draw grey boxes 
     setBackgroundColor(Color.parseColor("#808080")); 
     int boxWidth = getWidth()/7; 

     //draw black line 
     for (int i = 0; i < 7; i++) { 
      canvas.drawLine(mSideRectWidth + boxWidth * i, 0, mSideRectWidth + boxWidth * i, getHeight(), mBackPaint); 
     } 

     //draw left end rectangle 
     canvas.drawRect(0, 0, mSideRectWidth, getHeight(), mRedPaint); 

     //draw right end rectangle 
     canvas.drawRect(getWidth() - mSideRectWidth, 0, getWidth(), getHeight(), mRedPaint); 
    } 
} 
+0

'... чтобы ширина черных линий между серыми ящиками составляла ровно 1dp, а ширина красных прямоугольников точно равна 5dp? Возможно, вы путаетесь в ** px ** и * * дп **. Методы 'drawXYZ()' объекта холста работают в ** px **, в то время как вам нужно ** dp **, для независимости плотности. –

+0

Итак, в зависимости от вашей плотности тока вы должны преобразовать желаемые ** dp ** s в ** px ** s, чтобы позволить методам 'drawXYZ()' использовать правильные значения. –

+0

'mBackPaint.setStrokeWidth (2f);' –

ответ

1

Это весь путь, в котором вы инициализировать Paint объект? Я не знаю значения по умолчанию, используемые конструктором по умолчанию. Я обычно устанавливаю их явно: снимите ANTI_ALIAS_FLAG, установите стиль Paint.Style.STROKE и установите желаемый штрих width. Некоторые из значений, которые вам нужны, могут быть по умолчанию, я просто не знаю.

При работе с тонкими линиями выключение ANTI_ALIAS_FLAG может быть очень важным.

+0

Нужно увидеть какой-то код, как я этого никогда не делал. Я хочу, чтобы тонкие линии были точно равны 1dp. – MacaronLover

+0

int valueInPx = (int) TypedValue.applyDimension (TypedValue.COMPLEX_UNIT_DIP, , getResources(). GetDisplayMetrics()); или int valueInPx = getResources(). GetDimension (resourceID) - для чтения из ресурсов \t \t Paint linePaint = new Paint(); \t \t linePaint.setAntiAlias ​​(false); \t \t linePaint.setStrokeWidth (valueInPx); \t \t linePaint.setStyle (Style.STROKE); –

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