【问题标题】:Android xml design slowing down my applicationAndroid xml 设计减慢了我的应用程序
【发布时间】:2021-04-20 20:47:27
【问题描述】:

我的应用中有一个布局设计。

它在模拟器上运行流畅,但是当我在真实设备上打开应用并滚动它时,它滚动粗糙,我的意思是不流畅,太慢了。

(我使用了 android:largeHeap="true" 否则它不能在我的设备上运行,而只能在模拟器上运行。)

你能帮我让它顺利移动吗?

Picture of xml design

<?xml version="1.0" encoding="utf-8"?>
<ScrollView android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">


    <GridLayout
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".FirstFragment"
    android:columnOrderPreserved="false"
    android:alignmentMode="alignMargins"
    android:rowCount="6"
    android:columnCount="2">

        <androidx.cardview.widget.CardView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:layout_rowWeight="1"
            app:cardElevation="6dp"
            app:cardCornerRadius="12dp"
            android:layout_margin="12dp"
            >

            <LinearLayout

                android:id="@+id/animal_layout"
                android:orientation="vertical"
                android:gravity="center"
                android:padding="16dp"
                android:layout_width="match_parent"
                android:layout_height="match_parent">
                <ImageView
                    android:src="@drawable/elephant"
                    android:layout_width="80dp"
                    android:layout_height="80dp"/>
                <TextView
                    android:layout_marginTop="12dp"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Animals"
                    android:textSize="18sp"
                    android:textColor="#6f6f6f"/>

            </LinearLayout>

        </androidx.cardview.widget.CardView>

    <androidx.cardview.widget.CardView
        android:layout_width="130dp"
        android:layout_height="wrap_content"
        android:layout_columnWeight="1"
        android:layout_rowWeight="1"
        app:cardElevation="6dp"
        app:cardCornerRadius="12dp"
        android:layout_margin="12dp"
        >
        
        <LinearLayout

            android:id="@+id/art_layout"
            android:orientation="vertical"
            android:gravity="center"
            android:padding="16dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
                 <ImageView
                     android:src="@drawable/art"
                     android:layout_width="80dp"
                     android:layout_height="80dp"/>
                 <TextView
                     android:layout_marginTop="12dp"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:text="Art"
                     android:textSize="18sp"
                     android:textColor="#6f6f6f"/>

        </LinearLayout>


    </androidx.cardview.widget.CardView>

    <androidx.cardview.widget.CardView
        android:layout_width="130dp"
        android:layout_height="wrap_content"
        android:layout_columnWeight="1"
        android:layout_rowWeight="1"
        app:cardElevation="6dp"
        app:cardCornerRadius="12dp"
        android:layout_margin="12dp"
        >

        <LinearLayout

            android:id="@+id/biography_layout"
            android:orientation="vertical"
            android:gravity="center"
            android:padding="16dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <ImageView
                android:src="@drawable/biography"
                android:layout_width="80dp"
                android:layout_height="80dp"/>
            <TextView
                android:layout_marginTop="12dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Biography"
                android:textSize="18sp"
                android:textColor="#6f6f6f"/>

        </LinearLayout>


    </androidx.cardview.widget.CardView>

    <androidx.cardview.widget.CardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_columnWeight="1"
        android:layout_rowWeight="1"
        app:cardElevation="6dp"
        app:cardCornerRadius="12dp"
        android:layout_margin="12dp"
        >

        <LinearLayout

            android:id="@+id/countries_layout"
            android:orientation="vertical"
            android:gravity="center"
            android:padding="16dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <ImageView
                android:src="@drawable/countries"
                android:layout_width="80dp"
                android:layout_height="80dp"/>
            <TextView
                android:layout_marginTop="12dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Countries"
                android:textSize="18sp"
                android:textColor="#6f6f6f"/>

        </LinearLayout>


    </androidx.cardview.widget.CardView>

    <androidx.cardview.widget.CardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_columnWeight="1"
        android:layout_rowWeight="1"
        app:cardElevation="6dp"
        app:cardCornerRadius="12dp"
        android:layout_margin="12dp"
        >

        <LinearLayout

            android:id="@+id/culture_layout"
            android:orientation="vertical"
            android:gravity="center"
            android:padding="16dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <ImageView
                android:src="@drawable/culture"
                android:layout_width="80dp"
                android:layout_height="80dp"/>
            <TextView
                android:layout_marginTop="12dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Culture"
                android:textSize="18sp"
                android:textColor="#6f6f6f"/>

        </LinearLayout>


    </androidx.cardview.widget.CardView>


    <androidx.cardview.widget.CardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_columnWeight="1"
        android:layout_rowWeight="1"
        app:cardElevation="6dp"
        app:cardCornerRadius="12dp"
        android:layout_margin="12dp"
        >

        <LinearLayout

            android:id="@+id/environment_layout"
            android:orientation="vertical"
            android:gravity="center"
            android:padding="16dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <ImageView
                android:src="@drawable/environment"
                android:layout_width="80dp"
                android:layout_height="80dp"/>
            <TextView
                android:layout_marginTop="12dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Environment"
                android:textSize="18sp"
                android:textColor="#6f6f6f"/>

        </LinearLayout>


    </androidx.cardview.widget.CardView>
    <androidx.cardview.widget.CardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_columnWeight="1"
        android:layout_rowWeight="1"
        app:cardElevation="6dp"
        app:cardCornerRadius="12dp"
        android:layout_margin="12dp"
        >

        <LinearLayout

            android:id="@+id/health_layout"
            android:orientation="vertical"
            android:gravity="center"
            android:padding="16dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <ImageView
                android:src="@drawable/health"
                android:layout_width="80dp"
                android:layout_height="80dp"/>
            <TextView
                android:layout_marginTop="12dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Health"
                android:textSize="18sp"
                android:textColor="#6f6f6f"/>

        </LinearLayout>


    </androidx.cardview.widget.CardView>
    <androidx.cardview.widget.CardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_columnWeight="1"
        android:layout_rowWeight="1"
        app:cardElevation="6dp"
        app:cardCornerRadius="12dp"
        android:layout_margin="12dp"
        >

        <LinearLayout

            android:id="@+id/holidays_layout"
            android:orientation="vertical"
            android:gravity="center"
            android:padding="16dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <ImageView
                android:src="@drawable/holidays"
                android:layout_width="80dp"
                android:layout_height="80dp"/>
            <TextView
                android:layout_marginTop="12dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Holidays"
                android:textSize="18sp"
                android:textColor="#6f6f6f"/>

        </LinearLayout>


    </androidx.cardview.widget.CardView>

    <androidx.cardview.widget.CardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_columnWeight="1"
        android:layout_rowWeight="1"
        app:cardElevation="6dp"
        app:cardCornerRadius="12dp"
        android:layout_margin="12dp"
        >

        <LinearLayout

            android:id="@+id/literature_layout"
            android:orientation="vertical"
            android:gravity="center"
            android:padding="16dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <ImageView
                android:src="@drawable/literature"
                android:layout_width="80dp"
                android:layout_height="80dp"/>
            <TextView
                android:layout_marginTop="12dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Literature"
                android:textSize="18sp"
                android:textColor="#6f6f6f"/>

        </LinearLayout>


    </androidx.cardview.widget.CardView>
    <androidx.cardview.widget.CardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_columnWeight="1"
        android:layout_rowWeight="1"
        app:cardElevation="6dp"
        app:cardCornerRadius="12dp"
        android:layout_margin="12dp"
        >

        <LinearLayout

            android:id="@+id/politics_layout"
            android:orientation="vertical"
            android:gravity="center"
            android:padding="16dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <ImageView
                android:src="@drawable/politics"
                android:layout_width="80dp"
                android:layout_height="80dp"/>
            <TextView
                android:layout_marginTop="12dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Politics"
                android:textSize="18sp"
                android:textColor="#6f6f6f"/>

        </LinearLayout>


    </androidx.cardview.widget.CardView>

    <androidx.cardview.widget.CardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_columnWeight="1"
        android:layout_rowWeight="1"
        app:cardElevation="6dp"
        app:cardCornerRadius="12dp"
        android:layout_margin="12dp"
        >

        <LinearLayout

            android:id="@+id/science_layout"
            android:orientation="vertical"
            android:gravity="center"
            android:padding="16dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <ImageView
                android:src="@drawable/science"
                android:layout_width="80dp"
                android:layout_height="80dp"/>
            <TextView
                android:layout_marginTop="12dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Science"
                android:textSize="18sp"
                android:textColor="#6f6f6f"/>

        </LinearLayout>


    </androidx.cardview.widget.CardView>
    <androidx.cardview.widget.CardView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_columnWeight="1"
        android:layout_rowWeight="1"
        app:cardElevation="6dp"
        app:cardCornerRadius="12dp"
        android:layout_margin="12dp"
        >

        <LinearLayout

            android:id="@+id/sports_layout"
            android:orientation="vertical"
            android:gravity="center"
            android:padding="16dp"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <ImageView
                android:src="@drawable/sport"
                android:layout_width="80dp"
                android:layout_height="80dp"/>
            <TextView
                android:layout_marginTop="12dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Sports"
                android:textSize="18sp"
                android:textColor="#6f6f6f"/>

        </LinearLayout>


    </androidx.cardview.widget.CardView>


