2012-08-27 89 views
1

我已經看過其他關於這個問題,並沒有適用於我的情況。我的onDraw方法在自定義視圖中被不斷調用,大概有一次.3秒。onDraw方法不斷被調用

我有一個自定義視圖,繪製地圖的建築物的內部。該視圖比視圖區域大,因此我將自定義視圖封裝在自定義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 

任何想法,爲什麼它這樣做?它之前沒有這樣做,有些事情發生了變化,我不知道是什麼。之前用於滾動的屏幕相當快,現在幾乎沒有移動。

+0

您是否檢查過文檔以確保您不必調用super.onScroll()方法? (只是嘗試一個幸運的猜測)。可能發佈你的全班? – Kerry

+0

好想但不,沒有改變任何東西。我添加了完整的卷軸類。我使用了其中的兩個,一個用於水平,一個用於垂直。 –

+0

每'的onDraw()'在android系統的方法將在屏幕的刷新率稱爲e.g:每秒40次的SDK <16本60次每秒的SDK> = 16 – tolgap

回答

0

它可能有一些做的事實是,在scrollviews列表視圖是一個壞主意。或者至少他們曾經是。它與android的底層架構有關。羅曼蓋伊在這個帖子上就這個事實發表了評論How can I put a ListView into a ScrollView without it collapsing?

所以我沒有答案,我會冒險,有某種無效會導致重繪。

我唯一的解決辦法,可能是別的地方移動你的代碼,並把它作爲一些其他觸發的結果。或者將代碼包裝爲僅執行每第1000次呼叫。