web-dev-qa-db-fra.com

Comprendre le fonctionnement réel de drawRect ou des coordonnées de dessin dans Android

J'essaie de dessiner un rectangle sur une toile et je fais face à des problèmes pour comprendre le dessin en profondeur du rectangle d'Android. J'ai lu des tutoriels et tous les possibles mais je suis coincé.

Ici dans l'image, le rectangle rouge est ma cible .enter image description here

Indépendamment de toute taille de rectangle, je dois dessiner le bit de rectangle rouge au-dessus de la base et au milieu du rectangle. Le pire cauchemar auquel je suis confronté est la compréhension des coordonnées X, Y de largeur et de hauteur.

Quelqu'un peut-il expliquer comment cela fonctionne, parfois nous montons, Y atteint très petit mais les mêmes coordonnées de largeur sont plus élevées. Et je ne peux jamais justifier correctement le rectangle intérieur rouge. Dans certains écrans, cela fonctionne bien dans d’autres, il échoue. Le rectangle rouge sort parfois du rectangle parent.

L'ordre du jour consiste à comprendre le fonctionnement des coordonnées et à garantir l'intégrité du rectangle rouge intérieur

Ce sera formidable d'obtenir une explication basée sur un exemple. J'utilise-

void drawRect(float left, float top, float right, float bottom, Paint paint)

dessiner le rectangle 

23
Abhishek Choudhary

X est horizontal, de gauche à droite. Y est vertical, de haut en bas. C'est exactement la même chose que sur vos graphiques. Donc (0/0) est en haut à gauche.

Quand vous montez "Y", il va bien sûr devenir plus petit, car il grandit de haut en bas.

Vous devez faire attention à la disposition des éléments tels que ListViews, ils donneront un canevas partiel (ou nouveau, que vous ne pouvez pas dire) à vos vues dessinées. Ces vues auront 0x0 à leur propre position haut/gauche. Si vous avez besoin de l'absolu, vous devez ensuite appeler View.getLocationOnScreen() et calculer vous-même les compensations.

16
meredrica

canvas.drawRect(left,top,right,bottom,Paint);

Dans ce 

  1. left: distance entre le côté gauche du rectangle et le côté gauche de la toile

  2. top: distance entre le dessus du rectangle et le dessus de la toile

  3. right: distance entre le côté droit du rectangle et le côté gauche de la toile
  4. bottom: Distance entre le bas du rectangle et le haut du canevas.
30
Savan

Cela aura du sens.

float left = 100, top = 100; // basically (X1, Y1)

float right = left + 100; // width (distance from X1 to X2)
float bottom = top + 100; // height (distance from Y1 to Y2)

Ainsi

RectF myRectum = new RectF(left, top, right, bottom);
canvas.drawRect(myRectum, myPaint);
17
TheRealChx101

J'aimerais que ma note ci-dessous vous aide à comprendre que la relativité appartient à rect, à la toile et à la vue.

/**
 * Rect holds four integer coordinates for a rectangle.
 * The rectangle is represented by the coordinates of its 4 edges (left, top, right bottom).
 * These fields can be accessed directly. Use width() and height() to retrieve the rectangle's width and height.
 *
 * Note that the right and bottom coordinates are exclusive.
 * This means a Rect being drawn untransformed onto a Canvas will draw into the column and row described by its left and top coordinates
 * , but not those of its bottom and right.
 *
 * With regard to calling to Canvas#drawRect(left,top,right,bottom,Paint)
 *
 * left: Distance of the left side of rectangle from left side of canvas.
 * top: Distance of top side of rectangle from the top side of canvas
 * right: Distance of the right side of rectangle from left side of canvas.
 * bottom: Distance of the bottom side of rectangle from top side of canvas.
 * __________________________________
 *|
 *|
 *|   __l_______________________r__
 *|  |         view group A        |
 *| t|  0______________________w   |
 *|  |  | **** view group B *** |  |
 *|  |  | **** canvas of B **** |  |
 *|  |  | ********************* |  |
 *|  |  | ********************* |  |
 *|  |  | ********************* |  |
 *|  |  | ***** __________ **** |  |
 *|  |  | *****|## rect ##|**** |  |
 *|  |  | *****|##########|**** |  |
 *|  |  | *****|##########|**** |  |
 *|  |  | *****|##########|**** |  |
 *|  |  | *****|##########|**** |  |
 *|  |  | ***** ---------- **** |  |
 *|  |  | ********************* |  |
 *| b|  h-----------------------   |
 *|  |                             |
 *|  |                             |
 *|   -----------------------------
 *|
 * -----------------------------------
 *
 * 1. l, t, r, b are coordinates of view group B (PastryChart) relative to view group A (parent of PastryChart).
 * 2. The size of canvas of B is same as the size of the view group B
 *    , which means canvas of B is a canvas which the view group B is rendered to.
 * 3. The coordinates of rect is relative to a canvas, here is the canvas of B
 *    , which means the coordinates of rect going to represent child of view group B are relative to the canvas of B.
 *    ex. for a rect holding left = 0, the position of its left is located on the same position of the left of view group B
 *    ex. for a rect holding right = w, the position of its right is located on the same position of the right of view group B
 *    ex. for a rect holding top = 0, the position of its top is located on the same position of the top of view group B
 *    ex. for a rect holding bottom = h, the position of its bottom is located on the same position of the bottom of view group B
 * 4. The rect is used to stored the child measurement computed in measure pass
 *    for forward positioning child view (PastryView) in the layout pass taken by parent view (PastryChart).
 * 5. All of them are in pixels (px)
 */
0
牟家宏