【问题标题】:Android customview does not invalidate margins in onlayout or ondrawAndroid customview 不会使 onlayout 或 ondraw 中的边距无效
【发布时间】:2013-05-23 15:44:25
【问题描述】:

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

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

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 会在日志中显示它,但正如我所说,视图没有绘制在正确的位置。

【问题讨论】:

    标签: android android-relativelayout ondraw margins invalidation


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多