天道酬勤,学无止境

How do I prevent Android device Display size scaling in my app?

I'm developing an app with React Native for both iOS and Android, and I am trying to prevent device-specific scaling of the display in the app.

For text/font size scaling, putting the following code in the root-level App.js file solves the issue for both iOS and Android:

if (Text.defaultProps == null) {
    Text.defaultProps = {};
}
Text.defaultProps.allowFontScaling = false;

However, Android devices have the following Display size setting that is still being applied:

I've tried (unsuccessfully) to piece together a variety of "solutions" to this issue that I've found in answers to the following questions:

Change the system display size programatically Android N

Disabling an app or activity zoom if Setting -> Display -> Display size changed to Large or small

how to prevent system font-size changing effects to android application?

I've often found references to a BaseActivity class that extends the Activity class. My understanding is that it is inside of that class where I would be writing a method (let's call it adjustDisplayScale) to make changes to the Configuration of the Context that I get from Resources, and that then I would be calling adjustDisplayScale within the onCreate() method after super.onCreate() in the MainApplication.java file.

As of now, in this directory I just have two files - MainApplication.java and MainActivity.java.

I've attempted creating a new Module and associated Package file to implement adjustDisplayScale following these instructions and it did not work: https://facebook.github.io/react-native/docs/text.html

I've attempted placing implementing the functionality of adjustDisplayScale within the onCreate() like this and it did not work:

@Override
public void onCreate() {
    super.onCreate();

    Context context = getApplicationContext();
    Resources res = context.getResources();
    Configuration configuration = res.getConfiguration();

    configuration.fontScale = 1f;
    DisplayMetrics metrics = res.getDisplayMetrics();

    WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    wm.getDefaultDisplay().getMetrics(metrics);
    metrics.scaledDensity = 1f;
    configuration.densityDpi = (int) res.getDisplayMetrics().xdpi;
    context = context.createConfigurationContext(configuration);

    SoLoader.init(this, /* native exopackage */ false);
}

A potentially promising answer included the following:

protected override void AttachBaseContext(Context @base) {
    var configuration = new Configuration(@base.Resources.Configuration);
    configuration.FontScale = 1f;
    var config =  Application.Context.CreateConfigurationContext(configuration);
    base.AttachBaseContext(config);
}

But when I tried to utilize this, I got errors about not recognizing the symbol @base.

Some background... I've done 99% of my work on this project in JavaScript / React Native and I have almost no understanding about things like Resources, Context, Configuration, and DisplayMetrics associated with Android development AND the last time I wrote code in Java was 10 years ago. I've spent a number of agonizing hours trying to figure this out and any help would be greatly appreciated.

ps. I am well-aware that accessibility settings exist for a good reason so please spare me the diatribe I've seen in so many "answers" on why I need to fix my UI to work with accessibility settings rather than disable them.

评论

UPDATE

My first answer does not work if you change the screen resolution. On Samsung Devices, you can change the screen zoom but you can also change the screen resolution on some models (Settings->Display->Screen Resolution-> HD, FHD, WQHD etc).

So, I came up with a different code which seems to work with that feature as well. Just, please, note I can't fully test this code since I don't have too many devices to test. On those devices I tested, it seems to work.

One additional note. Ideally, you don't need to use such kind of code to circumvent the screen zoom. In a certain way, the screen zoom is just "simulating" bigger or smaller screens. So, if your app properly supports different screen sizes, you don't need to completely "disable" the screen zoom.

public class BaseActivity extends AppCompatActivity {

    @TargetApi(Build.VERSION_CODES.N)
    private static final int[] ORDERED_DENSITY_DP_N = {
            DisplayMetrics.DENSITY_LOW,
            DisplayMetrics.DENSITY_MEDIUM,
            DisplayMetrics.DENSITY_TV,
            DisplayMetrics.DENSITY_HIGH,
            DisplayMetrics.DENSITY_280,
            DisplayMetrics.DENSITY_XHIGH,
            DisplayMetrics.DENSITY_360,
            DisplayMetrics.DENSITY_400,
            DisplayMetrics.DENSITY_420,
            DisplayMetrics.DENSITY_XXHIGH,
            DisplayMetrics.DENSITY_560,
            DisplayMetrics.DENSITY_XXXHIGH
    };

