TextView 滚动不顺畅

Posted

技术标签:

【中文标题】TextView 滚动不顺畅【英文标题】:TextView not scrolling Smoothly 【发布时间】:2012-04-08 00:36:18 【问题描述】:

我正在尝试使用以下代码滚动我的文本视图:

TextView text = (TextView) findViewById(R.id.textView12);
        text.setMovementMethod(ScrollingMovementMethod.getInstance());
        int height = getResources().getDrawable(R.drawable.pic_ground_pranic).getIntrinsicHeight();
        text.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, height));
        text.setText("As part of an android App I am building a button set.For performance reasons and to keep the code simpler, the Android system uses pixels as the standard unit for expressing dimension or coordinate values. That means that the dimensions of a view are always expressed in the code using pixels, but always based on the current screen density. For instance, if myView.getWidth() returns 10, the view is 10 pixels wide on the current screen, but on a device with a higher density screen, the value returned might be 15. If you use pixel values in your application code to work with bitmaps that are not pre-scaled for the current screen density, you might need to scale the pixel values that you use in your code If you need to control exactly how your application will look on various screen configurations, adjust your layouts and bitmap drawables in configuration-specific resource directories. For example, consider an icon that you want to display on medium and high density screens. Simply create your icon at two different sizes (for instance 100x100 for medium density and 150x150 for high density) and put the two variations in the appropriate directories, using the proper qualifiers: For instance, suppose a device has a WVGA high-density screen, which is 480x800 and about the same size as a traditional HVGA screen, but it's running an application that has disabled pre-scaling. In this case, the system will lie to the application when it queries for screen dimensions, and report 320x533 (the approximate mdpi translation for the screen density). Then, when the application does drawing operations, such as invalidating the rectangle from (10,10) to (100, 100), the system transforms the coordinates by scaling them the appropriate amount, and actually invalidate the region (15,15) to (150, 150). This discrepancy may cause unexpected behavior if your application directly manipulates the scaled bitmap, but this is considered a reasonable trade-off to keep the performance of applications as good as possible. If you encounter this situation, read Based on the density of the current screen, the system uses any size- or density-specific resources from your application and displays them without scaling. If resources are not available in the correct density, the system loads the default resources and scales them up or down as needed to match the current screen's density. The system assumes that default resources (those from a directory without configuration qualifiers) are designed for the baseline screen density (mdpi), unless they are loaded from a density-specific resource directory. Pre-scaling is, thus, what the system does when resizing a bitmap to the appropriate size for the current screen density. to match the un-scaled bitmap source. The buttons are part of a nested set of LinearLayouts.The question then is: How to resize the layout.I have tried several suggested techniques, and none come close to working. Here is a subset of the XML that builds the button set:");

一切正常,但我的文本视图滚动不顺畅。我以为我必须将我的 Textview 放在 Scrollview 中,但这也不起作用。

这是因为我正在调整文本视图的大小吗?

请为此问题提供任何解决方案。我已经花了很多时间在这上面。

