Android中的Paint.StrokeWidth = 1的drawLine问题

时间:2011-03-21 11:33:52

标签: java android canvas

我想我遇到了一个令人讨厌的错误。问题是近乎水平的线条 稍微渐变并使用带有StrokeWidth = 1的Paint不是 绘制,例如:

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 个答案:

答案 0 :(得分:8)

通过将strokeWidth设置为0,您可以说要使用细线宽度绘制android(在任何设备上通常为1px)。如果将笔划宽度设置为1,则将该值缩放,即在ldpi设备上,它将为0.75 * 1 = 0.75px。所以这条线可能根本没有渲染。将ANTI_ALIAS_FLAG设置为您的绘图设备可能有所帮助:

Paint pen = new Paint(Paint.ANTI_ALIAS_FLAG);

或者,您可以计算电流密度的笔划宽度:

pen.setStrokeWidth(1 / getResources().getDisplayMetrics().density);

答案 1 :(得分:2)

使用 Paint pen = new Paint(Paint.ANTI_ALIAS_FLAG);