1

これに関する他の質問を調べましたが、私の状況には当てはまりません。カスタム ビューの onDraw メソッドは、約 0.3 秒に 1 回、常に呼び出されます。

建物内の地図を描画するカスタム ビューがあります。ビューはビュー領域よりも大きいため、カスタム ビューをカスタム ScrollView と Horizo​​ntalScrollView 内にラップしました。onDraw メソッドは大きいので、ここには投稿できません。ただし、onDraw からすべてのコードを削除しましたが、何も変わりませんでした。

2 つのスクロール ビューの使用を削除すると、onDraw は 1 回だけ呼び出され、マップをピンチ ズームした場合にのみ再度呼び出されます。

編集:完全なカスタム スクロール クラスに追加されました。縦スクロールクラスはこれと同じです。

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 に答える