以编程方式定位带有偏移的ImageView

时间:2015-02-20 04:21:06

标签: android android-relativelayout

我必须以编程方式创建一堆图像(因为它们必须是动态的)。

我想像这样堆叠ImageViewstack of images

我已经尝试过了,但是这些图片都是相互叠加的:

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);
        }

1 个答案:

答案 0 :(得分:1)

每个视图都需要自己的LayoutParams对象。看起来您的代码每次只更新相同的LayoutParams实例并将其传递给addView()。如果是这种情况,那么在进行布局时,所有视图都指向相同的参数...并且它们的边距都将是最后设置的值。

作为性能优化,如果您只是将几个静态图像放在一起,您可以在单个内部使用LayerDrawabledocs link)获得相同的效果(包括偏移) ImageView。这是由<layer-list>在XML中创建的对象,但由于您需要动态设置偏移量,因此您也可以在代码中创建一个。较少的视图通常会导致更清晰的UI。