游戏得有活动的场景:代码中多行多列的LinearLayout布局

既然是江湖,总得有一些可以到处跑的地儿。

咱是新手,那就排的简单点,排个几行几列的就完事了。至于到底排个几行几列的,这个倒也说不准。

得,那就不能直接在layout/xml里面直接画了。咋办?也好办,在activity里面通过代码生成布局就可以了。

activity_scene_fight.xml 如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/layout_scene"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_gravity="center_horizontal"/>

    <TextView
        android:id="@+id/t_fight_log"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

在activity中添加了一个子布局linearlayout:layout_scene和一个textview。layout_scene中将用于展示接下来由代码生成的各种场景的控件。

首先,得能生成单独一行的场景:

/**
  * @param clomuns 单行显示的场景数
  * @return 返回单行显示的LinearLayout
  */
private LinearLayout rowsLayout(int clomuns){
    LinearLayout rl= new LinearLayout(this);
    //设置LayoutParams
    LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
    //设置为水平布局
    rl.setOrientation(LinearLayout.HORIZONTAL);
    rl.setLayoutParams(lp);
    //循环添加场景button
    for (int j = 0; j < clomuns; j++) {
        Button b_scene = new Button(this);
        //设置场景按钮的名称
        b_scene.setText("场景"+j);
        //绑定点击事件
        b_scene.setOnClickListener(clickListener);
        //添加到创建的线性布局中
        rl.addView(b_scene);
    }
    //添加到显示的父线性布局中
    return rl;
}

/**
  * 点击事件
  */
private OnClickListener clickListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
        t_fight_log.append("你来到了"+((TextView)v).getText()+"\n");
    }
};

下一步,生成多行的场景控件,代码如下:

    /**
     * @param sceneNums活动场景数量
     * @return 返回自定义的场景布局
     */
    private LinearLayout sceneLayout(int sceneNums,int colnum){
        LinearLayout sly=new LinearLayout(this);
        LayoutParams lp = new LayoutParams(
                LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
        //设置为垂直布局
        sly.setOrientation(LinearLayout.VERTICAL);
        sly.setLayoutParams(lp);

        int rows=sceneNums/colnum;
        int surplus=sceneNums%colnum;
        if (surplus==0) {
            //如果能够被整除
            for (int i = 0; i < rows; i++) {
                sly.addView(rowsLayout(colnum));
            }
        }else{
            //如果不能够被整除
            int i;
            for ( i=0 ; i < rows; i++) {
                sly.addView(rowsLayout(colnum));
            }
            //创建最后剩下的,不足一行的布局
            sly.addView(rowsLayout(surplus));
        }
        return  sly;
    }

FightSceneActivity.java代码如下:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_scene_fight);

    //获取场景列表,生成页面各元素
    fightSceneLayout=(LinearLayout)this.findViewById(R.id.layout_scene);
    fightSceneLayout.addView(sceneLayout(11,4));
    t_fight_log=(TextView) findViewById(R.id.t_fight_log);}

最终效果如下:

原文地址:https://www.cnblogs.com/zzqm-gamelife/p/10254466.html

时间: 2024-07-29 13:14:59

游戏得有活动的场景:代码中多行多列的LinearLayout布局的相关文章

MATLAB基本操作(十):关于OpenCV坐标系与MATLAB中矩阵行与列的对应

OpenCV坐标点与MATLAB中矩阵行与列的对应 Last Edit 2014/5/4 转载请注明出处:http://blog.csdn.net/jxlijunhao 之所以会写这个东西,因为要把OpenCV中得到的角点坐标,保存在txt文件中,然后投影到matlab中. 首先,OpenCV中的坐标系如下图: 所以,OpenCV中以(0,0)为原点,假定一个点(10,2),表示y=10,x=2 在matlab中以  (1,1)为原点,所以上面的点在matlab中应为(11,3) 验证代码: 在

sql中的行转列和列转行的问题

