自定义视图不超出屏幕范围

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);
}

这会强制您的自定义视图进入计算的高度。