Android: Habilitar barras de desplazamiento en la Vista personalizada

He implementado un diseño personalizado que extiende RelativeLayout. Muestra muchos elementos diferentes que se crean en tiempo de ejecución y se puede desplazar en ambas dimensiones usando scrollTo () y scrollBy (). El desplazamiento funciona y ahora me gustaría agregar las barras de desplazamiento estándar de Android.

No es posible usar Scrollviews, ya que necesito que el diseño sea desplazable en 2 dimensiones, así que intenté hacerlo como se describe aquí:Android: Habilitar barras de desplazamiento en la vista basada en lienzo

He implementado todos los métodos de cálculo * con algunos valores (falsos) y habilitado las barras de desplazamiento. Pero todavía no puedo hacer que aparezcan. ¿Alguna idea de cuál podría ser el problema?

Hay toneladas de preguntas como esta en varias listas de correo y en SO, pero en todas partes la respuesta parece ser "1. llame a setHorizontalScrollbarEnabled (verdadero), 2. implemente todos los métodos de cómputo *, 3. llame a awakenScrollbars ()". Por lo que puedo decir, he hecho todo eso e incluso intenté usar initializeScrollbars () pero no sucede nada y los documentos no ofrecen ninguna ayuda.

public NodeLayout(Context context) {
    super(context);

    setVerticalScrollBarEnabled(true);
    setHorizontalScrollBarEnabled(true);

    TypedArray a = context.obtainStyledAttributes(R.styleable.View);
    initializeScrollbars(a);
    a.recycle();
}

@Override
protected int computeHorizontalScrollExtent() {
    return 5;
}

@Override
protected int computeHorizontalScrollOffset() {
    return 10;
}

@Override
protected int computeHorizontalScrollRange() {
    return 50;
}

@Override
protected int computeVerticalScrollExtent() {
    return getHeight() / 2;
}

@Override
protected int computeVerticalScrollOffset() {
    return getHeight() / 2;
}

@Override
protected int computeVerticalScrollRange() {
    return getHeight();
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    awakenScrollBars();
    invalidate();
    return true;
}

Y así es como se ve mi archivo attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="View">
<attr name="android:background"/>
<attr name="android:clickable"/>
<attr name="android:contentDescription"/>
<attr name="android:drawingCacheQuality"/>
<attr name="android:duplicateParentState"/>
<attr name="android:fadeScrollbars"/>
<attr name="android:fadingEdge"/>
<attr name="android:fadingEdgeLength"/>
<attr name="android:fitsSystemWindows"/>
<attr name="android:focusable"/>
<attr name="android:focusableInTouchMode"/>
<attr name="android:hapticFeedbackEnabled"/>
<attr name="android:id"/>
<attr name="android:isScrollContainer"/>
<attr name="android:keepScreenOn"/>
<attr name="android:longClickable"/>
<attr name="android:minHeight"/>
<attr name="android:minWidth"/>
<attr name="android:nextFocusDown"/>
<attr name="android:nextFocusLeft"/>
<attr name="android:nextFocusRight"/>
<attr name="android:nextFocusUp"/>
<attr name="android:onClick"/>
<attr name="android:padding"/>
<attr name="android:paddingBottom"/>
<attr name="android:paddingLeft"/>
<attr name="android:paddingRight"/>
<attr name="android:paddingTop"/>
<attr name="android:saveEnabled"/>
<attr name="android:scrollX"/>
<attr name="android:scrollY"/>
<attr name="android:scrollbarAlwaysDrawHorizontalTrack"/>
<attr name="android:scrollbarAlwaysDrawVerticalTrack"/>
<attr name="android:scrollbarDefaultDelayBeforeFade"/>
<attr name="android:scrollbarFadeDuration"/>
<attr name="android:scrollbarSize"/>
<attr name="android:scrollbarStyle"/>
<attr name="android:scrollbarThumbHorizontal"/>
<attr name="android:scrollbarThumbVertical"/>
<attr name="android:scrollbarTrackHorizontal"/>
<attr name="android:scrollbarTrackVertical"/>
<attr name="android:scrollbars"/>
<attr name="android:soundEffectsEnabled"/>
<attr name="android:tag"/>
<attr name="android:visibility"/>
</declare-styleable>
</resources>

Estoy desarrollando para Android 3.0.

Respuestas a la pregunta(2)

Su respuesta a la pregunta