cuốn sách gpt4 ai đã làm

Vẽ lại nhiều đường dẫn ở cùng một vị trí từ hướng bố cục trước đó

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 18:55:43 26 4
mua khóa gpt4 Nike

Theo trước đây của tôi "Làm cách nào để tạo BottomBar dưới dạng StickyBottomCaptureLayout trong api Android của camera2?” vấn đề, tôi đã tạo một tập tin với thanh dính (SB) luôn bị khóa phía trên/gần thanh hệ thống. tôi ở đây onLayout() Vị trí và tọa độ mặc định cho SB và các bố cục khác được đặt ở (chính xác như câu trả lời của tôi ).

Bố cục phía trên là một tùy chỉnh đơn giản DrawView, có hình do người dùng vẽ Con đường Danh sách mảng. Khi thiết bị được xoay nó sẽ gọi onDraw() và gọi nó nhiều lần canvas.drawPath(). Nhưng,Con đường sẽ được vẽ lại bằng cách sử dụng cùng tọa độ như trước nhưng với vị trí và kích thước bố cục khác. Những ảnh chụp màn hình này thể hiện hành vi thực tế:

chân dung phong cảnh

Trái: dọc - phải: ngang

Nhưng tôi muốn giữ nguyên tọa độ và vị trí khi hướng thay đổi, như thế này:

chân dung phong cảnh

Bên trái: Chân dung tương tự như trên - Bên phải: Phong cảnh có tọa độ "chân dung"

sử dụng android:orientation="chân dung" Khóa Hoạt động của tôi không phải là giải pháp được mong đợi. tôi sử dụng android:configChanges="định hướng" và một Trình nghe định hướng để phát hiện sự xoay và ngăn chặn sự tái tạo hoàn toàn Hoạt động.

  • tôi đã cố gắng onLayout() Tôi có thể đặt một vị trí khác trong đó, nhưng rõ ràng đó không phải là cách làm đúng đắn.
  • Trước đây tôi đã thử chuyển đổi nhiều thứ như thế này Con đường:

    for (Đường dẫn đường dẫn: mPathList) {
    Ma trận ma trận = Ma trận mới();
    Giới hạn RectF = RectF mới();
    path.computeBounds(giới hạn, đúng);

    // điểm trung tâm để xoay
    float cuối cùng px =bounds.centerX();
    float cuối cùng py =bounds.centerY();
    // điểm khoảng cách để di chuyển
    phao cuối cùng dx;
    phao cuối cùng dy;
    /** Tôi đã thử tính toán nhiều lần mà không thành công, đó là
    không đáng để dán những phép tính ngu ngốc này vào đây... **/

    ma trận.postRotate(xoay, px, py); // góc quay là 90°, -90° hoặc 0
    ma trận.postTranslate(dx, dy);
    path.transform(ma trận);
    }
  • Tôi cũng đã thử xoay Canvas như sau:

    @Ghi đè
    khoảng trống được bảo vệ onDraw(Canvas canvas) {
    canvas.save();
    canvas.rotate(xoay); // góc quay là 90°, -90° hoặc 0

    canvas.drawColor(mDrawHelper.getBackgroundViewColor());
    for (int i=0; i < mPathList.size(); i++) {
    canvas.drawPath(mPathList.get(i), mPaintList.get(i));
    }
    if (mPath != null && mPaint != null)
    canvas.drawPath(mPath, mPaint);

    canvas.restore();
    }

Dù sao, tôi đã thử rất nhiều nhưng dường như không có gì hiệu quả trong trường hợp cụ thể này. Có ai có ý tưởng tuyệt vời để chia sẻ có thể giúp tôi đi đúng hướng không?
Cảm ơn trước sự giúp đỡ của bạn.

câu trả lời hay nhất

gia hạn: Phương pháp đã được đơn giản hóa và dễ thực hiện hơn. Ứng dụng mẫu đã được cập nhật.

Tôi nghĩ tôi hiểu bạn muốn làm gì. Bạn muốn biểu đồ vẫn nhất quán với xác định của bạn Chú ýCaptureLayout mối quan hệ. Tôi thích sử dụng Con đườngMa trận Phương pháp chuyển đổi.