sql中的行转列和列转行的问题 这是一个常见的问题,也是一个考的问题 1.行转列的问题  简单实例 CREATE TABLE #T ( MON1 INT, MON2 INT, MON3 INT ) GO INSERT INTO #T VALUES(1,2,3) GO SELECT * FROM #T --行转列:(union all) SELECT MON1 FROM #T UNION ALL SELECT MON2 FROM #T UNION ALL SELECT MON3 FROM #T G

使用Notepad++快速有效删除复制代码中的行号

转载:http://plum.0602.blog.163.com/blog/static/1130006502011101524120757/ 试了该方法,很好用! 为什么我把用Notepad++删除代码行号称作“快速”和“有效”呢? 其一,作为要常常分享和求取代码的编程人员来说,复制别人的代码可能将代码行号一起复制了,要想在编译器里运行,得一个一个删除行号,因此用Notepad++,只需一步便可以删除所有行号,其所谓“快速”(前提是按以下步骤配置Notepad++的自带插件). 其二,遇到问题

C#中DataTable行转列示例

将下面表(1)格式的数据转换为表(2)格式的数据.很明显,这是一个行转列的要求,本想在数据库中行转列,因为在数据库中行转列是比较简单的,方法可以参考本站SQLServer中(行列转换)行转列及列转行且加平均值及汇总值,但因其它需求,最终需将该转化搬到C#中进行了. (表1) 表(2) 不多说了,下面开始在DataTable行转列示例: //DataTable行转列 private DataTable RCC(DataTable _outDataSource) { //从DataTable中读取不

微软BI 之SSIS 系列 - 在 SQL 和 SSIS 中实现行转列的 PIVOT 透视操作

开篇介绍 记得笔者在 2006年左右刚开始学习 SQL Server 2000 的时候,遇到一个面试题就是行转列,列转行的操作,当时写了很长时间的 SQL 语句最终还是以失败而告终.后来即使能写出来,也是磕磕碰碰的,虽然很能锻炼 SQL 功底,每次都要挣扎一番,溺水的感觉.记得SQL Server 2005 以后就有了 PIVOT 和 UNPIVOT 这两个函数,可以非常方便的实现行转列和列传行的操作,就不再那么挣扎了.后来,在一个 08 项目中,有一位新的女同事在改一个 ETL,发现 SSIS

Sqlserver中PIVOT行转列透视操作

创建表: IF OBJECT_ID('T040_PRODUCT_SALES') IS NOT NULL DROP TABLE T040_PRODUCT_SALES create table T040_PRODUCT_SALES ( ID INT IDENTITY(1,1), ProductName VARCHAR(20), SaleMonth INT, SalesCount INT ) 插入数据并排序: INSERT INTO T040_PRODUCT_SALES VALUES ('Bicycl

拷贝的代码中去除行号的方法

对于新手来说,从其他地方拷贝代码来研究学习是很经常的事情,但是有的时候很不幸,拷贝过来的代码附带了令人烦恼的"行号".比如下图的一段JavaScript代码: 如果代码少的话还可以,一个一个删除呗.多的话就是噩梦哦,还不如自己照着把代码输一遍呢.怎么办呢? 在vs中有一个小技巧,按住Alt键然后鼠标左键选择可以一整块的代码.如图: 哈哈,利用这个小技巧我们就可以很轻松的选中代码前部的一竖排行号了.如图: 剩下的事情当然是按删除键喽. 当然这里并不是让我们只是简单的复制粘贴来学习,自己动

eclipse代码中每行的开始和结尾出现多余的特殊符号

window -> preferences -> general -> editors -> text editors ->          show whitespace charactors 把选项前面的勾去掉就好了.

mysql中的行转列

//查看当前商品库存 function checkProductStock($product_id){ global $wpdb; $sql="SELECT post_id,max(if((meta_key = '_stock_status'),meta_value,'')) AS stock_status,//此方法的作用 max(if((meta_key = '_manage_stock'),meta_value,'')) AS manage_stock, max(if((meta_key