ฉันจะตรวจสอบว่าโทรศัพท์ Android อยู่ในแนวนอนหรือแนวตั้งได้อย่างไร
ฉันจะตรวจสอบว่าโทรศัพท์ Android อยู่ในแนวนอนหรือแนวตั้งได้อย่างไร
คำตอบ:
การกำหนดค่าปัจจุบันตามที่ใช้เพื่อกำหนดว่าทรัพยากรใดที่จะดึงมาจากConfiguration
วัตถุ'ทรัพยากร:
getResources().getConfiguration().orientation;
คุณสามารถตรวจสอบการวางแนวโดยดูที่ค่าของมัน:
int orientation = getResources().getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
// In landscape
} else {
// In portrait
}
ข้อมูลเพิ่มเติมสามารถพบได้ในนักพัฒนาซอฟต์แวร์ Android
android:screenOrientation="portrait"
) วิธีการนี้จะคืนค่าเดิมโดยไม่คำนึงว่าผู้ใช้หมุนอุปกรณ์อย่างไร ในกรณีนี้คุณต้องใช้ accelerometer หรือเซ็นเซอร์แรงโน้มถ่วงเพื่อหาทิศทางที่ถูกต้อง
หากคุณใช้การวางแนว getResources (). getConfiguration (). ในอุปกรณ์บางอย่างคุณจะเข้าใจผิด เราใช้วิธีการที่ครั้งแรกในhttp://apphance.com ต้องขอบคุณการบันทึกจากระยะไกลของ Apphance เราสามารถเห็นมันบนอุปกรณ์ต่าง ๆ และเราเห็นว่าการกระจายตัวของมันมีบทบาทที่นี่ ฉันเห็นกรณีแปลก ๆ : ตัวอย่างเช่นการสลับแนวตั้งและสี่เหลี่ยม (?!) ใน HTC Desire HD:
CONDITION[17:37:10.345] screen: rotation: 270 orientation: square
CONDITION[17:37:12.774] screen: rotation: 0 orientation: portrait
CONDITION[17:37:15.898] screen: rotation: 90
CONDITION[17:37:21.451] screen: rotation: 0
CONDITION[17:38:42.120] screen: rotation: 270 orientation: square
หรือไม่เปลี่ยนการวางแนวเลย:
CONDITION[11:34:41.134] screen: rotation: 0
CONDITION[11:35:04.533] screen: rotation: 90
CONDITION[11:35:06.312] screen: rotation: 0
CONDITION[11:35:07.938] screen: rotation: 90
CONDITION[11:35:09.336] screen: rotation: 0
ในทางกลับกันความกว้าง () และความสูง () ถูกต้องเสมอ (ถูกใช้โดยตัวจัดการหน้าต่างดังนั้นจึงควรดีกว่า) ฉันคิดว่าความคิดที่ดีที่สุดคือการตรวจสอบความกว้าง / ความสูงเสมอ ถ้าคุณคิดว่าสักครู่นี่คือสิ่งที่คุณต้องการ - เพื่อที่จะทราบว่าความกว้างนั้นเล็กกว่าความสูง (แนวตั้ง) ตรงข้าม (แนวนอน) หรือถ้าพวกเขาเหมือนกัน (จตุรัส)
จากนั้นก็ลงมาที่รหัสง่ายๆนี้:
public int getScreenOrientation()
{
Display getOrient = getWindowManager().getDefaultDisplay();
int orientation = Configuration.ORIENTATION_UNDEFINED;
if(getOrient.getWidth()==getOrient.getHeight()){
orientation = Configuration.ORIENTATION_SQUARE;
} else{
if(getOrient.getWidth() < getOrient.getHeight()){
orientation = Configuration.ORIENTATION_PORTRAIT;
}else {
orientation = Configuration.ORIENTATION_LANDSCAPE;
}
}
return orientation;
}
getWidth
และgetHeight
จะไม่คัดค้าน
getSize(Point outSize)
แทน ฉันใช้ API 23
อีกวิธีหนึ่งในการแก้ไขปัญหานี้คือการไม่พึ่งพาค่าส่งคืนที่ถูกต้องจากจอแสดงผล แต่อาศัยการแก้ไขปัญหาทรัพยากร Android
สร้างไฟล์layouts.xml
ในโฟลเดอร์res/values-land
และres/values-port
มีเนื้อหาดังต่อไปนี้:
ความละเอียด / ค่าที่ดิน / layouts.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="is_landscape">true</bool>
</resources>
ความละเอียด / ค่าพอร์ต / layouts.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<bool name="is_landscape">false</bool>
</resources>
ในซอร์สโค้ดของคุณคุณสามารถเข้าถึงการวางแนวปัจจุบันดังนี้:
context.getResources().getBoolean(R.bool.is_landscape)
วิธีระบุทิศทางปัจจุบันของโทรศัพท์โดยสมบูรณ์:
public String getRotation(Context context){
final int rotation = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();
switch (rotation) {
case Surface.ROTATION_0:
return "portrait";
case Surface.ROTATION_90:
return "landscape";
case Surface.ROTATION_180:
return "reverse portrait";
default:
return "reverse landscape";
}
}
Chear Binh Nguyen
getOrientation()
ผลงาน getRotation()
แต่นี้ไม่ถูกต้องถ้าใช้ ได้รับการหมุนแหล่งที่มา"Returns the rotation of the screen from its "natural" orientation."
ดังนั้นบนโทรศัพท์ที่บอกว่า ROTATION_0 เป็นแนวตั้งนั้นถูกต้อง แต่บนแท็บเล็ตการวางแนว "ธรรมชาติ" ของมันน่าจะเป็นแนวนอนและ ROTATION_0 ควรกลับแนวนอนแทนที่จะเป็นแนวตั้ง
นี่คือตัวอย่างข้อมูลโค้ดการแนะนำการวางแนวหน้าจอโดยhackbodและMartijn :
❶ทริกเกอร์เมื่อเปลี่ยนการวางแนว:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
int nCurrentOrientation = _getScreenOrientation();
_doSomeThingWhenChangeOrientation(nCurrentOrientation);
}
❷รับการปฐมนิเทศปัจจุบันตามที่hackbodแนะนำ:
private int _getScreenOrientation(){
return getResources().getConfiguration().orientation;
}
are มีทางเลือกอื่นสำหรับรับการวางแนวหน้าจอปัจจุบัน❷ติดตามโซลูชันMartijn :
private int _getScreenOrientation(){
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
return display.getOrientation();
}
★ หมายเหตุ : ฉันลองทั้งคู่ใช้❷ & ❸ แต่ใน RealDevice (NexusOne SDK 2.3) การวางแนวมันจะส่งคืนการวางแนวที่ไม่ถูกต้อง
★ดังนั้นฉันแนะนำให้ใช้วิธีแก้ปัญหา ❷เพื่อให้ได้แนวหน้าจอที่มีข้อดีมากกว่า: ชัดเจนง่ายและทำงานเหมือนมีเสน่ห์
★ตรวจสอบการคืนทิศทางอย่างระมัดระวังเพื่อให้แน่ใจว่าถูกต้องตามที่เราคาดหวัง (อาจมี จำกัด ขึ้นอยู่กับข้อกำหนดอุปกรณ์ทางกายภาพ)
หวังว่ามันจะช่วย
int ot = getResources().getConfiguration().orientation;
switch(ot)
{
case Configuration.ORIENTATION_LANDSCAPE:
Log.d("my orient" ,"ORIENTATION_LANDSCAPE");
break;
case Configuration.ORIENTATION_PORTRAIT:
Log.d("my orient" ,"ORIENTATION_PORTRAIT");
break;
case Configuration.ORIENTATION_SQUARE:
Log.d("my orient" ,"ORIENTATION_SQUARE");
break;
case Configuration.ORIENTATION_UNDEFINED:
Log.d("my orient" ,"ORIENTATION_UNDEFINED");
break;
default:
Log.d("my orient", "default val");
break;
}
ใช้getResources().getConfiguration().orientation
มันอย่างถูกวิธี
คุณต้องระวังภูมิประเทศประเภทต่างๆภูมิทัศน์ที่อุปกรณ์ใช้ตามปกติและอื่น ๆ
ยังไม่เข้าใจวิธีจัดการสิ่งนั้น
บางเวลาผ่านไปเนื่องจากคำตอบส่วนใหญ่ได้รับการโพสต์และบางส่วนก็ใช้วิธีการและค่าคงที่ในขณะนี้
ฉันได้อัปเดตโค้ดของ Jarekเพื่อไม่ใช้วิธีการและค่าคงที่เหล่านี้อีกต่อไป:
protected int getScreenOrientation()
{
Display getOrient = getWindowManager().getDefaultDisplay();
Point size = new Point();
getOrient.getSize(size);
int orientation;
if (size.x < size.y)
{
orientation = Configuration.ORIENTATION_PORTRAIT;
}
else
{
orientation = Configuration.ORIENTATION_LANDSCAPE;
}
return orientation;
}
โปรดทราบว่าโหมดConfiguration.ORIENTATION_SQUARE
ไม่ได้รับการสนับสนุนอีกต่อไป
ฉันพบว่าสิ่งนี้น่าเชื่อถือในทุกอุปกรณ์ที่ฉันทดสอบในทางตรงกันข้ามกับวิธีการแนะนำการใช้งาน getResources().getConfiguration().orientation
ตรวจสอบการวางแนวหน้าจอในรันไทม์
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Checks the orientation of the screen
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
}
มีอีกวิธีหนึ่งในการทำ:
public int getOrientation()
{
if(getResources().getDisplayMetrics().widthPixels>getResources().getDisplayMetrics().heightPixels)
{
Toast t = Toast.makeText(this,"LANDSCAPE",Toast.LENGTH_SHORT);
t.show();
return 1;
}
else
{
Toast t = Toast.makeText(this,"PORTRAIT",Toast.LENGTH_SHORT);
t.show();
return 2;
}
}
Android SDK สามารถบอกคุณได้ดี:
getResources().getConfiguration().orientation
ทดสอบในปี 2019 ใน API 28 ไม่ว่าผู้ใช้จะตั้งแนวตั้งหรือไม่และด้วยรหัสที่น้อยที่สุดเมื่อเปรียบเทียบกับคำตอบที่ล้าสมัยอื่นคำตอบต่อไปนี้จะให้การวางแนวที่ถูกต้อง:
/** @return The {@link Configuration#ORIENTATION_SQUARE}, {@link Configuration#ORIENTATION_PORTRAIT}, {@link Configuration#ORIENTATION_LANDSCAPE} constants based on the current phone screen pixel relations. */
private int getScreenOrientation()
{
DisplayMetrics dm = context.getResources().getDisplayMetrics(); // Screen rotation effected
if(dm.widthPixels == dm.heightPixels)
return Configuration.ORIENTATION_SQUARE;
else
return dm.widthPixels < dm.heightPixels ? Configuration.ORIENTATION_PORTRAIT : Configuration.ORIENTATION_LANDSCAPE;
}
ฉันคิดว่ารหัสนี้อาจใช้งานได้หลังจากการเปลี่ยนการวางแนวมีผล
Display getOrient = getWindowManager().getDefaultDisplay();
int orientation = getOrient.getOrientation();
แทนที่ฟังก์ชัน Activity.onConfigurationChanged (การกำหนดค่า newConfig) และใช้ newConfig การวางแนวถ้าคุณต้องการรับการแจ้งเตือนเกี่ยวกับการวางแนวใหม่ก่อนที่จะเรียก setContentView
ฉันคิดว่าใช้ getRotationv () ไม่ได้ช่วยเพราะ http://developer.android.com/reference/android/view/Display.html#getRotation%28%29 getRotation () คืนค่าการหมุนหน้าจอจาก "ธรรมชาติ" ปฐมนิเทศ.
ดังนั้นถ้าคุณไม่รู้จักการวางแนวที่เป็นธรรมชาติ
ฉันพบวิธีที่ง่ายกว่า
Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
if(width>height)
// its landscape
โปรดบอกฉันว่ามีปัญหากับคนนี้หรือไม่?
เช่นนี้จะซ้อนทับโทรศัพท์ทั้งหมดเช่น oneplus3
public static boolean isScreenOriatationPortrait(Context context) {
return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;
}
รหัสที่เหมาะสมดังต่อไปนี้:
public static int getRotation(Context context){
final int rotation = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getOrientation();
if(rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180){
return Configuration.ORIENTATION_PORTRAIT;
}
if(rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270){
return Configuration.ORIENTATION_LANDSCAPE;
}
return -1;
}
โพสต์เก่าฉันรู้ ไม่ว่าจะวางแนวหรือสลับ ฯลฯ ฉันออกแบบฟังก์ชั่นนี้ซึ่งใช้ในการตั้งค่าอุปกรณ์ในทิศทางที่ถูกต้องโดยไม่จำเป็นต้องรู้ว่าการจัดเรียงแนวตั้งและแนวนอนบนอุปกรณ์เป็นอย่างไร
private void initActivityScreenOrientPortrait()
{
// Avoid screen rotations (use the manifests android:screenOrientation setting)
// Set this to nosensor or potrait
// Set window fullscreen
this.activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
DisplayMetrics metrics = new DisplayMetrics();
this.activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
// Test if it is VISUAL in portrait mode by simply checking it's size
boolean bIsVisualPortrait = ( metrics.heightPixels >= metrics.widthPixels );
if( !bIsVisualPortrait )
{
// Swap the orientation to match the VISUAL portrait mode
if( this.activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT )
{ this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); }
else { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ); }
}
else { this.activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR); }
}
ทำงานเหมือนจับใจ!
ใช้วิธีนี้
int orientation = getResources().getConfiguration().orientation;
String Orintaion = "";
switch (orientation)
{
case Configuration.ORIENTATION_UNDEFINED: Orintaion = "Undefined"; break;
case Configuration.ORIENTATION_LANDSCAPE: Orintaion = "Landscrape"; break;
case Configuration.ORIENTATION_PORTRAIT: Orintaion = "Portrait"; break;
default: Orintaion = "Square";break;
}
ใน String คุณมี Oriantion
มีหลายวิธีในการทำเช่นนี้โค้ดนี้ใช้ได้กับฉัน
if (this.getWindow().getWindowManager().getDefaultDisplay()
.getOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) {
// portrait mode
} else if (this.getWindow().getWindowManager().getDefaultDisplay()
.getOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
// landscape
}
ฉันคิดว่าวิธีนี้ง่ายมาก
if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
user_todat_latout = true;
} else {
user_todat_latout = false;
}
ง่าย ๆ แค่สองบรรทัดโค้ด
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
// do something in landscape
} else {
//do in potrait
}
ง่ายและสะดวก :)
ที่ไฟล์ java ให้เขียน:
private int intOrientation;
ที่onCreate
วิธีการและก่อนที่จะsetContentView
เขียน:
intOrientation = getResources().getConfiguration().orientation;
if (intOrientation == Configuration.ORIENTATION_PORTRAIT)
setContentView(R.layout.activity_main);
else
setContentView(R.layout.layout_land); // I tested it and it works fine.
นอกจากนี้ยังเป็นที่น่าสังเกตว่าในปัจจุบันมีเหตุผลที่ดีน้อยกว่าในการตรวจสอบการวางแนวที่ชัดเจนด้วยgetResources().getConfiguration().orientation
หากคุณทำเช่นนั้นด้วยเหตุผลด้านโครงร่างเนื่องจากการสนับสนุน Multi-Window ที่เปิดตัวใน Android 7 / API 24+ อาจทำให้ยุ่งเหยิง ปฐมนิเทศ. ควรพิจารณาการใช้งานที่ดีกว่า<ConstraintLayout>
และเค้าโครงทางเลือกขึ้นอยู่กับความกว้างหรือความสูงที่มีอยู่พร้อมกับเทคนิคอื่น ๆ สำหรับการพิจารณาว่าจะใช้รูปแบบใดเช่นการมีอยู่หรือไม่ของชิ้นส่วนบางอย่างที่แนบมากับกิจกรรมของคุณ
คุณสามารถใช้สิ่งนี้ (ตามที่นี่ ):
public static boolean isPortrait(Activity activity) {
final int currentOrientation = getCurrentOrientation(activity);
return currentOrientation == ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT || currentOrientation == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
}
public static int getCurrentOrientation(Activity activity) {
//code based on https://www.captechconsulting.com/blog/eric-miles/programmatically-locking-android-screen-orientation
final Display display = activity.getWindowManager().getDefaultDisplay();
final int rotation = display.getRotation();
final Point size = new Point();
display.getSize(size);
int result;
if (rotation == Surface.ROTATION_0
|| rotation == Surface.ROTATION_180) {
// if rotation is 0 or 180 and width is greater than height, we have
// a tablet
if (size.x > size.y) {
if (rotation == Surface.ROTATION_0) {
result = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
} else {
result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
}
} else {
// we have a phone
if (rotation == Surface.ROTATION_0) {
result = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
} else {
result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
}
}
} else {
// if rotation is 90 or 270 and width is greater than height, we
// have a phone
if (size.x > size.y) {
if (rotation == Surface.ROTATION_90) {
result = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
} else {
result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
}
} else {
// we have a tablet
if (rotation == Surface.ROTATION_90) {
result = ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT;
} else {
result = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
}
}
}
return result;
}