任何人都可以告诉我如何修复以下痕迹:
W/View (16810): requestLayout() improperly called by
theme.effects.TopCenterImageView{41dc73f0 V.ED.... ........
0,0-480,690 #7f060066 app:id/normal_image} during second
layout pass: posting in next frame
以下是TopCenterImageView的代码:
public class TopCenterImageView extends ImageView {
public TopCenterImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setScaleType(ScaleType.MATRIX);
}
public TopCenterImageView(Context context, AttributeSet attrs) {
super(context, attrs);
setScaleType(ScaleType.MATRIX);
}
public TopCenterImageView(Context context) {
super(context);
setScaleType(ScaleType.MATRIX);
}
@Override
protected boolean setFrame(int l, int t, int r, int b) {
if (getDrawable() == null) {
return super.setFrame(l, t, r, b);
}
Matrix matrix = getImageMatrix();
float scaleFactor = getWidth() / (float) getDrawable().getIntrinsicWidth();
matrix.setScale(scaleFactor, scaleFactor, 0, 0);
setImageMatrix(matrix);
return super.setFrame(l, t, r, b);
}
}
答案 0 :(得分:16)
如here所示,setScaleType将调用requestLayout,但ImageView的构造函数之前已经调用它。因此,它将导致布局在布局过程中调用多个requestLayout。这只是一个警告,因为在一个小规模,这不是一个问题。
你会在this帖子中找到一些好的研究(不过roboguice部分)。
答案 1 :(得分:2)
我在调用super.onLayout()之后在onLayout方法中更改了子视图布局参数; 这会导致递归:
Childlayout params已更改 - >父视图onRequestLayout() - >父视图onLayout - > childview params改变了 - > ...
答案 2 :(得分:0)
使用已更改参数作为更改检查。
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
super.onLayout(changed, left, top, right, bottom)
Log.i(TAG, "onLayout: $changed")
if (changed) {
changeDefaultView(size)
}
}
改变等于:
TRUE - 当布局与之前相比 CHANGED 时。
FALSE - 与之前的布局相比没有改变。