You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何从anydpi限定符文件夹读取的图片在模拟器中显示模糊?

问题描述

我有两张内容完全相同、仅名称略有差异的图片,分别存放于不同文件夹中:
图片存放目录

同时我编写了一个简单的Activity,代码如下:

package com.test.composetraining

import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp

data class Message(val author: String, val body: String)

@Composable
fun MessageCard(msg: Message){
    Row(modifier = Modifier.padding(all = 8.dp)) {
        Image(
            painter = painterResource(R.drawable.profile_picture),
            contentDescription = "Contact profile picture",
            modifier = Modifier
                .size(200.dp)
//                .clip(CircleShape)
        )

        Spacer(modifier = Modifier.width(8.dp))

        Column {
            Text(text = msg.author)
            Spacer(modifier = Modifier.height(4.dp))
            Text(text = msg.body)
        }
    }
}

@Preview
@Composable
fun PreviewMessageCard(){
    MessageCard(Message("Android", "Jetpack Compose"))
}

class MainActivity:  ComponentActivity(){
    override fun onCreate(savedInstanceState: Bundle?){
        super.onCreate(savedInstanceState)
        setContent{
            MessageCard(Message("Android", "Jetpack Compose"))
        }
    }
}

运行应用后,得到如下结果:
使用profile_picture的运行结果

但将代码中的painter = painterResource(R.drawable.profile_picture)替换为painter = painterResource(R.drawable.profile_picture2)后,结果如下:
使用profile_picture2的运行结果

请问这是什么原因?


问题原因及解决办法

这是因为两张图片存放的文件夹对应Android不同的屏幕密度限定符,系统会根据当前设备的屏幕密度自动适配并缩放资源。

从目录图能看出,profile_picture大概率放在了适配高密度屏幕的文件夹(如drawable-xxhdpi),而profile_picture2放在了低密度屏幕的文件夹(如drawable-mdpi)。当调用painterResource加载图片时:

  • 低密度文件夹的图片在高密度设备上会被强制放大,导致像素拉伸、图片模糊
  • 高密度文件夹的图片在设备上会按比例适配,保持清晰显示

解决办法:

  1. 统一图片存放路径:将两张图片放到同一个密度限定符的文件夹下,比如统一使用drawable-xxhdpi
  2. 遵循Android资源规范:为不同密度文件夹提供对应分辨率的适配图(即使内容相同,分辨率也要匹配对应密度要求)
  3. 强制关闭缩放(按需使用):在Image组件中添加contentScale = ContentScale.None参数,阻止系统自动缩放,但可能导致图片显示不全,需结合布局调整

内容的提问来源于stack exchange,提问作者VanechikSpace

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:55:24