Android customview不会使onlayout或ondraw中的边距无效

时间:2013-05-17 11:41:13

标签: android relativelayout ondraw margins invalidation

我遇到了我为Android应用程序(API 8)制作的自定义视图(这是一个RelativeLayout)的问题。 我已经实现了一个在画布上显示小图像的自定义视图。这一切都很好,除了第一次绘制视图。

在第一次测量后缩放图像的位置。 onDrawonLayout函数中给出了正确的坐标,但仍然在非缩放位置上绘制视图。如果再次打开和关闭屏幕,则会在正确的位置绘制视图。但是,我似乎无法触发自己的重绘。 以下是onLayout代码的摘要。

calculateMeasurements();
int x = (int) (v.getPositionX()*scaleX+offset[1]);
int y = (int) (v.getPositionY()*scaleY+offset[0]);

Log.w("View.onLayout", "__Creating v: (orig)(" + v.getPositionX()+","+v.getPositionY() + ")"+ 
"\n      (scaled)(" + x +","+y+")");    

RelativeLayout.LayoutParams params =
(RelativeLayout.LayoutParams)foto_views.get(v.getIdentifier()).getLayoutParams();
params.setMargins(x, y, 0, 0);
foto_views.get(v.getIdentifier()).setLayoutParams(params);  

Log.e("OpstellingView.onLayout" , " Layoutparams: ("
+((RelativeLayout.LayoutParams)foto_views.get(v.getIdentifier()).getLayoutParams()).leftMargin + " ,"
+ ((RelativeLayout.LayoutParams)foto_views.get(v.getIdentifier()).getLayoutParams()).topMargin + " ,"
); 

foto_views.get(v.getIdentifier()).requestLayout();
foto_views.get(v.getIdentifier()).invalidate();
this.invalidate();

calculateMeasurements()中,计算出正确的比例。 我知道它会到onLayoutonDraw(并且具有正确的坐标),因为LogCat会在日志中显示它,但正如我所说,视图没有在正确的位置绘制。

1 个答案:

答案 0 :(得分:0)

我添加了一个AsyncTask来加载图像,现在边距正确显示。我仍然不知道为什么会这样,但确实如此。我认为这是因为ProgressDialog迫使视图重绘自己。