    @TargetApi(Build.VERSION_CODES.N_MR1)
    private static final int[] ORDERED_DENSITY_DP_N_MR1 = {
            DisplayMetrics.DENSITY_LOW,
            DisplayMetrics.DENSITY_MEDIUM,
            DisplayMetrics.DENSITY_TV,
            DisplayMetrics.DENSITY_HIGH,
            DisplayMetrics.DENSITY_260,
            DisplayMetrics.DENSITY_280,
            DisplayMetrics.DENSITY_XHIGH,
            DisplayMetrics.DENSITY_340,
            DisplayMetrics.DENSITY_360,
            DisplayMetrics.DENSITY_400,
            DisplayMetrics.DENSITY_420,
            DisplayMetrics.DENSITY_XXHIGH,
            DisplayMetrics.DENSITY_560,
            DisplayMetrics.DENSITY_XXXHIGH
    };

    @TargetApi(Build.VERSION_CODES.P)
    private static final int[] ORDERED_DENSITY_DP_P = {
            DisplayMetrics.DENSITY_LOW,
            DisplayMetrics.DENSITY_MEDIUM,
            DisplayMetrics.DENSITY_TV,
            DisplayMetrics.DENSITY_HIGH,
            DisplayMetrics.DENSITY_260,
            DisplayMetrics.DENSITY_280,
            DisplayMetrics.DENSITY_XHIGH,
            DisplayMetrics.DENSITY_340,
            DisplayMetrics.DENSITY_360,
            DisplayMetrics.DENSITY_400,
            DisplayMetrics.DENSITY_420,
            DisplayMetrics.DENSITY_440,
            DisplayMetrics.DENSITY_XXHIGH,
            DisplayMetrics.DENSITY_560,
            DisplayMetrics.DENSITY_XXXHIGH
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.v("TESTS", "Dimension: " + getResources().getDimension(R.dimen.test_dimension));
    }

    @Override
    protected void attachBaseContext(final Context baseContext) {

        Context newContext = baseContext;

        // Screen zoom is supported from API 24+
        if(Build.VERSION.SDK_INT >= VERSION_CODES.N) {

            Resources resources = baseContext.getResources();
            DisplayMetrics displayMetrics = resources.getDisplayMetrics();
            Configuration configuration = resources.getConfiguration();

            Log.v("TESTS", "attachBaseContext: currentDensityDp: " + configuration.densityDpi
                    + " widthPixels: " + displayMetrics.widthPixels + " deviceDefault: " + DisplayMetrics.DENSITY_DEVICE_STABLE);

            if (displayMetrics.densityDpi != DisplayMetrics.DENSITY_DEVICE_STABLE) {
                // display_size_forced exists for Samsung Devices that allow user to change screen resolution
                // (screen resolution != screen zoom.. HD, FHD, WQDH etc)
                // This check can be omitted.. It seems this code works even if the device supports screen zoom only
                if(Settings.Global.getString(baseContext.getContentResolver(), "display_size_forced") != null) {
                    Log.v("TESTS", "attachBaseContext: This device supports screen resolution changes");

                    // density is densityDp / 160
                    float defaultDensity = (DisplayMetrics.DENSITY_DEVICE_STABLE / (float) DisplayMetrics.DENSITY_DEFAULT);
                    float defaultScreenWidthDp = displayMetrics.widthPixels / defaultDensity;
                    Log.v("TESTS", "attachBaseContext: defaultDensity: " + defaultDensity + " defaultScreenWidthDp: " + defaultScreenWidthDp);
                    configuration.densityDpi = findDensityDpCanFitScreen((int) defaultScreenWidthDp);
                } else {
                    // If the device does not allow the user to change the screen resolution, we can
                    // just set the default density
                    configuration.densityDpi = DisplayMetrics.DENSITY_DEVICE_STABLE;
                }
                Log.v("TESTS", "attachBaseContext: result: " + configuration.densityDpi);
                newContext = baseContext.createConfigurationContext(configuration);
            }
        }
        super.attachBaseContext(newContext);
    }

    @TargetApi(Build.VERSION_CODES.N)
    private static int findDensityDpCanFitScreen(final int densityDp) {
        int[] orderedDensityDp;

        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            orderedDensityDp = ORDERED_DENSITY_DP_P;
        } else if(Build.VERSION.SDK_INT >= VERSION_CODES.N_MR1) {
            orderedDensityDp = ORDERED_DENSITY_DP_N_MR1;
        } else {
            orderedDensityDp = ORDERED_DENSITY_DP_N;
        }

        int index = 0;
        while (densityDp >= orderedDensityDp[index]) {
            index++;
        }
        return orderedDensityDp[index];
    }
}

ORIGINAL ANSWER

You can try following code (overriding attachBaseContext). This will "disable" the screen zoom in your app. This is the way to re-scale whole screen at once.

