LayoutParams无法将ImageViews彼此相邻放置

时间:2015-08-14 03:53:37

标签: java android android-layout

目前,我正试图建立一个彼此相邻的无限长的ImageView链。 我尝试使用addRuleLayoutParam来执行此操作,以便必须将每个新ImageView设置在ImageView之前。

然而,我遇到了一个奇怪的问题。当我运行我的代码时,结果是:

enter image description here

我的两个ImageView不仅彼此相邻,而且对于过去的两个数字都不起作用!如果我只是创建两个块,它会给出下面的结果。

如果我再制作2个以上的块,它们只会叠加在块#2之上。这是上图中的情况。

另外,我必须为每个ImageView设置自己的ID,因为如果不这样做,它们的ID都会为-1。

我连续5个小时一直坚持这个,而且它真的开始变得烦人了。 (请不要建议我使用LinearLayout。我已经知道了,我不能使用它。)

public class TerrainFactory {

    int count = 0;
    int idCount = 1;
    Terrain terrain;
    public Terrain createNewTerrain(Activity activity, RelativeLayout relativeLayout,
                                    final ArrayList<Terrain> terrainArrayList){
        //TODO: Add the rectangle bounds into this.

        terrain = new Terrain();
        terrain.is = activity.getResources().openRawResource(+R.drawable.game_tile);
        terrain.tile = BitmapFactory.decodeStream(terrain.is);
        terrain.tileDrawable = new BitmapDrawable(activity.getResources(), terrain.tile);
        terrain.terrainImage = new ImageView(activity);
        terrain.terrainImage.setImageDrawable(terrain.tileDrawable);

        //noinspection ResourceType
        terrain.terrainImage.setId(idCount);
        idCount++;

        if(count >= 1) {
            RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
                    RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);;
            layoutParams.addRule(RelativeLayout.RIGHT_OF, terrainArrayList.get(count - 1).terrainImage.getId());

            relativeLayout.addView(terrain.terrainImage, layoutParams);
            terrain.terrainImage.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

                public void onGlobalLayout() {
                    //TODO: Set rectangle bounds in here
                    ++count;
                    terrain.terrainImage.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                }
            });
        }else{
            ++count;
            relativeLayout.addView(terrain.terrainImage);

            terrain.terrainImage.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

                public void onGlobalLayout() {
                    //TODO: Set rectangle bounds in here
                    terrain.terrainImage.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                }
            });

        }
        return terrain;
    }

    public int getCount() { return count; }
}

这是我的PlayActivity类,其中所有块创建都发生在:

public class PlayActivity extends Activity {

    RelativeLayout relativeLayout;
    TerrainFactory terrainFactory;
    ArrayList<Terrain> terrainArrayList = new ArrayList<Terrain>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_play);
        relativeLayout = (RelativeLayout) findViewById(R.id.relativeLayout);

        terrainFactory = new TerrainFactory();

            for(int i = 0; i < 7; i++){
            terrainArrayList.add(terrainFactory.createNewTerrain(PlayActivity.this, relativeLayout, terrainArrayList));
            }
    }
}

这是Terrain

public class Terrain {

    public Bitmap tile;
    public InputStream is;
    public ObjectAnimator moveLeft;
    public Drawable tileDrawable;
    public Rect bounds;
    public ImageView terrainImage;
}

这是RelativeLayout的XML。我正在使用的RelativeLayout是嵌套在整个屏幕中的RelativeLayout内的一个。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.hooray.project.fun.activity.PlayActivity">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="false"
        android:id="@+id/relativeLayout"></RelativeLayout>


</RelativeLayout>

1 个答案:

答案 0 :(得分:0)

基本上我会以另一种方式解决这个问题....使用不是建筑地形的视图,而是使用surfaceview并在其上绘制位图......

但是,让我们按照你的方式去做:

将您的观点放入FrameLayout。然后,当您创建视图时,在代码中为它们提供维度,并在代码中设置x和y位置。

例如,这是我给出View所需尺寸和代码中位置的方法。它是一个Textview,我设置了x和y位置,我填充了iinto变量,所以我可以按照我想要的方式设置它们:

tView.setLayoutParams(new FrameLayout.LayoutParams(hintListWidth,hintListHeight));

    tView.setX(hintListPosX);
    tView.setY(hintListPosY);

也许你的例子是这样的:

float startPosX=???;
float startPosY=???;
float i=0;
for(Terrian t:terrainArrayList)
{
    tView.setLayoutParams(new FrameLayout.LayoutParams(width,height));
    tView.setX(startPosX+width*i);
    tView.setY(startPosY);
    i++;
}

如果您已准备好宽度和高度并知道从哪里开始放置第一个视图,则每个视图将从左到右并排放置......