【问题标题】:Same translation Y on different Screen sizes不同屏幕尺寸上的相同翻译 Y
【发布时间】:2020-09-30 15:04:09
【问题描述】:

我在我的一个使用 FrameLayout 的屏幕上使用 ViewCompat.animate() 制作了一个动画,它在测试手机上看起来不错。 但当然,一旦在测试平板电脑(Nexus 7 2013)上运行,动画就不一样了。

所以我正在寻找一种方法来获得相同的显示翻译 Y,在不同的屏幕尺寸上不使用不同的尺寸资源文件。 当然有一种方法可以在运行时计算并自行排序。

我试过了:float px = -182 * (getResources().getDisplayMetrics().densityDpi / 160f); 但是两个屏幕上的视图经过的距离是不一样的。

看到这个帖子但没有提供解决方案:android animation in different screen sizes

有人有想法吗?

干杯

【问题讨论】:

  • 你能记录下“getResources().getDisplayMetrics().densityDpi”的值吗?并在两台设备上进行检查。在 Android Developer 网站上,它仍然说: densityDpi [屏幕密度表示为每英寸点数。可以是 DENSITY_LOW、DENSITY_MEDIUM 或 DENSITY_HIGH。]。我不确定它是否会重新运行 DENSITY_XHIGH、DENSITY_XXHIGH。
  • 它给出了它适合的类别的值,例如360或480

标签: android android-animation


【解决方案1】:

这就是我尝试的方法,获取设备的高度 dpi 并使用它将 dp 值 (182) 转换为像素。

DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getRealMetrics(displayMetrics);
float yDpi = displayMetrics.ydpi;
float px = 182 * (yDpi / 160);

虽然每个设备的 px 值结果不同,但翻译在不同屏幕上的移动距离仍然不一样

所以我这样做了:

DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

float translationY = displayMetrics.heightPixels * 0.40f;

获取屏幕高度并用于计算移动距离,等于设备屏幕高度的 40%。 所以现在,无论使用什么设备,动画都是相同的,并且移动的距离相同。 此外,使用的浮点值可以非常精确。我使用了0.40f,但你可以做类似0.398f的事情

【讨论】:

    【解决方案2】:

    为了避免任何额外的不必要的数学运算,从屏幕上已显示的视图中获取指标会更容易。唯一需要的是在onCreate 中有一个post,以防有活动。如果是片段,您可以直接在onViewCreated 中简单地处理事情,而无需任何post

    View settingsView = findViewById(R.id.settings_layout);
    View youtubeView = findViewById(R.id.youtubeLink);
    settingsView.post(new Runnable() {
        @Override
        public void run() {
            //metrics already calculated
            settingsView.animate().translationX(youtubeView.getWidth());
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-09
      • 2012-05-23
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      相关资源
      最近更新 更多