@Override
protected void attachBaseContext(final Context baseContext) {

    Context newContext;

    if(Build.VERSION.SDK_INT >= VERSION_CODES.N) {

        DisplayMetrics displayMetrics = baseContext.getResources().getDisplayMetrics();
        Configuration configuration = baseContext.getResources().getConfiguration();

        if (displayMetrics.densityDpi != DisplayMetrics.DENSITY_DEVICE_STABLE) {
            // Current density is different from Default Density. Override it
            configuration.densityDpi = DisplayMetrics.DENSITY_DEVICE_STABLE;
            newContext = baseContext.createConfigurationContext(configuration);
        } else {
            // Same density. Just use same context
            newContext = baseContext;
        }
    } else {
        // Old API. Screen zoom not supported
        newContext = baseContext;
    }
    super.attachBaseContext(newContext);
}

On that code, I check if the current density is different from Device's default density. If they are different, I create a new context using default density (and not the current one). Then, I attach this modified context.

You must do that on every Activity. So, you can create a BaseActivity and add that code there. Then, you just need to update your activities in order to extend BaseActivity

public class BaseActivity extends AppCompatActivity {
    @Override
    protected void attachBaseContext(final Context baseContext) {
        ....
    }
}

Then, in your activities:

public class MainActivity extends BaseActivity {
    // Since I'm extending BaseActivity, I don't need to add the code
    // on attachBaseContext again
    // If you don't want to create a base activity, you must copy/paste that
    // attachBaseContext code into all activities
}

I tested this code with:

Log.v("Test", "Dimension: " + getResources().getDimension(R.dimen.test_dimension));

Different Screen Zoom (using that code):

2019-06-26 16:38:17.193 16312-16312/com.test.testapplication V/Test: Dimension: 105.0
2019-06-26 16:38:35.545 16312-16312/com.test.testapplication V/Test: Dimension: 105.0
2019-06-26 16:38:43.021 16579-16579/com.test.testapplication V/Test: Dimension: 105.0

Different Screen Zoom (without that code):

2019-06-26 16:42:53.807 17090-17090/com.test.testapplication V/Test: Dimension: 135.0
2019-06-26 16:43:19.381 17090-17090/com.test.testapplication V/Test: Dimension: 120.0
2019-06-26 16:44:00.125 17090-17090/com.test.testapplication V/Test: Dimension: 105.0

So, using that code, I can get the same dimension in pixels regardless the zoom level.

Edit

we can use code of section

Configuration configuration = getResources().getConfiguration();
configuration.fontScale = (float) 1; //0.85 small size, 1 normal size, 1,15 big etc
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
metrics.scaledDensity = configuration.fontScale * metrics.density;
configuration.densityDpi = (int) getResources().getDisplayMetrics().xdpi;
getBaseContext().getResources().updateConfiguration(configuration, metrics);

