Mô tảhướng màn hình Android khác nhau giữa các thiết bị
Tôi có một hoạt động mà hiển thị xem trước camera trên một cái nhìn bề mặt. Tôi không muốn nó được khởi động lại trên các thay đổi định hướng (vì nó liên tục quét mã QR), do đó hướng được khóa theo chiều dọc.
Sự cố tôi gặp phải là tôi cần hiển thị hướng dẫn trên màn hình cho người dùng ở cuối màn hình. Do màn hình bị khóa theo một hướng, tôi không được thông báo về hướng mới khi hoạt động không được vẽ lại. Do đó, các hướng dẫn được hiển thị ở cùng một vị trí bất kể điện thoại ở chân dung, quay ngược chân dung, phong cảnh hay cảnh quan được tôn kính.
Để giải quyết vấn đề này, tôi đã kết nối với trình quản lý cảm biến để đọc theo hướng trong thời gian thực. (Xem mã bên dưới) Sau khi đọc nó, tôi tự định hướng và di chuyển các hướng dẫn của mình theo yêu cầu khi mỗi bản cập nhật được gửi cho tôi. Điều này đã làm việc cho tôi cho đến thời gian gần đây. Khi thử nghiệm trên máy tính bảng Asus Transformer Prime và Xoom. Máy tính bảng sẽ trả về hướng "90" cho ảnh chân dung, thay vì "0" như 2 điện thoại khác của tôi. Vì vậy, như bạn có thể thấy trong đoạn code dưới đây, tôi kiểm tra cho máy tính bảng (màn hình lớn) và trừ đi thêm 90 độ.
Vấn đề
Vấn đề là mới Nexus 7 tablet không có thiên vị thêm này. Trong bức chân dung nó trả về "0", nhưng tôi phát hiện nó như một máy tính bảng, do đó, trừ 90 độ do đó kết quả là 270 và nó đặt hướng dẫn của tôi như thể máy tính bảng đang ở chế độ phong cảnh. Tôi cho rằng lý do đằng sau điều này là Xoom/Transformer được thiết kế để sử dụng trong cảnh quan và Nexus ở chế độ chân dung, nhưng trừ khi tôi biết về tất cả các thiết bị bị ảnh hưởng thì điều này không có tác dụng.
Câu hỏi
Có một cách đáng tin cậy để phát hiện các định hướng trên tất cả các thiết bị và trả lại kết quả trong "thời gian thực", như trong đoạn code dưới đây, nhưng có tính đến accoutn định hướng mặc định của thiết bị (ví dụ: Điện thoại + Nexus 7 là chân dung, nhưng hầu hết các máy tính bảng đều nằm ngang)?
Mã hiện tại
boolean large = ((getBaseContext().getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE);
boolean xlarge = ((getBaseContext().getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == 4);
isTablet = large || xlarge;
myOrientationEventListener = new OrientationEventListener(getBaseContext(), SensorManager.SENSOR_DELAY_NORMAL)
{
@Override
public void onOrientationChanged(int orientation)
{
if (orientation == -1)
{
return;
}
if (isTablet)
{
orientation += -90;
if (orientation < 0) // keep the result between 0-360
{
orientation += 360;
}
}
// Work out the orientation
if (orientation >= 60 && orientation <= 140)
{
screenOrientation = ScreenOrientation.Landscape_Reversed;
}
else if (orientation >= 140 && orientation <= 220)
{
screenOrientation = ScreenOrientation.Portrait_Reversed;
}
else if (orientation >= 220 && orientation <= 300)
{
screenOrientation = ScreenOrientation.Landscape;
}
else
{
screenOrientation = ScreenOrientation.Portrait;
}
//... Do stuff with new orientation here
}
};
[Đây Developer Điều] (http://android-developers.blogspot.com/2010/09/one-screen-turn-deserves-another.html) chứa một số thông tin tốt về chủ đề này. – FoamyGuy
Cảm ơn FoamyGuy. Tôi chưa bao giờ đọc blog, chỉ hướng dẫn dành cho nhà phát triển – JonWillis