</GridLayout>
</ScrollView>

【问题讨论】:

    标签: android xml android-studio layout


    【解决方案1】:

    我通过减小 imageView 中图片的大小解决了这个问题。

    【讨论】:

      【解决方案2】:

      您添加到应用程序的每个小部件和布局都需要初始化、布局和绘图。例如,使用 LinearLayout 的嵌套实例会导致视图层次结构过深。此外,嵌套多个使用 layout_weight 参数的 LinearLayout 实例可能会特别昂贵,因为每个孩子都需要测量两次。这在布局反复膨胀时尤其重要,例如在 ListView 或 GridView 中使用时。

      阅读此处以优化布局 - https://developer.android.com/training/improving-layouts/optimizing-layout

      解决方案 -

      ConstraintLayout 是实现相同扁平 xml 结构的新方法。它肯定会缩短您的响应时间

      您可以阅读更多关于约束布局如何提高性能的信息

      https://android-developers.googleblog.com/2017/08/understanding-performance-benefits-of.html

      【讨论】:

      • 感谢您的回答。我在之前的项目中使用了带指南的约束布局,我可以说使用约束布局非常简单且对内存友好。在这种情况下,减小图片大小是可行的,但您的意见是正确的。
      • 谢谢,希望对您有所帮助 + 尽可能使用 svg 而不是 png,如果您觉得有帮助,您是否介意将此答案标记为正确或 +1
      • 它说“感谢您的反馈!声望低于 15 人的投票会被记录下来,但不要更改公开显示的帖子得分。”当我的帐户激活时,我会给你一分。又是 Ty。
      猜你喜欢
      • 1970-01-01
      • 2012-03-17
      • 2010-12-22
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      相关资源
      最近更新 更多