2011-03-21 37 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);