2016-10-02 1 views
0

Je suis un peu coincé. Je cherche à créer une vue personnalisée comme une table! Mais la méthode onDraw dessine seulement la première cellule/rectangle.Android - Affichage personnalisé, ne dessine pas correctement

Ceci est mon point de vue:

public class CustomView extends View { 


    private static int ROWS = 8; 
    private static int COLS = 8; 

    final Paint p = new Paint(); 

    public CustomView(Context context) { 
     super(context); 

     p.setColor(Color.GREEN); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     canvas.drawColor(Color.RED); 

     float width = getWidth(); 
     float height = getHeight(); 
     float cellWidth = width/COLS; 
     float cellHeight = height/ROWS; 

     for(float row = 0; row<ROWS; row++) { 
      for(float col = 0; col<COLS; col++) { 
       RectF cell = new RectF((cellWidth*col), (cellHeight*row), cellWidth, cellHeight); 
       canvas.drawRect(cell, p); 
      } 
     } 
    } 

} 

Mon XML:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/mainLayout" 
    android:orientation="vertical" 
    android:background="#000000" 
    tools:context="com.biegertfunk.qlocktwo.Act_Main"> 


    <RelativeLayout 
     android:id="@+id/centerView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</LinearLayout> 

Mon activité:

public class Act_Main extends AppCompatActivity { 


//views 
public CustomView mainView; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.act_main); 

    int size = getSize(); 

    RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(size, size); 
    layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT); 


    RelativeLayout mainLayout = (RelativeLayout) findViewById(R.id.centerView); 

    mainView = new CustomView(this); 

    mainLayout.addView(mainView, layoutParams); 

} 

private int getSize() { 
    Display display = getWindowManager().getDefaultDisplay(); 
    Point size = new Point(); 
    display.getSize(size); 
    int width = size.x; 
    int height = size.y; 

    if(width>height) { 
     return height; 
    } else { 
     return width; 
    } 
} 

} 

Mais le résultat ne montre qu'un seul rectangle:

enter image description here

+0

postez votre xml également –

+0

Ajout d'un peu plus d'informations, merci! – Flo

Répondre

-1

Ajouter Le code

invalidate(); 

Pour

for(float row = 0; row<ROWS; row++) { 
     for(float col = 0; col<COLS; col++) { 
      RectF cell = new RectF((cellWidth*col), (cellHeight*row), cellWidth, cellHeight); 
      canvas.drawRect(cell, p); 
      invalidate(); 
     } 
    } 
+0

Ouch - L'appel 'invalidate()' dans 'onDraw()' aboutira à une boucle infinie. Vous ne devriez jamais appeler 'invalidate()' ici ... – gus27

1

Votre calcul de cell à l'intérieur onDraw() est faux. Essayez cette façon:

RectF cell = new RectF( 
    (cellWidth*col), (cellHeight*row), 
    (cellWidth*col)+cellWidth, (cellHeight*row)+cellHeight 
); 

Le constructeur de RectF est

RectF(float left, float top, float right, float bottom) 

pas

RectF(float left, float top, float width, float height) // WRONG 

Voir la documentation here.

0

L'ordre des paramètres transmis dans la méthode RectF est incorrect. Comme vous pouvez le voir dans la documentation de cette méthode dans RectF documentation Vous verrez que l'ordre de l'argument est left, top, right et bottom respectivement. De plus, votre argument de gauche doit être inférieur ou égal à l'argument de droite, ce qui pourrait ne pas être vu votre code.