我的xml布局文件是:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/relativeLayout1"
    android:layout_
    android:layout_ >

    <ScrollView
        android:id="@+id/scrollView1"
        android:layout_
        android:layout_
        android:layout_below="@+id/include1"
        android:layout_centerHorizontal="true"
        android:background="@android:color/white"
        android:scrollbarStyle="insideInset" >

        <TableLayout
            android:id="@+id/tableLayout1"
            android:layout_
            android:layout_
            android:orientation="vertical"
            android:padding="5dp" >

            <TableRow
                android:id="@+id/tableRow1"
                android:layout_
                android:layout_ >

                <RelativeLayout
                    android:id="@+id/relativeLayout2"
                    android:layout_
                    android:layout_
                    android:layout_weight="1.0" >

                    <TextView
                        android:id="@+id/textView2"
                        android:layout_
                        android:layout_
                        android:layout_alignParentLeft="true"
                        android:layout_marginLeft="5dp"
                        android:layout_marginTop="14dp"
                        android:text="Text 1"
                        android:textColor="@android:color/black" />

                    <TextView
                        android:id="@+id/textView3"
                        android:layout_
                        android:layout_
                        android:layout_alignBottom="@+id/textView2"
                        android:layout_marginLeft="25dp"
                        android:layout_toRightOf="@+id/textView2"
                        android:text="Text 2"
                        android:textColor="@android:color/black" />

                    <TextView
                        android:id="@+id/textView4"
                        android:layout_
                        android:layout_
                        android:layout_alignBottom="@+id/textView3"
                        android:layout_marginLeft="25dp"
                        android:layout_toRightOf="@+id/textView3"
                        android:text="Text 3"
                        android:textColor="@android:color/black" />

                    <TextView
                        android:id="@+id/textView5"
                        android:layout_
                        android:layout_
                        android:layout_alignTop="@+id/textView4"
                        android:layout_marginLeft="25dp"
                        android:layout_toRightOf="@+id/textView4"
                        android:text="Text 4"
                        android:textColor="@android:color/black" />

                    <TextView
                        android:id="@+id/textView6"
                        android:layout_
                        android:layout_
                        android:layout_alignParentLeft="true"
                        android:layout_below="@+id/textView2"
                        android:layout_marginLeft="5dp"
                        android:layout_marginTop="3dp"
                        android:textColor="@android:color/black" />

                    <TextView
                        android:id="@+id/textView7"
                        android:layout_
                        android:layout_
                        android:layout_alignLeft="@+id/textView3"
                        android:layout_below="@+id/textView3"
                        android:layout_marginTop="3dp"
                        android:textColor="@android:color/black" />

                    <TextView
                        android:id="@+id/textView8"
                        android:layout_
                        android:layout_
                        android:layout_alignLeft="@+id/textView4"
                        android:layout_below="@+id/textView4"
                        android:layout_marginTop="3dp"
                        android:textColor="@android:color/black" />

                    <TextView
                        android:id="@+id/textView9"
                        android:layout_
                        android:layout_
                        android:layout_alignLeft="@+id/textView5"
                        android:layout_below="@+id/textView5"
                        android:layout_marginTop="3dp"
                        android:textColor="@android:color/black" />
                </RelativeLayout>
            </TableRow>

            <TableRow
                android:id="@+id/tableRow2"
                android:layout_
                android:layout_ >

                <RelativeLayout
                    android:id="@+id/relativeLayout3"
                    android:layout_
                    android:layout_
                    android:layout_weight="1.0" >

                    <SeekBar
                        android:id="@+id/seekBar1"
                        android:layout_
                        android:layout_
                        android:layout_alignParentRight="true"
                        android:soundEffectsEnabled="true" />

                    <TextView
                        android:id="@+id/textView10"
                        android:layout_
                        android:layout_
                        android:layout_alignParentLeft="true"
                        android:layout_centerVertical="true"
                        android:text="Volume 1"
                        android:textColor="@android:color/black" />
                </RelativeLayout>
            </TableRow>

            <TableRow
                android:id="@+id/tableRow3"
                android:layout_
                android:layout_ >

                <RelativeLayout
                    android:id="@+id/relativeLayout4"
                    android:layout_
                    android:layout_
                    android:layout_weight="1.0" >

                    <SeekBar
                        android:id="@+id/seekBar2"
                        android:layout_
                        android:layout_
                        android:layout_alignParentRight="true"
                        android:soundEffectsEnabled="true" />

                    <TextView
                        android:id="@+id/textView11"
                        android:layout_
                        android:layout_
                        android:layout_alignParentLeft="true"
                        android:layout_centerVertical="true"
                        android:text="Volume 2"
                        android:textColor="@android:color/black" />
                </RelativeLayout>
            </TableRow>

            <TableRow
                android:id="@+id/tableRow4"
                android:layout_
                android:layout_
                android:baselineAligned="false" >

                <LinearLayout
                    android:id="@+id/linearLayout1"
                    android:layout_
                    android:layout_
                    android:layout_weight="1.0"
                    android:orientation="vertical" >

                    <Button
                        android:id="@+id/button1"
                        android:layout_
                        android:layout_
                        android:layout_gravity="right"
                        android:text="Save Volumes" />
                </LinearLayout>
            </TableRow>

            <TableRow
                android:id="@+id/tableRow5"
                android:layout_
                android:layout_
                android:orientation="vertical" >

                <FrameLayout
                    android:id="@+id/frameLayout3"
                    android:layout_
                    android:layout_
                    android:layout_weight="1.0"
                    android:orientation="vertical" >

                    <TextView
                        android:id="@+id/textView12"
                        android:layout_
                        android:layout_
                        android:layout_gravity="center_vertical|center_horizontal"
                        android:gravity="top|left"
                        android:scrollbars="vertical"
                        android:visibility="visible" />
                </FrameLayout>
            </TableRow>

            <TableRow
                android:id="@+id/tableRow8"
                android:layout_
                android:layout_ >

                <FrameLayout
                    android:id="@+id/frameLayout2"
                    android:layout_
                    android:layout_
                    android:layout_weight="1.0" >

                    <ImageView
                        android:id="@+id/imageView1"
                        android:layout_
                        android:layout_
                        android:layout_gravity="right|center" />

                    <TextView
                        android:id="@+id/textView13"
                        android:layout_
                        android:layout_
                        android:layout_gravity="right|center"
                        android:layout_marginRight="30dp"
                        android:clickable="true"
                        android:text="Detailed Instruction" />
                </FrameLayout>
            </TableRow>
        </TableLayout>
    </ScrollView>

