- Siêu lớp và danh mục iOS/Objective-C
- object-c - -1001 lỗi khi NSURLSession vượt qua httpproxy và /etc/hosts
- java - Nhận địa chỉ url bằng lớp mạng
- ios - Âm thanh không phát trong thông báo đẩy
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ế:
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:
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
.
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 đường
Và Ma 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ận
Thự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 tra
chiề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
phong cảnh
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/
Ứng dụng của tôi thay thế các "trang" nội dung SceneKit bằng hình ảnh và văn bản. Khi tôi chuyển từ trang hình ảnh sang trang SceneKit mới, nội dung từ trang SceneKit trước đó sẽ xuất hiện nhanh chóng và sau đó được thay thế bằng nội dung mới. thời trang. Tôi chỉ sử dụng một
Tôi đang cố xử lý (bằng C#) một tệp dữ liệu lớn chứa một số dữ liệu số. Cho một mảng các số nguyên, làm cách nào tôi có thể chia/nhóm nó để nếu n (hai hoặc nhiều) tiếp theo âm thì n phần tử trước đó được nhóm lại. Ví dụ: trong mảng sau, người ta nên sử dụng
Tôi chưa quen với những lời hứa và đã nghiên cứu chúng. Vì vậy, mã của tôi và sự hiểu biết của tôi: sql.connect(config).then(function(connection) { return Connection.req
Hiện tại tôi có một số mã trong khối if (roobaf) phụ thuộc vào việc foo và bar có sai hay không. Tôi có thể kiểm tra lại các điều kiện này bên trong khối, nhưng có vẻ như việc sao chép mã không cần thiết. nếu (foo) {
Tôi là một lập trình viên xuất sắc, rất giỏi!