метод onDraw вызывается постоянно

Я просмотрел другие вопросы по этому поводу, и ни один из них не применим к моей ситуации. мой метод onDraw в пользовательском представлении вызывается постоянно, примерно раз в 0,3 секунды.

У меня есть пользовательский вид, который рисует карту внутренней части здания. Представление больше, чем область просмотра, поэтому я обернул пользовательское представление внутри пользовательского ScrollView и HorizontalScrollView. Метод 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

Любые идеи, почему он это делает? Раньше этого не было, что-то изменилось и я не знаю что. Раньше экран прокручивался довольно быстро, а теперь почти не двигается.


person Barry Klecka    schedule 27.08.2012    source источник
comment
Вы проверили документы, чтобы убедиться, что вам не нужно вызывать метод super.onScroll()? (просто пытаясь угадать с этим). Может быть, опубликовать весь свой класс?   -  person D-Dᴙum    schedule 27.08.2012
comment
Хорошая мысль, но нет, это ничего не изменило. Я добавил полный класс прокрутки. Я использую два из них, один для горизонтального и один для вертикального.   -  person Barry Klecka    schedule 28.08.2012
comment
Каждый метод onDraw() в Android будет вызываться с частотой обновления экрана, например: 40 раз в секунду в SDK ‹ 16 и 60 раз в секунду в SDK ›=16   -  person tolgap    schedule 28.08.2012
comment
Вы уверены в этом? Если я удалю два прокручиваемых представления, onDraw для моего пользовательского представления вызывается один раз в начале. У вас есть ссылка на информацию об этом?   -  person Barry Klecka    schedule 28.08.2012


Ответы (1)


Возможно, это как-то связано с тем, что просмотры списков в прокрутках — плохая идея. Или, по крайней мере, они были раньше. Это как-то связано с базовой архитектурой Android. Ромен Гай прокомментировал этот пост в отношении этого факта Как я могу поместить ListView в ScrollView, не сворачивая его?

Так что у меня нет ответа, я бы рискнул, что происходит какая-то недействительность, которая вызывает перерисовку.

Мое единственное решение может состоять в том, чтобы переместить ваш код в другое место и вызвать его в результате какого-либо другого триггера. Или оберните код, чтобы он выполнялся только каждый 1000-й вызов.

person Emile    schedule 27.08.2012