キャンバス上に四角形を描画しようとしていますが、Androidの四角形描画の詳細を理解するのに苦労しています。私はチュートリアルと可能な限りすべてを読みましたが、行き詰っています。
この画像では、赤い長方形がターゲットです。
長方形のサイズに関係なく、ベースの上と長方形の中央に赤い長方形のビットを描画する必要があります。私がここで直面している最悪の悪夢は、X、Yの幅と高さの座標を理解することです。
誰もがその数学の仕組みを説明できますか、いつか上に行くと、Yは非常に小さくなりますが、同じ幅の座標は高くなります。そして、赤い内側の長方形を適切に正当化することはできません。画面によっては、他の画面でうまく機能しません。赤い長方形が親長方形から出てくる場合があります。
アジェンダは、座標がどのように機能するかを理解し、内側の赤い長方形の整合性を確保することです
例に基づいて説明を得るのは素晴らしいことです。私は使っている-
void drawRect(float left, float top, float right, float bottom, Paint paint)
長方形を描く
Xは左から右に水平に走ります。 Yは上から下に垂直に走ります。グラフィックスとまったく同じです。 (0/0)は左上にあります。
「上」に移動すると、Yはもちろん上から下に向かって小さくなります。
ListViewsのような要素のレイアウトに注意を払う必要があります。これらは、描画されるビューに部分的な(または新しい、わかりません)キャンバスを提供します。これらのビューは、自分の上/左の位置に0x0を持ちます。絶対値が必要な場合は、後でView.getLocationOnScreen()
を呼び出して、自分でオフセットを計算する必要があります。
canvas.drawRect(left,top,right,bottom,Paint);
これで
left:キャンバスの左側から長方形の左側までの距離。
top:キャンバスの上側から長方形の上側の距離
これは理にかなっています。
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)
かくして
RectF myRectum = new RectF(left, top, right, bottom);
canvas.drawRect(myRectum, myPaint);
私のアプローチはシンプルで簡単です
int x = 100; //position coordinate from left
int y = 100; //position coordinate from top
int w = 100; //width of the rectangle
int h = 100; //height of the rectangle
drawRectangle(x, y, w, h, canvas, Paint);
ここに私の機能があります
public void drawRectangle(int left, int top, int right, int bottom, Canvas canvas, Paint paint) {
right = left + right; // width is the distance from left to right
bottom = top + bottom; // height is the distance from top to bottom
canvas.drawRect(left, top, right, bottom, Paint);
}
それはかなりうまくいきます
以下のように私のノートは、あなたが相対性、長方形、キャンバス、ビューに属することを理解するのに役立ちます。
/**
* 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)
*/