Android根据感应器设置横竖屏

article/2023/6/4 16:05:18

Android根据感应器设置横竖屏


需求:
1、手机横屏模式时webview展示的内容为竖屏方向
2、手机竖屏模式时webview展示的内容为横屏方向

public class MainActivity extends AppCompatActivity {private WebView webView;private String path = "https://www.baidu.com/";private OrientationEventListener listener;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);listener = new OrientationEventListener(this) {@Overridepublic void onOrientationChanged(int orientation) {Log.i("lala","onOrientationChanged===>" + orientation);boolean isPortrait = PolyvScreenUtils.isPortrait(MainActivity.this);if ((orientation > -1 && orientation <= 10) || orientation >= 350 || (orientation <= 190 && orientation >= 170)) {if (isPortrait){PolyvScreenUtils.setLandscape(MainActivity.this);}} else if ((orientation <= 100 && orientation >= 80) || (orientation <= 280 && orientation >= 260)) {if (!isPortrait){PolyvScreenUtils.setPortrait(MainActivity.this);}}}};listener.enable();webView = findViewById(R.id.webView_guide);webView.setWebViewClient(new WebViewClient() {@Overridepublic void onPageStarted(WebView view, String url, Bitmap favicon) {super.onPageStarted(view, url, favicon);}@Overridepublic void onPageFinished(WebView view, String url) {super.onPageFinished(view, url);}});webView.getSettings().setLoadWithOverviewMode(true);webView.getSettings().setUseWideViewPort(true);webView.loadUrl(path);}@Overrideprotected void onDestroy() {super.onDestroy();if (listener != null){listener.disable();}if (webView != null) {webView.stopLoading();webView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);webView.clearHistory();((ViewGroup) webView.getParent()).removeView(webView);webView.destroy();webView = null;}}}
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.Point;
import android.os.Build;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.WindowManager;/*** 与屏幕相关的工具类*/
public class PolyvScreenUtils {private static int height16_9;// 生成竖屏下w:h=16:9的高public static int generateHeight16_9(Activity activity) {return height16_9 != 0 ? height16_9 : (height16_9 = getNormalWH(activity)[isPortrait(activity) ? 0 : 1] * 9 / 16);}// 获取竖屏下w:h=16:9的高public static int getHeight16_9() {return height16_9;}// 是否竖屏public static boolean isPortrait(Context context) {return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT;}// 是否横屏public static boolean isLandscape(Context context) {return context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;}// 设置竖屏public static void setPortrait(Activity activity) {activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);}// 设置横屏public static void setLandscape(Activity activity) {activity.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);}/*** 获取包含状态栏的屏幕宽度和高度** @param activity* @return {宽,高}*/public static int[] getNormalWH(Activity activity) {if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {DisplayMetrics dm = new DisplayMetrics();activity.getWindowManager().getDefaultDisplay().getMetrics(dm);return new int[]{dm.widthPixels, dm.heightPixels};} else {Point point = new Point();WindowManager wm = activity.getWindowManager();wm.getDefaultDisplay().getSize(point);return new int[]{point.x, point.y};}}// 重置状态栏public static void reSetStatusBar(Activity activity) {if (isLandscape(activity)) {hideStatusBar(activity);hideNavigationBar(activity);} else {setDecorVisible(activity);}}// 隐藏状态栏public static void hideStatusBar(Activity activity) {if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);} else {View decorView = activity.getWindow().getDecorView();activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);int uiOptions = View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN| View.SYSTEM_UI_FLAG_IMMERSIVE | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;decorView.setSystemUiVisibility(uiOptions);}}// 恢复为不全屏状态public static void setDecorVisible(Activity activity) {if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);} else {View decorView = activity.getWindow().getDecorView();activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);int uiOptions = View.SYSTEM_UI_FLAG_VISIBLE;decorView.setSystemUiVisibility(uiOptions);}}public static void hideNavigationBar(Activity activity) {int uiOptions = activity.getWindow().getDecorView().getSystemUiVisibility();activity.getWindow().getDecorView().setSystemUiVisibility(uiOptions | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);}public static int dip2px(Context context, float dpValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue * scale + 0.5f);}public static int px2dip(Context context, float dpValue) {final float scale = context.getResources().getDisplayMetrics().density;return (int) (dpValue / scale + 0.5f);}
}

https://www.dgrt.cn/a/2089214.html

相关文章

CUDA矩阵转置(共享内存 tile)

Udacity的CUDA编程课程中介绍了CUDA实现矩阵转置的六种方式&#xff0c;本文介绍其中的一种方式 如果矩阵为N*N的方阵。该方式让每个线程处理一个矩阵元素&#xff0c;总共需要N*N个线程。首先&#xff0c;声明两个常量并配置blocks&#xff0c;threads&#xff1a; const in…

Visual Studio Code 配置java开发环境

最近在学习算法&#xff0c;有时需要在自己的机器上调试一下代码。有些算法题目的题解是用java编的&#xff0c;因为这类代码只是单个的java文件&#xff0c;所以不想动用MyEclipse那样的重型工具。正好机器上有一个轻量级的VS Code&#xff0c;我就试着在上面搭了一个java开发…

nyoj97兄弟郊游问题

时间限制&#xff1a;3000 ms | 内存限制&#xff1a;65535 KB难度&#xff1a;2描述兄弟俩骑车郊游&#xff0c;弟弟先出发&#xff0c;每分钟X米&#xff0c;M分钟后&#xff0c;哥哥带一条狗出发。以每分钟Y米的速度去追弟弟&#xff0c;而狗则以每分钟Z米的速度向弟弟跑去…

isPrime 判断素数的函数

c语言中int isPrime(int n)是什么意思 isPrime 是自定义的一个函数&#xff0c;传入一个整数n&#xff0c;判断是否为素数。若是返回1&#xff0c;否则返回0。 #include "stdio.h"int isprime(int a) //判断素数的函数{int j;for(j2;j<a;j)if(a%j0) //如果有因数…

isPrime 判断素数的函数

c语言中int isPrime(int n)是什么意思 isPrime 是自定义的一个函数&#xff0c;传入一个整数n&#xff0c;判断是否为素数。若是返回1&#xff0c;否则返回0。 #include "stdio.h" int isprime(int a) //判断素数的函数 {int j;for(j2;j<a;j)if(a%j0) //如果有因…

输入四个整数,找出其中的最大值,用函数的嵌套调用来处理

输入四个整数&#xff0c;找出其中的最大值&#xff0c;用函数的嵌套调用来处理 #include<stdio.h> int main() {int max4(int a,int b,int c,int d);int a,b,c,d,max;scanf("%d%d%d%d",&a,&b,&c,&d);maxmax4(a,b,c,d);printf("max%d\n&q…

Fibonacci Again!

Fibonacci Again! 时间限制: 1 Sec 内存限制: 128 MB题目描述 求第n个斐波那契数是否是一个素数,n为整数f[n]f[n-1]f[n-2] (2<n<30)f[1]3,f[2]7输入 输入整数m,0<m<30,输入-1表示结束输入输出 如果f[m]是素数 则输出Yes,否则输出No,每行输出占一行。样例输入 23-1…

XYNU OJ 1073: 习题5-3-2 求最大公约数

题目描述 输入两个正整数&#xff0c;求其最大公约数。输入 测试数据有多组&#xff0c;每组输入两个正整数&#xff0c;两个正整数之间以空格分隔。输出 对于每组输入,输出其最大公约数。 每组对应一个输出&#xff0c;单独占一行。 样例输入 14 4921 66样例输出 73#include&l…