Sau khi xác định vòng quay xảy ra trên thiết bị, hãy tạo mộtMa trậnThực hiện các phép quay tương ứng xung quanh tâm của đồ họa.

mMatrix.postRotate(rotationDegrees, oldBounds.centerX(), oldBounds.centerY());

Đây làgiới hạn cũLà ranh giới của đồ họa trước vị trí. Chúng ta sẽ sử dụng điều này để xác định lề của hình được xoay. Tiếp tục quay

mPath.transform(mMatrix)

Đồ họa được xoay nhưng không ở đúng vị trí. Nó ở vị trí cũ nhưng đã xoay. Tạo bản dịch Ma trận nói chung Con đường Di chuyển đến vị trí thích hợp. Việc tính toán thực tế phụ thuộc vào vòng quay. Đối với một góc quay 90 độ, phép tính là

transY = -newBounds.bottom; // di chuyển phần dưới cùng của đồ họa lên trên cùng của Chế độ xem
transY += getHeight(); // di chuyển xuống cuối khung nhìn đã xoay
transY -= (getHeight() - oldBounds.right); // cuối cùng di chuyển lên trên lề phải cũ
transX = -newBounds.left; // Kéo đồ họa sang bên trái của vùng chứa
transX += getWidth() - oldBounds.bottom // và kéo sang phải để lấy lề

其中 xuyên Y là bản dịch Y,chuyển giới là bản dịch X. giới hạn cũ là ranh giới trước khi quay,giới hạn mới là ranh giới sau khi quay. Điều quan trọng cần lưu ý ở đây là getWidth() sẽ cho bạn "cái cũ"Xem chiều cao, trong khi getHeight() sẽ cho bạn cái cũ Kiểm trachiều rộng.

Đây là một chương trình mẫu thực hiện những gì tôi đã mô tả ở trên. Đồ họa sau đây hiển thị các góc quay 90 độ khi sử dụng ứng dụng mẫu này.

Ứng dụng demo

gói com.example.rotatetranslationdemo;

import android.app.Activity;
nhập android.content.Context;
nhập android.graphics.Bitmap;
nhập android.graphics.Canvas;
nhập android.graphics.Color;
nhập android.graphics.Matrix;
nhập android.graphics.Paint;
nhập android.graphics.Path;
nhập android.graphics.RectF;
nhập android.os.Bundle;
nhập android.view.Display;
nhập android.view.Surface;
nhập android.view.View;
nhập android.view.WindowManager;

lớp công khai MainActivity mở rộng Hoạt động {

dv DrawView riêng tư;
Paint mPaint riêng;

@Ghi đè
khoảng trống được bảo vệ trênCreate(Gói đã lưuInstanceState) {
super.onCreate(savedInstanceState);
dv = Bản vẽ mới (cái này);
setContentView(dv);
mPaint = Sơn mới();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setColor(Color.GREEN);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeWidth(12);
}

lớp công khai DrawView mở rộng Chế độ xem {

Bitmap riêng tư mBitmap;
Đường dẫn riêng mPath;
Sơn riêng mBitmapPaint;
Bối cảnh bối cảnh;
sơn sơn riêng;
Ma trận mMatrix = Ma trận mới();
RectF oldBounds = new RectF();
RectF newBounds = RectF mới();

Bản vẽ công khai(Ngữ cảnh c) {
siêu (c);
bối cảnh = c;
mBitmapPaint = Sơn mới(Paint.DITHER_FLAG);
sơn = Sơn mới();
Paint.setAntiAlias(true);
Paint.setColor(Color.BLUE);
Paint.setStyle(Paint.Style.STROKE);
Paint.setStrokeJoin(Paint.Join.MITER);
Paint.setStrokeWidth(4f);
}

@Ghi đè
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);

mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
}

@Ghi đè
khoảng trống được bảo vệ onDraw(Canvas canvas) {
Hiển thị hiển thị = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay();
int spinningDegrees = 0;
float transX = 0;
float transY = 0;

super.onDraw(canvas);

canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);

