Размещение изображения в качестве дочернего элемента в ListView приводит к сбою программного обеспечения

Я разрабатываю программное обеспечение для манги, используя .net maui, моя основная платформа — Android. Вот мой код.

            <ListView
                x:Name = "listView"
                HasUnevenRows = "True"
                IsPullToRefreshEnabled = "False"
                ItemsSource = "{Binding ImageUrls}"
                SelectionMode = "None"
                SeparatorVisibility = "None">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <Grid>
                                <Image x:Name = "img" Source = "{Binding}" />
                                <Label
                                    FontFamily = ""
                                    HeightRequest = "600"
                                    HorizontalOptions = "Center"
                                    HorizontalTextAlignment = "Center"
                                    IsVisible = "{Binding IsLoading, Source = {x:Reference img}}"
                                    Text = "loding..."
                                    TextColor = "Black"
                                    VerticalTextAlignment = "Center" />
                            </Grid>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

Вот проблема при загрузке изображений. Когда загруженные изображения слишком велики, они выдают исключение Java.Lang.RuntimeException: «Холст: попытка нарисовать слишком большое (109224768 байт) растровое изображение». и развалится. Это было исправлено путем отключения или отключения аппаратного ускорения приложения для адаптации к различной плотности экрана, но это снизило плавность пролистывания, что, похоже, требует определенных затрат, и мне интересно, есть ли лучший способ.

<application android:hardwareAccelerated = "false" android:largeHeap = "true" ... />

<supports-screens android:anyDensity = "false" />

(Только сейчас я обнаружил, что проблема не имеет ничего общего с элементом управления изображением. Скорее, она генерируется под двойным влиянием конкретного изображения и прокручиваемого представления (например, ScrollView, ListView, CollectionView). Например, это изображение https://s1.baozicdn.com/scomic/woduzishengji-duburedicestudio/0/1-7ymq/24.jpg имеет проблема И другие картинки, такие как https://s1.baozicdn.com/scomic/woduzishengji-duburedicestudio/0/1-7ymq/25.jpg, не проблема,Если вы добавите Margin="0,0,0,200" к изображению или если изображение будет помещено не в ListView, а в StackLayout, исключение не появится)

Буду признателен, если кто-нибудь захочет помочь

Я просмотрел много информации, но не нашел хорошего решения

Пожалуйста, прочитайте Как задать вопрос перед публикацией. Вы получите лучшие ответы, если отредактируете свой вопрос, сосредоточив внимание на одной конкретной проблеме, а не на нескольких. И было бы полезно точно знать, насколько велики эти изображения.

Jason 08.04.2024 04:19

Как предложил Джейсон, пожалуйста, помогите уточнить, насколько велики изображения. Также, пожалуйста, помогите создать Минимальный воспроизводимый пример и добавьте его в свой пост.

Alexandar May - MSFT 15.04.2024 08:29

Эти картинки взяты из Интернета, они разного размера, я не знаю их конкретного размера, возможно, это видно по выброшенному исключению (109224768 байт) растрового изображения. Я всего лишь новичок, не знаю, это возможно

chene 15.04.2024 08:36

@chene Пожалуйста, попробуйте добавить свойство android:anyDensity в манифест, реферальную ссылку

Alexandar May - MSFT 18.04.2024 09:44

К счастью, это устраняет сбой, но также вызывает некоторые другие проблемы, например, с отключением аппаратного ускорения, я посмотрю, есть ли лучший способ сделать это. Большое спасибо.

chene 19.04.2024 03:55

@chene Не беспокойтесь, я опубликую это как ответ, так как это поможет другим, столкнувшимся с той же проблемой!

Alexandar May - MSFT 19.04.2024 09:08

Хорошо, спасибо за вашу идею по этому вопросу

chene 20.04.2024 17:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
154
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете попробовать добавить свойство android:anyDensity в файл AndroidManifest.xml, как показано ниже:

<manifest ... >
    <supports-screens 
        android:anyDensity = "false" 
        android:xlargeScreens = "true" 
        android:largeScreens = "true" 
        android:normalScreens = "true" 
        android:smallScreens = "true" />
</manifest>

Ссылка на ссылку

Ответ принят как подходящий

В настоящее время я использую FFImageLoading.MAUI для решения этой проблемы. Мне не нужно отключать аппаратное ускорение или отключать плотность изображения, благодаря чему картинка прокручивается без эффекта зависания.

Он также предоставляет заполнители для загрузки и заполнители для ошибок, что, кстати, решает для меня еще одну проблему: использование метки и атрибута isloading изображения в качестве заполнителя при загрузке, и метка иногда исчезает, когда изображение не отображается.

Я думаю, что в наши дни его очень полезно использовать, и я надеюсь, что это поможет людям, столкнувшимся с той же проблемой.

Другие вопросы по теме