我必须以编程方式创建一堆图像(因为它们必须是动态的)。
我想像这样堆叠ImageView
:
我已经尝试过了,但是这些图片都是相互叠加的:
for(int i=0; i<limit; i++){
dynamicButtons[i] = new ImageView(contextSosFragment);
int offsetLeft = 15 * i;
int offsetTop = 15 * i;
layoutParamsDynamicButton.setMargins(offsetLeft, offsetTop, 0, 0);
dynamicButtons[i].setAdjustViewBounds(true);
dynamicButtons[i].setScaleType(ScaleType.FIT_CENTER);
dynamicButtons[i].setImageResource(R.drawable.img_badge_dynamic_loading);
dynamicButtons[i].setTag(id);
containerDynamicButtons.addView(dynamicButtons[i], layoutParamsDynamicButton);
}
我甚至从我的xml布局文件中删除了android:gravity="center"
。
在设置边距(ImageView
)之后,我还试图在dynamicButtons[i].setLayoutParams(layoutParamsDynamicButton);
上添加布局参数,但我读到这可能不会生效,因为布局参数是对于父项而不是我添加ImageView
的容器的子项,这就是我尝试使用addView(view, layoutParams)
的原因。
如何以编程方式定位这样的ImageView
?
解决方案是我必须为每个图像创建一个新的布局参数实例 - 就像Devunwired建议的那样。但是,我还发现我必须将LinearLayout.LayoutParams
更改为RelativeLayout.LayoutParams
。只有这样,改变才会生效。
最后的for循环如下所示:
for(int i=0; i<limit; i++){
RelativeLayout.LayoutParams layoutParamsDynamicButton = new RelativeLayout.LayoutParams(width, height);
layoutParamsDynamicButton.bottomMargin = (int) getActivity().getResources().getDimension(R.dimen.margin_badges);
int offsetLeft = AppConstants.dynamic_button_offset_multiplier * i;
int offsetTop = AppConstants.dynamic_button_offset_multiplier * i;
layoutParamsDynamicButton.setMargins(offsetLeft, offsetTop, 0, 0);
Log.d(TAG, "offset = "+offsetLeft);
dynamicButtons[i] = new ImageView(contextSosFragment);
dynamicButtons[i].setAdjustViewBounds(true);
dynamicButtons[i].setScaleType(ScaleType.FIT_CENTER);
dynamicButtons[i].setImageResource(R.drawable.img_badge_dynamic_loading);
dynamicButtons[i].setTag(id);
containerDynamicButtons.addView(dynamicButtons[i], layoutParamsDynamicButton);
}
答案 0 :(得分:1)
每个视图都需要自己的LayoutParams
对象。看起来您的代码每次只更新相同的LayoutParams
实例并将其传递给addView()
。如果是这种情况,那么在进行布局时,所有视图都指向相同的参数...并且它们的边距都将是最后设置的值。
作为性能优化,如果您只是将几个静态图像放在一起,您可以在单个内部使用LayerDrawable
(docs link)获得相同的效果(包括偏移) ImageView
。这是由<layer-list>
在XML中创建的对象,但由于您需要动态设置偏移量,因此您也可以在代码中创建一个。较少的视图通常会导致更清晰的UI。