如何在Android自定义视图中实现滚动

时间:2011-07-20 07:57:42

标签: android scroll custom-view

我已经编写了一个自定义视图,我想确保在任何屏幕尺寸上都可以查看。

我已经覆盖了onMeasure:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
    int parentHeight = MeasureSpec.getSize(heightMeasureSpec);

    this.setMeasuredDimension(parentWidth, parentHeight);
}

当视图小于屏幕时,这似乎工作正常。但有时,自定义视图比屏幕大,我计划缩小屏幕尺寸,因此我将自定义视图包装在ScrollView中,但现在parentHeight包含在onMeasure中}出现为0。

我已经将自定义视图的超类从View更改为ScrollView,希望能够轻松赢得继承滚动功能,但这种情况并没有发生,所以我只能尝试找到一种方法来获取ScrollView功能以使用我的自定义视图,或编写自己的滚动功能。

有人有什么建议吗?我已经看过this post on Large Image Scrolling Using Low Level Touch Events,并且如果我被迫自己编写,我会复制一些功能,但无论如何都会欣赏正确方向的推动。

1 个答案:

答案 0 :(得分:1)

原来答案很简单。我离开了ScrollView并改变了我的onMeasure。需要注意的是,虽然Android会提供宽度,但它不会为我提供高度,这最初令人困惑。为了让视图填满可用空间,我抓住了父视图的可见矩形。代码完整(希望它能帮助其他遇到同样问题的人):

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
    int parentHeight;

    if(isLandscape()) {
        Rect r = new Rect();
        ((ScrollView)getParent()).getGlobalVisibleRect(r);
        parentHeight = r.bottom - r.top;
    } else {
        parentHeight = (int) Util.getViewHeight();
    }

    this.setMeasuredDimension(parentWidth, parentHeight);
}