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

时间:2015-04-13 23:23:51

标签: android android-canvas android-scrollview

我有一个嵌套在ScrollView内的自定义视图。我们的想法是自定义视图可能比屏幕高度更长,因此当您在ScrollView中滑动时,您可以看到它的所有内容。

为了做到这一点,我调整了自定义视图画布的剪辑,如下所示:

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    canvas.clipRect(mCanvasArea, Region.Op.REPLACE);
}

其中mCanvasArea是预生成的RectF,表示画布可以绘制的整个区域。我记录它的值@ 10308。

然而,当应用程序运行时,自定义视图是不可滚动的,就像可见内容代表画布中的所有内容一样,但我可以看到更多从屏幕底部窥视。

以下是我对视图的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以便首先显示内容)

为了让视图滚动,还有什么需要做的吗?

1 个答案:

答案 0 :(得分:1)

您需要指定自定义视图的高度,而不是画布。传递给onDraw的画布反映了视图的宽度和高度。

将视图设置为wrap_content并不意味着每当您在其边界之外绘制时它都会增长。它只会“包装”子视图,而不是画布。

以编程方式设置视图的高度:

getLayoutParams().height = 500;
invalidate();

我不确定你的目的是什么,所以我不能更具体地说明你应该在哪里设置高度,但我建议你不要在onDraw中改变视图的尺寸,因为当你失效时它会导致另一次绘制,你需要一些时髦的逻辑来处理这种递归。

相反,您可以确定构建视图时所需的高度,然后使用以下内容覆盖onMeasure:

public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  super.onMeasure(widthMeasureSpec, calculatedHeight);
}

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