【问题标题】:Repeated background image is stretched重复的背景图像被拉伸
【发布时间】:2012-08-22 16:49:21
【问题描述】:

我很难使用带纹理的背景。我有一个 60 像素 x 60 像素的位图纹理,我想将其设置为重复平铺图案中布局的背景。这是位于 res/layout 中的布局 xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/dark_texture_background" >

    ...
</RelativeLayout

这里是位于 res/drawable 中的 dark_texture_background:

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/dark_background_texture"
    android:tileMode="repeat" />

dark_background_texture 是 60x60 像素的图像。

所以,问题在于纹理图像在被平铺的同时被放大。我在纹理图像的外部添加了一条红线,以查看纹理图像的确切位置,结果如下:

我还根据getResources().getDisplayMetrics()添加了屏幕高度、宽度和密度。

由于屏幕宽度为 480 像素,纹理图像应重复 8 次 (480 / 60 = 8)。相反,只有 5 ~1/4。图像现在约为 90 像素并平铺。什么鬼?

当我明确告诉它重复时,为什么我的纹理图像会被拉伸?

【问题讨论】:

    标签: android background repeat tile stretch


    【解决方案1】:

    这是 Android 框架中的一个错误,从 ICS 开始已修复。无论如何,这是前 ICS 版本的粗略解决方法:

    public static void fixBackgroundRepeat(View view) {
        Drawable bg = view.getBackground();
        if (bg != null) {
            if (bg instanceof BitmapDrawable) {
                BitmapDrawable bmp = (BitmapDrawable) bg;
                bmp.mutate(); // make sure that we aren't sharing state anymore
                bmp.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
            }
        }
    }
    

    将其应用于所有具有平铺背景集的视图(即 findViewById() 它们)。

    有时,在 AndroidManifest.xml 中设置 anyDensity=true 后,该错误开始起作用

    【讨论】:

    • 你确定这是一个错误吗?我认为这是因为它正在做密度缩放。 @Chewie 你能试着把你的图片放在drawable-nodpi 看看是否有效吗?
    • 我很确定。我记得在 android-developers Google 小组中读过一封来自 Romain 或 Dianne 的邮件。
    • @kcoppock 就是这样!显然,我错过了关于 /drawable 中的图像的全部内容,假设它们是 mdpi 大小,则它们将被预先缩放。如果你提交,我会按照你的方式折腾一个正确的答案。
    • 是的,这是错误!我使用了 nodpi 文件夹,但它没有解决缩放图像.. 这个函数“fixBackgroundRepeat”解决了这个问题,非常感谢 Raghav Sood
    【解决方案2】:

    我不确定 Raghav 究竟指的是什么错误,但如果他们在 ICS+ 中更改了某些内容,那么肯定有某些错误。也就是说,我相当肯定drawable 中的位图图像被假定为mdpi,并从那里缩放(也许他们改变了这种行为?),考虑到你的 60px 图像变成了 90px (60 * 1.5比例因子)。

    您可以完全避免缩放,请记住,物理尺寸会因不同的密度而异(尽管对于平铺背景可能并不重要),只需将您的位图放入 drawable-nodpi 文件夹即可。无论密度如何,Android 都会使用这些可绘制对象而不进行缩放。

    【讨论】:

      猜你喜欢
      • 2017-02-23
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      • 2017-06-19
      • 2011-11-12
      • 1970-01-01
      • 2017-01-18
      相关资源
      最近更新 更多