2011-03-21 35 views
4

我想我碰到了一个讨厌的bug。的问题是,几乎水平线 具有轻微的梯度,并使用与StrokeWidth一个Paint = 1不 绘制,例如:在Android中Paint.StrokeWidth = 1的drawLine问题

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

在此先感谢!

回答

7

通过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); 
2

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