确定 TextView 是否需要滚动
Determine if a TextView requires scrolling
在 CursorAdapter
的 bindView()
中,我将数据绑定到以下布局:
一个TextView
和两个Button
:"UP"和"DOWN".
TextView
在 XML 中定义如下:
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="25dp"
android:paddingRight="25dp"
android:paddingTop="25dp"
android:scrollbars="vertical"
android:textAlignment="textStart"
android:textColor="#5c6284"
app:autoSizeMaxTextSize="40sp"
app:autoSizeMinTextSize="20sp"
app:autoSizeTextType="uniform" />
垂直滚动行为应用于 TextView
,它由“UP 和 "DOWN" Button
控制。
我想确定 TextView
是否需要滚动(足够长以至于不适合其提供的绘图区域)以便我可以 enable/disable "UP" 和 "DOWN" 相应的按钮。
我目前正在阅读 BaseMovementMethod
的 scrollDown
函数,考虑将其测量逻辑应用到我的适配器中,尽管我觉得它应该更简单。也许是我不知道的内置行为。
除了我建议的方法外,还有更好的方法吗?
您可以使用 Static Layout class。如果您使用 TextView 的参数设置它,您将能够计算呈现文本的高度。
Layout.Alignment alignment = Layout.Alignment.ALIGN_NORMAL;
float spacingMultiplier = 1;
float spacingAddition = 0;
boolean includePadding = false;
StaticLayout myStaticLayout = new StaticLayout(text, myTextView.getPaint(), myTextView.getWidth(), alignment, spacingMultiplier, spacingAddition, includePadding);
float height = myStaticLayout.getHeight();
然后您可以比较文本的高度和 TextView 的高度,并确定它是否需要滚动。
如果 myTextView.getPaint()
方法不起作用,您也可以尝试使用最小文本大小手动创建 Paint 对象。
我会做的是将 textview 放在滚动视图中,如下所示:
<ScrollView
android:id="@+id/scroller"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="test texts here"/>
</ScrollView>
在您的 activity 中,执行这些行:
boolean needScrolling = false;
if(scroller.getHeight() < tv_content.getHeight()) needScrolling = true;
计算mTextView
无数据和有数据的身高然后比较
mTextView.post(new Runnable() {
@Override
public void run() {
int lineHeight=mTextView.getCompoundPaddingBottom()+ mTextView.getCompoundPaddingTop()+mTextView.getLineHeight();
int height=mTextView.getHeight()-(mTextView.getCompoundPaddingTop()+mTextView.getLineHeight());
if (height>lineHeight){
}
}
});
在 CursorAdapter
的 bindView()
中,我将数据绑定到以下布局:
一个TextView
和两个Button
:"UP"和"DOWN".
TextView
在 XML 中定义如下:
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="25dp"
android:paddingRight="25dp"
android:paddingTop="25dp"
android:scrollbars="vertical"
android:textAlignment="textStart"
android:textColor="#5c6284"
app:autoSizeMaxTextSize="40sp"
app:autoSizeMinTextSize="20sp"
app:autoSizeTextType="uniform" />
垂直滚动行为应用于 TextView
,它由“UP 和 "DOWN" Button
控制。
我想确定 TextView
是否需要滚动(足够长以至于不适合其提供的绘图区域)以便我可以 enable/disable "UP" 和 "DOWN" 相应的按钮。
我目前正在阅读 BaseMovementMethod
的 scrollDown
函数,考虑将其测量逻辑应用到我的适配器中,尽管我觉得它应该更简单。也许是我不知道的内置行为。
除了我建议的方法外,还有更好的方法吗?
您可以使用 Static Layout class。如果您使用 TextView 的参数设置它,您将能够计算呈现文本的高度。
Layout.Alignment alignment = Layout.Alignment.ALIGN_NORMAL;
float spacingMultiplier = 1;
float spacingAddition = 0;
boolean includePadding = false;
StaticLayout myStaticLayout = new StaticLayout(text, myTextView.getPaint(), myTextView.getWidth(), alignment, spacingMultiplier, spacingAddition, includePadding);
float height = myStaticLayout.getHeight();
然后您可以比较文本的高度和 TextView 的高度,并确定它是否需要滚动。
如果 myTextView.getPaint()
方法不起作用,您也可以尝试使用最小文本大小手动创建 Paint 对象。
我会做的是将 textview 放在滚动视图中,如下所示:
<ScrollView
android:id="@+id/scroller"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="test texts here"/>
</ScrollView>
在您的 activity 中,执行这些行:
boolean needScrolling = false;
if(scroller.getHeight() < tv_content.getHeight()) needScrolling = true;
计算mTextView
无数据和有数据的身高然后比较
mTextView.post(new Runnable() {
@Override
public void run() {
int lineHeight=mTextView.getCompoundPaddingBottom()+ mTextView.getCompoundPaddingTop()+mTextView.getLineHeight();
int height=mTextView.getHeight()-(mTextView.getCompoundPaddingTop()+mTextView.getLineHeight());
if (height>lineHeight){
}
}
});