if you found this helpful you can upvote THIS_ANSWER.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何防止系统字体大小更改对Android应用程序的影响?(how to prevent system font-size changing effects to android application?)
    问题 我最近完成了我的android应用程序的开发。 我对所有textSize使用sp(缩放像素)。 问题是当我调整系统字体大小时,我的应用程序的字体大小正在更改。 我可以使用dp(与设备无关的像素),但是维护我的应用程序将花费太长时间。 我从中引用了文本大小。 有没有一种方法可以防止系统字体大小更改对我的应用程序的影响? 回答1 如果您要求文本保持相同大小,则必须使用dp 。 引用文档: sp是相同的基本单位,但会根据用户的首选文本大小进行缩放(这是与缩放无关的像素),因此在定义文本大小时(而不是布局大小)应使用此度量单位。 强调我的。 因此,您将看到使用sp作为文本大小单位的预期行为。 我不明白您使用dp花费太长时间来维护您的应用程序的意思-据我所知,这是完全相同的工作量吗? (也许更少,尽管它可能会使视力较差的用户无法使用它) 回答2 我最近也遇到了这个问题。 我们的UI在屏幕尺寸有限的手机上无法很好地缩放,并且在用户将其“辅助功能选项”设置为“巨大”的情况下,突然更改整个UI似乎很愚蠢。 我发现StackOverflow上的这个问题最有帮助。 我所做的就是将下面的代码放在BaseActivity(我所有活动都从其扩展的Activity类)中 public void adjustFontScale(Configuration configuration) { if
  • 尽管使用了减少的样本量,但BitmapFactory.decodeStream内存不足(BitmapFactory.decodeStream out of memory despite using reduced sample size)
    问题 我已经阅读了许多有关解码位图的内存分配问题的相关文章,但是即使使用了官方网站上提供的代码后,仍然无法找到以下问题的解决方案。 这是我的代码: public static Bitmap decodeSampledBitmapFromResource(InputStream inputStream, int reqWidth, int reqHeight) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len; try { while ((len = inputStream.read(buffer)) > -1) { baos.write(buffer, 0, len); } baos.flush(); InputStream is1 = new ByteArrayInputStream(baos.toByteArray()); InputStream is2 = new ByteArrayInputStream(baos.toByteArray()); final BitmapFactory.Options options = new BitmapFactory.Options(); options
  • 如何使Flutter应用根据不同的屏幕尺寸做出响应?(How to make flutter app responsive according to different screen size?)
    问题 我面临着使其难以根据各种屏幕尺寸做出响应的困难。 如何使其反应灵敏? @override Widget build(BuildContext context) { return new Container( decoration: new BoxDecoration(color: Colors.white), child: new Stack( children: [ new Padding( padding: const EdgeInsets.only(bottom: 350.0), child: new GradientAppBar(" "), ), new Positioned( bottom: 150.0, height: 260.0, left: 10.0, right: 10.0, child: new Padding( padding: new EdgeInsets.all(10.0), child: new Card( child: new Column( mainAxisSize: MainAxisSize.min, children: <Widget>[ const ListTile( title: const Text( 'LOGIN', textAlign: TextAlign.center, style: const TextStyle(
  • 支持多种屏幕尺寸-Android(Supporting multiple screen size - Android)
    问题 我将在Android中开发新的应用程序。 此应用程序应仅以纵向运行(即使对于平板电脑也是如此)。 UI和布局设计在手机和平​​板电脑上也应相似。 我们无法更改平板电脑的布局设计,因为它有很大的使用空间。 我们必须拉伸所有图像以匹配手机。 我们可以使用九个补丁。 但是我对于在多个可绘制对象中使用图像有些困惑。 根据我的分析(可能是错误的..:)),屏幕分为密度和尺寸。 我们可以使用3:4:6:8的缩放比例。 但是这个比率是基于密度的。 但就我而言,我必须拉伸整个UI来填充Tablet屏幕。 那么可用于此类可支持多种设备的应用程序的可绘制对象是什么? 以及我们必须设计的屏幕尺寸是多少。 而且此应用程序需要近100种布局。 因此,我计划维护单一布局,并使用每个布局的权重而不是尺寸来设计布局。 另外,如果我使用多个APK来支持不同的屏幕尺寸,则支持1.小和普通2.大3. Xlarge的可绘制对象是什么? 回答1 我只是做了一些非常相似的事情。 为了拉伸应用程序而不创建新的布局,我使用了XML中设置的尺寸 res/values/dimensions.xml res/values-sw600dp/dimensions.xml -> 7+ inches res/values-sw720dp/dimensions.xml -> 10+ inches 尺寸是资源文件: <dimen name=
  • 如何调整AVD模拟器的大小(在Eclipse中)?(How to resize the AVD emulator (in Eclipse)?)
    问题 我正在为拥有一些Droid手机的小型企业编写我的第一个Android应用程序。 我为手机设置了正确的分辨率AVD:854像素高。 我正在使用最大屏幕分辨率为900像素的MacBook Pro,所以当模拟器启动时,底部被切断了。 有没有一种方法可以将模拟器的显示比例缩小到75%左右,或者适合我的屏幕显示? 还有其他解决方案(除了在手机上运行所有功能之外)? 回答1 在Eclipse : 转到Window > Android SDK and AVD Manager > Virtual Devices 选择要启动的AVD,然后单击“ Start 选中“按Scale display to real size按钮输入您希望它以英寸显示的大小,然后按Launch 。 为此,您还必须输入Mac屏幕分辨率的合理近似值。 我的13英寸Macbook Pro使用的是7英寸和113 dpi,但您也许可以脱离8或9英寸。 回答2 实际上,这也可以从您的项目中实现,而无需通过AVD管理器启动仿真器: 转到Run > Run Configurations ...>(在左侧选择您的应用程序)>(单击右侧的"Target"选项卡)。 在底部的底部,您将看到Emulator launch parameters 。 在additional emulator command line options ,添加'
  • 将屏幕密度放入正确的存储桶中(Putting screen densities into the correct bucket)
    问题 一组六个广义密度: ldpi (low) ~120dpi mdpi (medium) ~160dpi hdpi (high) ~240dpi xhdpi (extra-high) ~320dpi xxhdpi (extra-extra-high) ~480dpi xxxhdpi (extra-extra-extra-high) ~640dpi 从每个电话显示的Wiki页面 按比例缩小到存储桶中,即如果ppi为300,则将其放入hdpi存储桶,因为它小于320? Galaxy S3 306ppi -> bucket hdpi Nexus 4 318ppi -> bucket hdpi Nexus 5 445ppi -> bucket xhdpi Nexus 5X 432ppi -> bucket xhdpi Nexus 6 493ppi -> bucket xxhdpi Nexus 6P 518ppi -> bucket xxhdpi 这是计算屏幕尺寸存储桶的正确方法吗? 我问的原因是因为我创建了以下值目录资源: values-hdpi/dimens values-xhdpi/dimens values-xxhdpi/dimens values-xxxhdpi/dimens 在dimens.xml我有不同的边距,并根据存储dimens.xml的大小设置dp,即 <dimen
  • Android SP与DP文字-什么会调整“比例”以及支持的哲学是什么(Android sp vs dp texts - what would adjust the 'scale' and what is the philosophy of support)
    问题 因此,从许多其他文章中我们知道,对于Android中的文本,我们应该使用sp而不是dp,并且我们知道这样做的原因是要尊重“用户的偏好”。 但是究竟这些喜好是什么? 用户如何更改此设置? 我无法通过手机上的设置找到任何参考(我希望在“辅助功能”或“显示”中有某些提示)。 那么什么是用户设置? 是否仅通过诸如“大字体”之类的应用来完成? 假设它是(由大字体设置)-我玩过Google文档和其他一些Google应用,字体设置为130%。 虽然大多数布局都保持良好,但有些布局会被截断并且无法读取(并且在大屏幕的SGS2上)。 那么,使用“ sp”开发具有文本大小的应用程序的方法是什么? 我们是否确保它可以100%缩放,然后忽略其他设置-称其为用户可以担心的特殊情况,还是我们竭尽所能以确保事情扩展或可滚动,以防文本溢出? 一种说法是,我们应该使用“ dp”来确保用户有机会看到文本(即使他们必须使用放大镜) 有想法/意见吗? 回答1 它在某些Android设备(取决于制造商)的设置菜单中显示。 某些可访问性选项(取决于设备)也可能会更改它。 通常,应该始终使用与比例无关的像素,尤其是对于较大的文本。 但是,如果文本必须适合已知大小的边框,则应使用与密度无关的像素,以确保文本始终正确适合并且无论用户如何设置,所有字符都是可见的。 简而言之
  • 为什么矢量可绘制比例未达到预期的缩放比例?(Why isn't my vector drawable scaling as expected?)
    问题 我正在尝试在我的Android应用程序中使用矢量可绘制对象。 从http://developer.android.com/training/material/drawables.html(重点是我): 在Android 5.0(API级别21)及更高版本中,您可以定义矢量可绘制对象,这些对象可缩放而不会丢失定义。 使用此可绘制对象: <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"> <path android:fillColor="@color/colorPrimary" android:pathData="M14,20A2,2 0 0,1 12,22A2,2 0 0,1 10,20H14M12,2A1,1 0 0,1 13,3V4.08C15.84,4.56 18,7.03 18,10V16L21,19H3L6,16V10C6,7.03 8.16,4.56 11,4.08V3A1,1 0 0,1 12,2Z" /> 和这个ImageView: <ImageView android:layout
  • How do I get the WVGA Android browser to stop scaling my images?
    I'm designing an HTML page for display in Android browsers. Consider this simple example page: <html> <head><title>Simple!</title> </head> <body> <p><img src="http://sstatic.net/so/img/logo.png"></p> </body> </html> It looks just fine on the standard HVGA phones (320x480), but on HDPI WVGA sizes (480x800 or 480x854) the built-in browser automatically scales the image up; it looks ugly. I've read that I should be able to use this tag to force the browser to stop scaling my page: <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; minimum-scale=1.0; user
  • 如何在Android Studio中调整AVD模拟器窗口的大小?(How to resize the AVD emulator window in Android Studio?)
    问题 我看过许多帖子,询问如何调整AVD仿真器窗口的大小,但是我没有找到任何可行的方法。 我的模拟器不在计算机屏幕的顶部,并且无法调整其大小。 如何在Android Studio中调整AVD模拟器窗口的大小? 回答1 现在,借助Android Studio 2,您只需拖动一个角即可调整窗口大小。 回答2 在Android Studio 2.2更新之后,“ Edit Configurations窗口中没有“ Emulator选项卡。 如果要扩展模拟器,则只需使用以下键盘组合: 放大: Ctrl + ▲ 缩小比例: Ctrl + ▼ 如果您想要按比例缩放或获得1:1的显示,则也许您应该尝试修改这两个文件:(我不知道该文件是否可以工作,因为我没有机会尝试。) C:\ Users \您的用户名.android \ avd \ Nexus_ XX _API_ XX .avd \ hardware-qemu.ini C:\ Users \您的用户名.android \ avd \ Nexus_ XX _API_ XX .avd \ hardware-qemu.ini 回答3 您可以调整模拟器屏幕的大小 通过转到(在Android Studio的顶部菜单中) Run > Edit Configurations 在刚打开的对话框的左侧面板中,选择您的应用程序。 在右侧面板中
  • Android N Display Size设置为大于Small时,“画布:尝试绘制太大的位图”(“Canvas: trying to draw too large bitmap” when Android N Display Size set larger than Small)
    问题 我有一个发布的应用程序,当新引入的Display size OS设置设置为一个太大的值时,在Android N上启动时崩溃。 当我查看logcat时,会看到以下消息: java.lang.RuntimeException: Canvas: trying to draw too large(106,975,232 bytes) bitmap. 我已经在我的第一个Activity中将问题追溯到ImageView,该View显示了一个不错的大背景图像。 有问题的图像是2048x1066,位于我的通用drawables目录中,因此无论密度如何,都将使用此图像。 当“ Display size设置为“ Small时,一切正常。 但是当我使用Default ,它将停止工作。 如果随后将图像换成较小的图像,则该图像将在Default ,但是如果升至Large ,它将再次停止工作。 我的猜测是,调整Display size会导致您的设备像具有较高像素密度的物理上较小的设备那样工作。 但是我不明白我应该在这里做什么。 如果我以逐渐减小的分辨率输入逐渐减小的图像,则在大尺寸显示器上看起来效果不佳。 还是我不了解某事? 任何指针将不胜感激。 回答1 就我而言,将(高分辨率)启动位图从drawable移至drawable-xxhdpi是解决方案。 我有同样的问题。 我不怀疑我的启动屏幕是问题所在
  • 更改显示器的DPI缩放大小会使Qt应用程序的字体大小变大(Changing DPI scaling size of display make Qt application's font size get rendered bigger)
    问题 我已经使用Qt创建了一些GUI应用程序。 我的GUI应用程序包含按钮和单选按钮之类的控件。 当我运行该应用程序时,按钮和按钮内的字体看起来很正常。 当我将显示的DPI缩放比例从100%更改为150%或200%时,无论分辨率如何,控件的字体大小都会变大,但控件的大小(按钮,单选按钮)却不会变大。 因此,控件内的文本被截断了。 请参阅所附图片。 当DPI缩放比例设置为100%时,Qt应用程序外观 当DPI缩放大小设置为200%时,Qt应用程序外观 我也在某些平板电脑上运行我的应用程序。 在平板电脑中,DPI比例值应大于150%,否则所有内容都将显示为很小。 我在网上搜索了如何在Qt中创建UI应用程序,而不管分辨率和DPI比例值如何,但是没有运气。 所以我在这里发布我的要求。 请让我知道是否有某种方法可以摆脱这种情况。 回答1 从Qt 5.6起启用了高DPI支持。 在应用程序源代码中设置QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling)可以自动进行高DPI缩放。 注意:要使用属性方法,必须在创建QApplication对象之前设置属性: #include <QApplication> int main(int argc, char *argv[]) { QApplication::setAttribute(Qt
  • 适用于所有移动浏览器的完整网页和禁用的缩放视口元标记(Full webpage and disabled zoom viewport meta tag for all mobile browsers)
    问题 我希望我的网页显示为全屏,并禁止在所有移动设备上缩放。 使用meta标签: <meta name="viewport" content="width=1165, user-scalable=no"> 我可以在iPhone / iPad上执行此操作,但是在Android设备上,该网站放大了约125%。 如果我使用标签 <meta name="viewport" content="width=max-device-width, user-scalable=no"> 我得到相反的结果。 因此,它可以在Android上运行,但不能在iPad / iPhone上运行。 回答1 不幸的是,每个浏览器都有自己的视口元标记实现。 不同的组合将在不同的浏览器上工作。 Android 2.2 :似乎根本不支持视口元标记。 Android 2.3.x / 3.x :通过设置user-scalable = no,您也可以自行禁用视口meta标签的缩放。 这可能就是为什么您的width选项不起作用的原因。 要允许浏览器缩放内容,需要设置user-scalable = yes ,然后要禁用缩放,可以将最小和最大缩放设置为相同的值,以使其不会缩小或增长。 以最初的比例开始玩具,直到您的站点贴合为止。 <meta name="viewport" content="initial-scale=1.0
  • Unity PlayerSetting Android打包设置介绍
    Resolution And Presentation Start in fullscreen mode 以全屏模式启动 在启用的情况下,在第一次启动时隐藏导航栏(拦窗),如果未设置,则在第一次启动时或者加载第一个场景时出现导航栏(拦窗)。 Render Outside Safe Area 安全区域外渲染 如果启用将利用所有可用的屏幕空间,将渲染布局扩展到显示切口区域。 Preserve framebuffer alpha 保留帧缓冲区 如果想让Unity在原生Android UI上渲染,可以启用这个选项,相机必须将清除标志设置为Alpha小于1的纯色才能生效(仅限OpenGL ES )。 Resolution Scaling Resolution Scaling Mode 分辨率缩放模式 FixedDPI 固定DPI 允许您将设备的屏幕分辨率缩放到其原始分辨率以下,并显示Target DPI属性。使用此功能可优化性能和电池寿命,或目标特定的DPI设置。 Target DPI(当“ 分辨率缩放模式”设置为“ 固定DPI ”时,此选项才会出现) 目标DPI,设置游戏的分辨率,如果设备的本机屏幕DPI高于此值,则Unity则会自动将游戏屏幕DPI缩小以匹配此设置。 比例计算为公式为:min(Target DPI * Factor / Screen DPI, 1)。该因子由“ 质量
  • 卸载我的应用之前如何显示活动(Android)[重复](How to show an Activity BEFORE my app is uninstalled (Android) [duplicate])
    问题 这个问题已经在这里有了答案: 是否可以检测到Android应用程序卸载? (7个答案) 在android中执行卸载任务[重复] (4个答案) 5年前关闭。 我虽然不可能,但是我注意到NQ Mobile Security在单击“卸载”之后并且在调用PackageUninstaller之前能够显示一条消息。 我想在我的应用程序中复制此行为。 我尝试使用一个活动监听“ android.intent.action.DELETE”意图,如下所示:如何知道我的应用已从设备上卸载...? 但是,当我要卸载我的应用程序时,弹出选择器,要求选择我的应用程序或程序包卸载程序。 如何避免这种情况? 有没有其他方法可以拦截您的应用程序UNINSTALL事件? (在回答不可能的问题之前,请尝试卸载NQ Mobile Security并查看会发生什么。在我的Android 2.3.4上,它显示了一个漂亮的屏幕,说没有安全应用程序是不安全的)。 回答1 我注意到,在单击“卸载”之后并且在调用PackageUninstaller之前,NQ Mobile Security能够显示一条消息。 他们必须利用Android中的一些安全漏洞。 我将对其进行研究,看看是否可以修复它。 应用程序不应在卸载时获得控制权。 感谢您指出了这一点! 有没有其他方法可以拦截您的应用程序UNINSTALL事件? 我当然希望不会。
  • Why isn't my vector drawable scaling as expected?
    I am attempting to use vector drawables in my Android app. From http://developer.android.com/training/material/drawables.html (emphasis mine): In Android 5.0 (API Level 21) and above, you can define vector drawables, which scale without losing definition. Using this drawable: <vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:width="24dp" android:viewportWidth="24" android:viewportHeight="24"> <path android:fillColor="@color/colorPrimary" android:pathData="M14,20A2,2 0 0,1 12,22A2,2 0 0,1 10,20H14M12,2A1,1 0 0,1 13,3V4.08C15.84,4.56 18,7.03 18
  • 在触摸设备上的浏览器中禁用双击“缩放”选项(Disable double-tap “zoom” option in browser on touch devices)
    问题 我想禁用浏览器(在触摸设备上)中指定元素上的双击缩放功能,而不禁用所有缩放功能。 例如:一个元素可以被多次点击以使某些事情发生。 在桌面浏览器上(按预期方式),此方法工作正常,但在触摸设备浏览器上,它将放大。 回答1 注意(自2020年8月4日起):此解决方案似乎无法在iOS Safari v12 +中运行。 一旦找到涵盖iOS Safari的明确解决方案,我将更新此答案并删除此注释。 纯CSS解决方案 对要禁用双击缩放的任何元素添加“ touch-action: manipulation ,例如以下disable-dbl-tap-zoom类: .disable-dbl-tap-zoom { touch-action: manipulation; } 从触摸操作文档(重点是我的): 操纵启用平移和收缩缩放手势,但禁用其他非标准手势,例如双击以缩放。 此值适用于Android和iOS。 回答2 <head> <title>Site</title> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"> etc... </head> 我最近使用过它,并且在iPad上可以正常使用。 尚未在Android或其他设备上进行测试
  • 永久隐藏Android状态栏(Permanently hide Android Status Bar)
    问题 我正在尝试在Android 4.4设备上隐藏系统状态栏。 这是针对信息亭模式的,其中我的应用程序将是设备上有史以来唯一运行的应用程序。 目前的目标设备是2013 Nexus 7。 该设备已植根,并且我已经能够完全移除底部的导航栏以及本文中的一些信息。 对于顶部的状态栏,我尝试过的所有操作只会暂时隐藏该栏。 如果我的用户在屏幕顶部向下移动,状态栏将重新出现。 我不想让他们看到时间,进入设置甚至看到通知。 我找到并尝试过的帖子: 在平板电脑中隐藏系统栏永久隐藏活动上的导航栏在Android上隐藏状态栏在Android中禁用/隐藏状态栏 有什么建议? 理想情况下,我希望能够编辑build.prop来执行此操作,因为我已经在导航栏中进行了此操作,并且可以同时执行。 我试图不必建立自己的android图像。 更新: 经过更多工作后,这似乎在某种程度上取决于android的确切版本或运行其的设备。 某些设备(例如我一直在使用的Nexus系列设备)允许用户滑动以重新显示横条。 但是,我最近在Verizon Eclipse上尝试了此操作,并且该栏没有重新出现,这正是我想要的。 我仍在寻找针对所有设备的更好的解决方案,但这可能归结于创建自己的android版本。 回答1 我们无法阻止状态在kitkat设备中以全屏模式显示,因此提出了一种仍然符合要求的技巧,即阻止状态栏扩展。 为此
  • 之间的差异和在Android上(difference between <supports-screens> and <compatible-screens> on Android)
    问题 我现在对这两个清单元素之间的区别感到正式困惑,并且 我认为仅使用Google Play会过滤掉不属于受支持屏幕列表的设备。 该应用程序不会在这些设备上的搜索结果中显示。 我以为使用就足够了,但似乎不起作用! 我还需要包括吗? 有人可以向我解释自然语言的区别。 不幸的是,我没有找到Google的说明文件: 干杯 回答1 支持屏幕但是,如果在调整大小以适合不同屏幕尺寸时您的应用程序不能很好地运行,则可以使用元素的属性来控制是将应用程序分发到较小的屏幕还是将其UI放大(“缩放”)以适合较大的屏幕屏幕使用系统的屏幕兼容模式。 兼容屏幕未在此元素中声明的任何屏幕配置都是与应用程序不兼容的屏幕。 因此,外部服务(例如Google Play)不应将应用程序提供给具有此类屏幕的设备。 资源 因此,似乎支持屏幕意味着您的应用布局适用于特定屏幕,并将在其他屏幕上缩放 兼容屏幕意味着您的应用仅与特定屏幕和设备兼容。 屏幕配置未列出的设备不会在Play商店中显示。 回答2 描述 1.支持屏幕 它使您可以指定应用程序支持的屏幕尺寸,并为大于应用程序支持的屏幕启用屏幕兼容模式。 如果应用程序正确调整大小以填满整个屏幕,则它“支持”给定的屏幕大小。 系统应用的常规大小调整对大多数应用程序都适用,并且您无需做任何额外的工作即可使您的应用程序在比手持设备更大的屏幕上运行。 但是,通常重要的是,通过提供替代资源
  • mdpi,hdpi,xhdpi文件夹如何工作?(How mdpi, hdpi, xhdpi folder works?)
    问题 从上面的Android开发者指南链接中摘录: 320dp:典型的电话屏幕(240x320 ldpi,320x480 mdpi,480x800 hdpi等)。 480dp:诸如Streak(480x800 mdpi)之类的Tweener平板电脑。 600dp:7英寸平板电脑(600x1024 mdpi)。 720dp:10英寸平板电脑(720x1280 mdpi,800x1280 mdpi等) 因此,我仅在这些尺寸下获得了设计者每英寸320像素分辨率的图形(图像) 480x800 dpi 720x1280 mdpi 800x1280兆像素 我很困惑应该在mdpi文件夹,hdpi文件夹和xhdpi文件夹中放置哪种尺寸的图像。 我想制作一个可以在大多数android手机和平板电脑上使用的应用程序吗? 回答1 您可以创建不同的图形对象,以用于不同的像素密度。 Android将mdpi(160像素/英寸)作为基本密度。 因此,对于mdpi设备,1 dp = 1像素。 在更高的密度下,每英寸有更多的像素(hdpi为240,xhdpi为320)。 Android尝试使图形图像在屏幕上占据相同的物理尺寸,而与设备像素密度无关。 因此,如果找到的只是一个mdpi资源,而该设备是hdpi,它将按240/160 = 150%缩放图形,并且它将xhdpi的图形大小加倍。 如果您不希望这种自动缩放