自定义视图不超出屏幕范围
Custom view not drawing beyond bounds of screen
我有一个嵌套在 ScrollView 中的自定义视图。这个想法是自定义视图可以比屏幕的高度长,所以当你滑动 ScrollView 时你可以看到它的所有内容。
为了做到这一点,我调整了自定义视图 canvas 的剪辑,如下所示:
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.clipRect(mCanvasArea, Region.Op.REPLACE);
}
其中 mCanvasArea 是一个预生成的 RectF,代表 canvas 可以绘制的整个区域。我记录了它的值 @ 10308。
然而,当应用程序运行时,自定义视图不可滚动,它就像可见内容代表 canvas 中的所有内容一样,但我可以从屏幕底部向上看更多内容.
这是我的 XML 视图声明:
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/activity_toolbar"
android:fillViewport="true">
<com.myapp.CustomView
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</ScrollView>
(我必须添加 fillViewport 才能首先显示内容)
为了让视图滚动,还有什么需要做的吗?
您需要指定自定义视图的高度,而不是 canvas。传递给 onDraw 的 canvas 反映了视图的宽度和高度。
将视图设置为 wrap_content 并不意味着只要您在其边界外绘制它就会变大。它只会 "wrap" 子视图,而不是 canvas。
以编程方式设置视图的高度:
getLayoutParams().height = 500;
invalidate();
我不确定你到底要做什么,所以我不能更具体地说明你应该在哪里设置高度,但我建议不要在 onDraw 中更改视图的尺寸,因为当你使它无效会导致另一次平局,你需要一些时髦的逻辑来处理这个递归。
相反,您可以在构造视图时确定所需的高度,然后使用类似以下内容覆盖 onMeasure:
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, calculatedHeight);
}
这会强制您的自定义视图进入计算的高度。
我有一个嵌套在 ScrollView 中的自定义视图。这个想法是自定义视图可以比屏幕的高度长,所以当你滑动 ScrollView 时你可以看到它的所有内容。
为了做到这一点,我调整了自定义视图 canvas 的剪辑,如下所示:
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.clipRect(mCanvasArea, Region.Op.REPLACE);
}
其中 mCanvasArea 是一个预生成的 RectF,代表 canvas 可以绘制的整个区域。我记录了它的值 @ 10308。
然而,当应用程序运行时,自定义视图不可滚动,它就像可见内容代表 canvas 中的所有内容一样,但我可以从屏幕底部向上看更多内容.
这是我的 XML 视图声明:
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/activity_toolbar"
android:fillViewport="true">
<com.myapp.CustomView
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</ScrollView>
(我必须添加 fillViewport 才能首先显示内容)
为了让视图滚动,还有什么需要做的吗?
您需要指定自定义视图的高度,而不是 canvas。传递给 onDraw 的 canvas 反映了视图的宽度和高度。
将视图设置为 wrap_content 并不意味着只要您在其边界外绘制它就会变大。它只会 "wrap" 子视图,而不是 canvas。
以编程方式设置视图的高度:
getLayoutParams().height = 500;
invalidate();
我不确定你到底要做什么,所以我不能更具体地说明你应该在哪里设置高度,但我建议不要在 onDraw 中更改视图的尺寸,因为当你使它无效会导致另一次平局,你需要一些时髦的逻辑来处理这个递归。
相反,您可以在构造视图时确定所需的高度,然后使用类似以下内容覆盖 onMeasure:
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, calculatedHeight);
}
这会强制您的自定义视图进入计算的高度。