// Xác định góc quay của màn hình.
chuyển đổi (display.getRotation()) {
trường hợp Surface.ROTATION_0:
phá vỡ;

trường hợp Surface.ROTATION_90:
xoayDegrees = 270;
phá vỡ;

trường hợp Surface.ROTATION_180:
xoayDegrees = 180;
phá vỡ;

trường hợp Surface.ROTATION_270:
xoayDegrees = 90;
phá vỡ;

default:
xoayDegrees = 0;
phá vỡ;
}

if (mPath == null) { // Chỉ cần xác định những gì chúng ta đang vẽ/di chuyển
mPath = setupGraphic();
}

// Định vị lại đồ họa có tính đến góc quay hiện tại.
if (rotationDegrees != 0) {
mMatrix.reset();
// Xoay đồ họa theo tâm và đúng vị trí.
mPath.computeBounds(oldBounds, true);
mMatrix.postRotate(rotationDegrees, oldBounds.centerX(), oldBounds.centerY());
mPath.transform(mMatrix);
// Lấy giới hạn của đồ họa được xoay
mPath.computeBounds(newBounds, true);
mMatrix.reset();
if (rotationDegrees == 90) {
transY = -newBounds.bottom; // di chuyển phần dưới cùng của đồ họa lên trên cùng của Chế độ xem
transY += getHeight(); // di chuyển xuống cuối khung nhìn đã xoay
transY -= (getHeight() - oldBounds.right); // cuối cùng di chuyển lên trên lề phải cũ
transX = -newBounds.left; // Kéo đồ họa sang bên trái của vùng chứa
transX += getWidth() - oldBounds.bottom // và kéo sang phải để lấy lề
} khác nếu (rotationDegrees == 270) {
transY = -newBounds.top; // kéo phần trên của đồ họa lên trên cùng của View
transY += getHeight() - oldBounds.right // di chuyển xuống lề phải cũ;
transX = getWidth() - newBounds.right; // Kéo sang bên phải của View
transX -= getHeight() - oldBounds.right; // Thiết lập lại lề phải;
}
mMatrix.postTranslate(transX, transY);
mPath.transform(mMatrix);
}
canvas.drawPath(mPath, mPaint);
}

// Xác định đồ họa mà chúng ta sẽ vẽ và di chuyển.
Thiết lập đường dẫn riêng tưGraphic() {
int startX;
int bắt đầuY;
đường viền int cuối cùng = 20;
Đường dẫn đường dẫn;

nếu (getHeight() > getWidth()) {
startX = getWidth() - đường viền - 1;
startY = getHeight() - đường viền - 1;
} khác {
startX = getHeight() - đường viền - 1;
startY = getWidth() - đường viền - 1;
}
startX = startX - 200;

Pt[] myLines = {
Pt mới (startX, startY),
Pt mới(startX, startY - 500),

Pt mới (startX, startY),
Pt mới(startX - 100, startY),

Pt mới(startX, startY - 500),
Pt mới(startX - 50, startY - 400),

Pt mới(startX, startY - 500),
Pt mới(startX + 50, startY - 400),

Pt mới(startX + 200, startY),
Pt mới(startX + 200, startY - 500)
};

//Tạo đường dẫn cuối cùng
đường dẫn = Đường dẫn mới();
for (int i = 0; i < myLines.length; i = i + 2) {
path.moveTo(myLines[i].x, myLines[i].y);
path.lineTo(myLines[i + 1].x, myLines[i + 1].y);
}

return path;
}

chuỗi cuối cùng tĩnh riêng tư TAG = "Bản vẽ";

}

// Lớp giữ cặp có thứ tự
lớp riêng Pt {
nổi x, y;

Pt(float _x, float _y) {
x = _x;
y = _y;
}
}
}

chân dung

nhập mô tả hình ảnh ở đây

phong cảnh

nhập mô tả hình ảnh ở đây

Về android - vẽ lại nhiều đường dẫn ở cùng một vị trí từ hướng bố cục trước đó, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/42986817/

26 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress