Android:如何预加载视图?

时间:2016-08-26 01:04:33

标签: android

我正在尝试制作一个游戏,在开始菜单中,当点击按钮时,将发生一个故事事件。根据玩家使用的角色点击按钮会有不同的故事,所以我不想为这些故事制作十亿种不同的活动/片段。

我有两个布局,我想在同一个活动中切换。 要从布局1切换到布局2,我尝试将布局2添加到布局1,并尝试ViewFlipper,但是当我尝试从布局1切换到布局2时,布局2中的TextView说"新文字"首先在变成我想要它说的之前。文本框应该位于底部,首先出现在顶部,然后跳到底部

我也尝试使用线程进行布局2预加载,但这只会弄乱布局2.那我该怎么办?

这是我的故事课

public class Story extends FrameLayout {
    String[][] story;
    int H;
    int W;
    int L;
    int index =0;
    TextView text;
    ImageView character;
    View v;

Story(Context context,String[][]story,int length){
    super(context);
    this.story=story;
    this.L = length;
    init(context);
}
    public void init(Context context) {
        LayoutInflater l = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
         v = l.inflate(R.layout.story, this, true);
        final RelativeLayout.LayoutParams textParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        final FrameLayout.LayoutParams imageParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        text = (TextView) v.findViewById(R.id.story);
        character = (ImageView) v.findViewById(R.id.chara);
        final RelativeLayout textBox = (RelativeLayout) v.findViewById(R.id.textbox);
        textBox.post(new Runnable() {
            @Override
            public void run() {
                H = textBox.getHeight();
                W = textBox.getWidth();
                textParams.setMargins(W / 12, H / 8, W / 10, H / 8);
                text.setLayoutParams(textParams);
                text.setText(story[index][0]);
            }
        });
        v.post(new Runnable() {
            @Override
            public void run() {
                int h = v.getHeight();
                imageParams.setMargins(W / 7 * 2, h / 10, 0, H / 3);
                character.setLayoutParams(imageParams);
                character.setImageResource(Integer.parseInt(story[index][1]));
            }
        });
    }
}

故事的XML

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
     >

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/chara"
        android:scaleType="fitStart"
        android:adjustViewBounds="true"
        />
    <RelativeLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textbox"

        android:layout_gravity="bottom">
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/vntextbox"
            android:adjustViewBounds="true"
            android:scaleType="fitEnd">

        </ImageView>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/story" />
    </RelativeLayout>

</merge>

对于每个角色,他们都有一个返回故事的方法,例如特定角色:

public class Player extends ImageView {  
    Context context;
    Player (Context context){
        super(context);
        this.context=context;
    }
public Story getIntro(){
    int normal = R.drawable.normal;
    int serious = R.drawable.serious;
    int happy = R.drawable.happy;
    final int length = 8;
    String[][] story = // a story
    final Story s = new Story(context, story, l);
            s.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                 //do some stuff
                }
    });
    return s;
}
}

这是故事的使用地点

public class StartMenu extends AppCompatActivity {
   @Override
    protected void onCreate(final Bundle savedInstanceState){
       super.onCreate(savedInstanceState);

setContentView(R.layout.startmenu);
 final RelativeLayout r = (RelativeLayout)findViewById(R.id.startscreen);
       final Button b =new Button(this);
b.setOnClickListener(new View.OnClickListener() {
                         @Override
                         public void onClick(View v) {
                             //here I want to do something like this: (doesn't work due to problems described above)
                             Player p = new Player(StartMenu.this);
                             Story s = p.getIntro();
                             r.removeAllViews();
                             r.addView(s);
}
});

1 个答案:

答案 0 :(得分:0)

尝试在.xml上留空文本空间,并在创建活动时填充它(如果它是动态的)。它将解决文本更改电影。

关于这两种布局,请搜索Fragments