2011-03-21 4 views
4

Je pense que j'ai frappé un bug méchant. Le problème est que les lignes presque horizontales avec une légère pente et en utilisant une peinture avec strokeWidth = 1 ne sont pas comploté, par exemple:drawLine problème avec Paint.StrokeWidth = 1 dans Android

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); 
    } 

}

Et en utilisant la classe MyControl ainsi:

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); 
    } 

}

Réglage strokeWidth à 0 ou> 1 toutes les lignes sont tracées.

Quelqu'un peut-il apporter quelque lumière à ce sujet ou dois-je soumettre ce problème en tant que Android Issue?

Merci d'avance!

Répondre

7

En réglant strokeWidth à 0 vous dire androïde de tirer avec une largeur de ligne des cheveux (qui est habituellement une 1px sur un appareil). Si vous définissez la largeur de trait sur 1, la valeur est ensuite mise à l'échelle, c'est-à-dire sur les périphériques ldpi, elle serait de 0,75 * 1 = 0,75 px. Donc, la ligne pourrait ne pas être rendue. Réglage ANTI_ALIAS_FLAG sur votre appareil de peinture pourrait aider:

Paint pen = new Paint(Paint.ANTI_ALIAS_FLAG); 

Sinon, vous pouvez calculer la largeur de course pour la densité de courant:

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

utilisation Paint pen = new Paint(Paint.ANTI_ALIAS_FLAG);

Questions connexes