</RelativeLayout>

提前致谢!

【问题讨论】:

您的问题解决了吗?请查看我的答案,因为它可以根据您的要求工作。如果可行,请接受它。 【参考方案1】:

就我而言,我只需要将 TextView 放在 ScrollView 中。滚动变得非常流畅,用户从此过上了幸福的生活!

<ScrollView
    android:layout_
    android:layout_
    android:fillViewport="true"
    >
    <TextView
        android:id="@+id/textview_about"
        android:layout_
        android:layout_
        android:textIsSelectable="true"
        android:textSize="20dp" />
</ScrollView>

【讨论】:

【参考方案2】:

仅当您限制其高度时,TextView 才会滚动。简单的规则是当文本大于可用空间时,textview 开始滚动。 一种方法是通过分配从某个图像尺寸获得的固定高度来遵循。另一种方法是设置最大行数。

TextView text = (TextView) findViewById(R.id.textView12);
text.setMaxLines(5);
text.setMovementMethod(ScrollingMovementMethod.getInstance());

您甚至可以使其更具动态性。只需计算行数。

行数=(图像高度,以像素为单位)/(文本字体大小,以像素为单位)

【讨论】:

平滑了我的文本视图。谢谢。【参考方案3】:

问题是ScrollView inside ScrollView

当您将 ScrollView 放入 ScrollView 时,android 只会混淆哪个滚动视图被触摸。所以有时它会无法传递触摸事件。

搜索了一段时间,找到了一个链接或者博客,可以提取这个问题,也有解决方案。

看看this 博客。这正是您一直在寻找的,我相信它会解决您的问题。

现在是享受的时候了;)

【讨论】:

我试过了,现在我的问题解决了。感谢您提供这个有用的答案。【参考方案4】:

首先不需要设置 Layoutparams 因为你已经把它交给了 xml 布局。

如果你有这么长的字符串,那么不要直接把它放在java代码上。而不是将那个字符串放到资源目录中。

转到值,然后打开 strings.xml 文件并定义您的字符串。

见下文:

    <?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, Helper***Activity!</string>
    <string name="app_name">Helper***</string>
    <string name="String1">"PUT YOUR STRING HERE" </string>

</resources>

之后,您可以随时在 Java 代码中设置字符串。 比如:

 text = (TextView)findViewById(R.id.textView12);
    text.setText(getResources().getString(R.string.String1));

它像正常滚动一样滚动。

希望对你有帮助。

享受。 :)

【讨论】:

首先很抱歉让回复,我正在做你建议的所有这些,但这无济于事。 TextView 不滚动是我的例外。我正在这样做TextView textView = (TextView)findViewById(R.id.textView12); TextView text = (TextView) findViewById(R.id.textView12); text.setMovementMethod(ScrollingMovementMethod.getInstance()); textView.setText(getResources().getString(R.string.myString)); 我在这里工作为什么 TextView 不滚动? 删除所有行,只需添加此行并尝试。TextView text = (TextView) findViewById(R.id.textView12); text.setText(getResources().getString(R.string.myString)); 如果我按照您所说的那样执行此操作,TextView 高度会根据“包装内容”等文本自动增加,并且如果我将高度设置为“193px”,则它不会滚动。我认为不使用 ScrollView 文本视图不可滚动。 @Pari:好的,然后只需根据需要修复 TextView 的高度大小,然后将 LinearLayout 作为该 TextView 的父级,并将 ScrollView 作为该 LinearLayout 的父级。现在它可以正常工作了。 我尝试了所有方法,但都没有成功。我不明白为什么文本视图不滚动。我按照您的建议尝试了,但这也没有帮助。

以上是关于TextView 滚动不顺畅的主要内容,如果未能解决你的问题,请参考以下文章

android TextView实现滚动显示效果

带滚动栏TextView

如何在 iOS 中制作单行水平滚动 TextView

TextView系列:TextView设置滚动

没有部分绘制线条的 TextView

能做出这种效果吗?标题栏或Textview中内容超过屏幕,滚动...