目前,我正试图建立一个彼此相邻的无限长的ImageView
链。
我尝试使用addRule
和LayoutParam
来执行此操作,以便必须将每个新ImageView
设置在ImageView
之前。
然而,我遇到了一个奇怪的问题。当我运行我的代码时,结果是:
我的两个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>
答案 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++;
}
如果您已准备好宽度和高度并知道从哪里开始放置第一个视图,则每个视图将从左到右并排放置......