以编程方式使用偏移量定位 ImageViews
Position ImageViews with an offset programmatically
我必须以编程方式创建一堆图像(因为它们必须是动态的)。
我想像这样堆叠 ImageView
s:
我已经试过了,但是图像都重叠在一起:
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"
。
我也试过在设置边距(dynamicButtons[i].setLayoutParams(layoutParamsDynamicButton);
)后在 ImageView
上添加布局参数,但我读到这可能不会生效,因为布局参数是对于我添加 ImageView
的容器的父项而不是子项,这就是我尝试使用 addView(view, layoutParams)
.
的原因
如何以编程方式定位 ImageView
s?
解决方案:
解决方案是我必须为每个图像创建一个新的布局参数实例 - 正如 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);
}
每个视图都需要自己的 LayoutParams
对象。看起来您的代码每次只更新相同的 LayoutParams
实例并将其传递给 addView()
。如果是这种情况,那么在进行布局时,您的所有视图都指向相同的参数...并且它们的边距都将是最后设置的值。
作为性能优化,如果您只是将几个静态图像放在彼此之上,您可以在内部使用 LayerDrawable
(docs link) 实现相同的效果(包括偏移量)单个 ImageView
。这是 <layer-list>
在 XML 中创建的对象,但由于您需要动态设置偏移量,因此您也可以在代码中创建一个。较少的观看次数通常会导致更清洁 UI.
我必须以编程方式创建一堆图像(因为它们必须是动态的)。
我想像这样堆叠 ImageView
s:
我已经试过了,但是图像都重叠在一起:
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"
。
我也试过在设置边距(dynamicButtons[i].setLayoutParams(layoutParamsDynamicButton);
)后在 ImageView
上添加布局参数,但我读到这可能不会生效,因为布局参数是对于我添加 ImageView
的容器的父项而不是子项,这就是我尝试使用 addView(view, layoutParams)
.
如何以编程方式定位 ImageView
s?
解决方案:
解决方案是我必须为每个图像创建一个新的布局参数实例 - 正如 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);
}
每个视图都需要自己的 LayoutParams
对象。看起来您的代码每次只更新相同的 LayoutParams
实例并将其传递给 addView()
。如果是这种情况,那么在进行布局时,您的所有视图都指向相同的参数...并且它们的边距都将是最后设置的值。
作为性能优化,如果您只是将几个静态图像放在彼此之上,您可以在内部使用 LayerDrawable
(docs link) 实现相同的效果(包括偏移量)单个 ImageView
。这是 <layer-list>
在 XML 中创建的对象,但由于您需要动态设置偏移量,因此您也可以在代码中创建一个。较少的观看次数通常会导致更清洁 UI.