我已经查看了有关此问题的其他问题,但没有一个适用于我的情况。我自己调用自定义视图中的onDraw方法,大约一次.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
为什么会这样做?它之前没有这样做,有些事情发生了变化,我不知道是什么。之前用于滚动的屏幕相当快,现在几乎没有移动。
答案 0 :(得分:0)
这可能与滚动视图中的列表视图是一个坏主意这一事实有关。或者至少他们曾经是。它与android的底层架构有关。 Romain Guy对这篇文章发表评论How can I put a ListView into a ScrollView without it collapsing?
所以我没有答案,我会担心会有某种失效导致重绘。
我唯一的解决方案可能是将代码移到其他地方,并将其作为其他触发器的结果调用。或者将代码包装成仅执行每1000次调用。