android实现推箱子代码,android开发--推箱子小游戏(二)
1、前言迎来第二章的更新啦:使用ListView实现关卡的选择。本章的内容有点小复杂,毕竟涉及使用了安卓开发中最难用也是最经常使用的控件之一:ListView本章能够说是复杂可是单一吧。主要是想你们看完整个系列后收获的不只仅是照抄照搬代码,最后实现也只实现了一个简简单单的BoxGame。我更但愿你们看了以后,能吸取到一些属于本身的东西,最后能实现的是OtherGames ,至少本章能让你熟悉掌握L
1、前言
迎来第二章的更新啦:使用ListView实现关卡的选择。
本章的内容有点小复杂,毕竟涉及使用了安卓开发中最难用也是最经常使用的控件之一:ListView
本章能够说是复杂可是单一吧。主要是想你们看完整个系列后收获的不只仅是照抄照搬代码,最后实现也只实现了一个简简单单的BoxGame。我更但愿你们看了以后,能吸取到一些属于本身的东西,最后能实现的是OtherGames ,至少本章能让你熟悉掌握ListView的使用。java
2、代码实现
一、ChoiceActivity的布局文件
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ChoiceActivity"
android:orientation="vertical">
android:id="@+id/lv_mapList"
android:layout_width="match_parent"
android:layout_height="match_parent">
此次咱们把Button控件去掉了,换成了一个ListView来实现相同的功能:选择关卡并根据点击的关卡带参数跳转到游戏界面。若是看到这里不是很理解能够回去看看第一章。android开发–推箱子小游戏(一)android
二、使用ListView的准备工做
a、新建一个java.class文件(注意:不是新建一个Activity)
业务代码以下:web
/*
* 地图名称类
* */
public class ChoiceMapData {
String MapName; // 地图名称(即第一关、第二关等)
// 构造函数
public ChoiceMapData(String MapName){
this.MapName = MapName;
}
public String getMapName() {
return MapName;
}
public void setMapName(String mapName) {
MapName = mapName;
}
}
这一个类用通俗的话讲就是ListView数据对象。当咱们要新加入第101关的时候,只须要在为ListView添加数据的方法中 new 一个 ChoiceMapData的对象,而后传入参数:“第101关” 便可。
固然传入的参数类型以及个数能够本身在构造方法里面设置。后期的升级改造中会讲到,持续关注哦~缓存
b、新建一个layout文件
布局代码以下app
android:id="@+id/ly_listItem"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:id="@+id/tv_mapName"
android:layout_width="match_parent"
android:layout_height="56dp"
android:textSize="25sp"
android:text="第一关"
android:gravity="center"/>
这个布局的做用是将TextView放到ListView的条目上显示出来,由于TextView不可能独立于布局以外存在,固然,在放到ListView上的时候,适配器会将这个父布局去掉,留下控件。由于一个界面只能存在一个父布局。ide
三、ListView适配器
新建一个java.class文件,使其继承ArrayAdapter类。
具体代码以下:svg
/*
* ListView的适配器
* */
public class ChoiceList_adapter extends ArrayAdapter {
private int resourceId; // List子项布局的ID
/*
* 此方法用于将上下文环境(参数1)、子项布局的ID(参数2)、子项布局的数据(参数3)传递进来
* */
public ChoiceList_adapter( Context context, int resource, List objects) {
super(context, resource, objects);
this.resourceId = resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
ViewHolder viewHolder;
// 获取当前项的ChoiceMapDate的实例
ChoiceMapData choiceMapData = getItem(position);
// convertView:用于保存以前加载好的布局(提升 ListView 的运行效率)
if (convertView == null){
view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
viewHolder = new ViewHolder();
viewHolder.mapName = view.findViewById(R.id.tv_mapName);
// setTag()方法:将ViewHolder内的控件实例缓存到view中
view.setTag(viewHolder);
}else {
view = convertView;
// getTag()方法:当convertView不为空的时候,把viewHolder从新取出
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.mapName.setText(choiceMapData.getMapName());
return view;
}
/*
*用于缓存控件的实例(提升 ListView 的运行效率)
* */
class ViewHolder{
TextView mapName;
}
看完上面的代码若是以为很复杂,看不懂的话,能够将上面代码的getView()替换掉,换成这个,实现的功能同样,只是效率问题而已。函数
// 无优化版的ListView的适配器的getVIew方法
public view getView(int position, View convertView, ViewGroup parent){
ChoiceMapData choiceMapData = getItem(position);
view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
TextView mapName = findViewByID(R.id.tv_mapName);
mapName.setText(choiceMapData.getMapName());
return view;
}
四、ChoiceActivity相关代码
/*
* 选择关卡界面
* */
public class ChoiceActivity extends AppCompatActivity {
// 声明ListView控件
ListView lv_mapList;
// 实例化一个地图选择的列表
private List choiceMapDataList = new ArrayList<>();
Intent intent_mapCode;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_choice);
// 绑定控件
lv_mapList = findViewById(R.id.lv_mapList);
// 自定义的方法,放入数据
initChoiceMapDate();
// 参数1:上下问环境;参数2:显示数据的布局;参数3:传入的数据
final ChoiceList_adapter choiceListAdapter = new ChoiceList_adapter(ChoiceActivity.this,
R.layout.choicelist_item, choiceMapDataList);
// 设置适配器
lv_mapList.setAdapter(choiceListAdapter);
/*
* 当条目被点击时自动回调
* */
intent_mapCode = new Intent(this, GameActivity.class);
lv_mapList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
// 点击条目后携带数据跳转
intent_mapCode.putExtra("mapCode",position+1);
startActivity(intent_mapCode);
}
});
}
/*
* 利用循环放入数据
* */
public void initChoiceMapDate(){
for (int i=1; i<10; i++){
ChoiceMapData choiceMapData = new ChoiceMapData("推箱子第" + i + "关");
choiceMapDataList.add(choiceMapData);
}
}
}
ChoiceActivity的代码难度并不大,须要掌握的是Intent的带参跳转。
如下是GameActivity的代码(暂时代码),主要是接收ChoiceActivity传过来的参数,与上章改动不大,须要注意的是参数类型改了。布局
public class GameActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game);
getMapCode();
}
/*
* 接收ChoiceActivity传送过来的数据
* */
public void getMapCode(){
// 参数1:键值; 参数2:默认值,即没有数据传过来时的值
int mapCode = getIntent().getIntExtra("mapCode",0);
if(mapCode == 0){
Toast.makeText(this, "mapCode为空", Toast.LENGTH_SHORT).show();
return;
}
Toast.makeText(this, ""+mapCode, Toast.LENGTH_SHORT).show();
}
}
3、总结
这章的内容很少,可是涉及了ListView的使用因此会比较的复杂,可是多练练就能够掌握了。毕竟这个控件仍是很经常使用的,因此花一章的篇幅来说它,是对它的尊重吧,哈哈。
总而言之,ListView主要有三个准备步骤:
一、新建数据的对象类
二、新建一个layout布局
三、新建ListView的适配器
好了,本章结束。下一章咱们讲如何画地图
下章见。
本章最终实现效果
优化
更多推荐
所有评论(0)