1

我已经查看了有关此的其他问题,但没有一个适用于我的情况。我在自定义视图中的 onDraw 方法被不断调用,大约每 0.3 秒一次。

我有一个自定义视图,它绘制了建筑物内部的地图。该视图大于视图区域,因此我将自定义视图包装在自定义 ScrollView 和 Horizo​​ntalScrollView 中。onDraw 方法很大,这里就不贴了。但是我已经从 onDraw 中删除了所有代码,它没有改变任何东西。

如果我取消使用两个滚动视图,onDraw 只会被调用一次,并且只有在我捏缩放地图时才会再次调用。

编辑:在完整的自定义滚动类中添加。垂直滚动类与此相同。

public class SCEHorizontalScrollViewBase extends HorizontalScrollView {
private GestureDetector mGestureDetector;


private String TAG = this.getClass().getName();

public SCEHorizontalScrollViewBase(Context context, AttributeSet attrs) {
    super(context, attrs);
    mGestureDetector = new GestureDetector(context, new XScrollDetector());
    setFadingEdgeLength(10);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    Log.d(TAG, "onInterceptTouchEvent");
    return super.onInterceptTouchEvent(ev) && mGestureDetector.onTouchEvent(ev) && ev.getPointerCount()==1;
}

// Return false if we're scrolling in the Y direction  
class XScrollDetector extends SimpleOnGestureListener {
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        Log.d(TAG, "onScroll");
        super.onScroll(e1, e2, distanceX, distanceY);
        if(Math.abs(distanceY) < Math.abs(distanceX)) {
            return true;
        }
        return false;
    }
}

}

还添加了布局文件。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent" >

<mobile.base.SCEScrollViewBase
    android:fillViewport="true"
    android:id="@+id/warehouseScrollWidget"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:scrollbarFadeDuration="999999"
    android:scrollbarStyle="outsideOverlay" >

    <mobile.base.SCEHorizontalScrollViewBase
        android:fillViewport="true"
        android:id="@+id/warehouseHorizontalScrollWidget"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:scrollbarFadeDuration="999999"
        android:scrollbarStyle="outsideOverlay" >

        <mobile.base.widgets.SCEWidgetWarehouseView
            android:id="@+id/WarehouseView"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content" />
    </mobile.base.SCEHorizontalScrollViewBase>
</mobile.base.SCEScrollViewBase>
</RelativeLayout>

从我的日志中我得到了这个。

08-27 15:28:32.376: mobile.base.SCEHorizontalScrollViewBase(21571): requestLayout
08-27 15:28:32.376: mobile.base.widgets.SCEWidgetWarehouseView(21571): requestLayout
08-27 15:28:32.386: mobile.base.SCEScrollViewBase(21571): requestLayout
08-27 15:28:32.386: mobile.base.SCEHorizontalScrollViewBase(21571): requestLayout
08-27 15:28:32.386: mobile.base.SCEScrollViewBase(21571): requestLayout
08-27 15:28:32.416: mobile.base.widgets.SCEWidgetWarehouseView(21571): onMeasure set 972.5,1765.0
08-27 15:28:32.416: mobile.base.widgets.SCEWidgetWarehouseView(21571): onMeasure set 972.5,1765.0
08-27 15:28:32.456: mobile.base.widgets.SCEWidgetWarehouseView(21571): onMeasure set 972.5,1765.0
08-27 15:28:32.456: mobile.base.widgets.SCEWidgetWarehouseView(21571): onMeasure set 972.5,1765.0
08-27 15:28:32.476: mobile.base.SCEScrollViewBase(21571): onDraw
08-27 15:28:32.486: mobile.base.SCEHorizontalScrollViewBase(21571): onDraw
08-27 15:28:32.486: mobile.base.widgets.SCEWidgetWarehouseView(21571): onDraw
08-27 15:28:32.877: mobile.base.SCEScrollViewBase(21571): onDraw
08-27 15:28:32.877: mobile.base.SCEHorizontalScrollViewBase(21571): onDraw
08-27 15:28:32.877: mobile.base.widgets.SCEWidgetWarehouseView(21571): onDraw
08-27 15:28:33.117: mobile.base.SCEScrollViewBase(21571): onDraw
08-27 15:28:33.117: mobile.base.SCEHorizontalScrollViewBase(21571): onDraw
08-27 15:28:33.117: mobile.base.widgets.SCEWidgetWarehouseView(21571): onDraw

有什么想法为什么要这样做?它以前没有这样做,发生了一些变化,我不知道是什么。以前屏幕滚动得相当快,现在几乎不动了。

4

1 回答 1

0

这可能与滚动视图中的列表视图是一个坏主意这一事实有关。或者至少他们曾经是。它与android的底层架构有关。Romain Guy 就这个事实对这篇文章发表了评论我怎样才能将 ListView 放入 ScrollView 而不会崩溃?

所以我没有答案,我会冒险发生某种无效导致重绘。

我唯一的解决方案可能是将您的代码移动到其他地方并作为其他触发器的结果调用它。或者将代码包装为仅每 1000 次调用执行一次。

于 2012-08-27T21:20:20.863 回答