android - 自定义 View 不超出屏幕范围

标签 android android-canvas android-scrollview

我有一个嵌套在 ScrollView 中的自定义 View 。这个想法是自定义 View 可以比屏幕的高度长,所以当你滑动 ScrollView 时,你可以看到它的所有内容。

为了做到这一点,我像这样调整自定义 View Canvas 的剪辑:

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

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

其中 mCanvasArea 是一个预先生成的 RectF,代表 Canvas 可以绘制的整个区域。我记录了它的值 @ 10308。

但是当应用程序运行时,自定义 View 是不可滚动的,它就像可见内容代表 Canvas 中的所有内容一样,但我可以从屏幕底部向上看更多。

这是我的 View 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 才能首先显示内容)

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

最佳答案

您需要指定自定义 View 的高度,而不是 Canvas 。传递给 onDraw 的 Canvas 反射(reflect)了 View 的宽度和高度。

将 View 设置为 wrap_content 并不意味着只要您在其边界之外绘制它就会增长。它只会“包裹” subview ,而不是 Canvas 。

以编程方式设置 View 的高度:

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

我不确定你到底要做什么,所以我不能更具体地说明你应该在哪里设置高度,但我建议不要在 onDraw 中更改 View 的尺寸,因为当你无效时它会引起另一次平局,你需要一些时髦的逻辑来处理这个递归。

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

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

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

关于android - 自定义 View 不超出屏幕范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29616680/

相关文章:

android - Cardview ScrollX/ScrollY在ScrollView中为0

android - ScrollView 内的 ScrollView

android - 以编程方式更改 ScrollView 的颜色

android - 三星 Galaxy S 上的 RecognizerIntent.ACTION_RECOGNIZE_SPEECH

android - 根据矩阵将触摸值转换为点

android - OkHttp newBuilder()

java - 将位图加载到 Canvas 中并在其上绘制

Android三角形自定义按钮

java - Android Studio 3.X 更新并与 AChartEngine 失去连接(找不到符号类 ChartFactory)

java - 如何在 API 级别 17 上使用 "setTitle"