Проблема drawLine с Paint.StrokeWidth = 1 в Android - PullRequest
5 голосов
/ 21 марта 2011

Я думаю, что попал в неприятную ошибку.Проблема заключается в том, что почти горизонтальные линии с небольшим градиентом и использованием Paint с StrokeWidth = 1 не отображаются, например:

public class MyControl extends View {

   public MyControl(Context context) {
           super(context);
           // TODO Auto-generated constructor stub
   }

   @Override
   protected void onDraw(Canvas canvas)
   {
           super.onDraw(canvas);

       Paint pen = new Paint();
       pen.setColor(Color.RED);
       pen.setStrokeWidth(1);
       pen.setStyle(Paint.Style.STROKE);

           canvas.drawLine(100, 100, 200, 90, pen); //not painted
           canvas.drawLine(100, 100, 200, 100, pen);
           canvas.drawLine(100, 100, 200, 110, pen); //not painted
           canvas.drawLine(100, 100, 200, 120, pen); //not painted
           canvas.drawLine(100, 100, 200, 130, pen);

           pen.Color = Color.MAGENTA;
           pen.setStrokeWidth(2);

           canvas.drawLine(100, 200, 200, 190, pen);
           canvas.drawLine(100, 200, 200, 200, pen);
           canvas.drawLine(100, 200, 200, 210, pen);
           canvas.drawLine(100, 200, 200, 220, pen);
           canvas.drawLine(100, 200, 200, 230, pen);
   }

}

И использование класса MyControl следующим образом:

public class prova extends Activity {
   /** Called when the activity is first created. */
   @Override
   public void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);

           MyControl ctrl = new MyControl(this);
           setContentView(ctrl);
   }

}

При установке для StrokeWidth значения 0 или> 1 все линии отображаются.

Может кто-нибудь пролить свет на это или я должен представить этот вопрос как Android Issue ?

Заранее спасибо!

Ответы [ 2 ]

8 голосов
/ 21 марта 2011

Установив значение strokeWidth равным 0, вы говорите, что Android должен рисовать с шириной линии роста волос (которая обычно составляет 1 пиксель на любом устройстве). Если вы установите ширину обводки на 1, значение будет масштабировано, то есть на устройствах с ldpi оно будет равно 0,75 * 1 = 0,75 пикселей. Таким образом, строка может не отображаться вообще. Установка ANTI_ALIAS_FLAG для вашего устройства рисования может помочь:

Paint pen = new Paint(Paint.ANTI_ALIAS_FLAG);

В качестве альтернативы вы можете рассчитать ширину хода для плотности тока:

pen.setStrokeWidth(1 / getResources().getDisplayMetrics().density);
2 голосов
/ 21 марта 2011

Использование Paint pen = new Paint(Paint.ANTI_ALIAS_FLAG);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...