转载请注明出处:http://blog.csdn.net/einarzhang/article/details/44774635

本系列文章的重点是如何使用Android开发一个简单的健康食谱软件。使用了以下相关技术中见例如:

  • 提供GridView和ListView的基本使用
  • 利用universal-image-loader异步载入网络图片
  • 通过HttpClient获取网络http请求数据
  • 滑动分页载入数据
软件所用的全部数据均来源于http://doc.yi18.net/cookwendang提供的食谱接口,感谢他们。

软件文件结构例如以下所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZWluYXJ6aGFuZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">


MainActivity:主界面Acitivity
MListActivity:子分类列表Acitivity
CListActivity:食谱列表Activity
DetailActivity:食谱详情Activity

MainGridAdapter:主界面食谱分类适配器
CListAdapter:食谱列表适配器
Cook:用于保存食谱信息的pojo

HttpUtils:提供Http请求相关功能
MUtils:提供食谱相关的处理逻辑功能

软件主界面设计开发

 主界面主要提供了健康食谱的主分类控件,用户能够选择自己感兴趣的分类进行食谱查看。

为了便于用户更好的找到自己须要的食谱,我们提供一个全局搜索功能,用户能够输入关键词搜索自己想要的食谱信息。如:萝卜。将载入出全部与萝卜相关的食谱


主界面终于效果图例如以下所看到的:


主界面共分为两大块:全局搜索布局和Grid分类布局,其布局xml例如以下所看到的:
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:background="@drawable/list_item_bg"
  6. tools:context=".MainActivity" >
  7.  
  8. <RelativeLayout
  9. android:id="@+id/top_layout"
  10. android:layout_width="match_parent"
  11. android:layout_height="160dp"
  12. android:layout_alignParentTop="true"
  13. android:background="@drawable/main_top" >
  14.  
  15. <TextView
  16. android:layout_width="match_parent"
  17. android:layout_height="50dp"
  18. android:background="@drawable/main_title"
  19. android:text="@string/app_name"
  20. android:gravity="center"
  21. android:textColor="@android:color/white"
  22. android:textSize="18sp"
  23. android:layout_alignParentTop="true" >
  24. </TextView>
  25.  
  26. <EditText
  27. android:id="@+id/main_input"
  28. android:layout_width="match_parent"
  29. android:layout_height="40dp"
  30. android:layout_alignParentBottom="true"
  31. android:layout_margin="20dp"
  32. android:background="@drawable/edit_shape"
  33. android:hint="@string/search_tip"
  34. android:lines="1"
  35. android:paddingLeft="32dp"
  36. android:paddingRight="32dp"
  37. android:singleLine="true"
  38. android:textSize="16sp" >
  39. </EditText>
  40.  
  41. <ImageView
  42. android:id="@+id/main_clear_btn"
  43. android:layout_width="wrap_content"
  44. android:layout_height="wrap_content"
  45. android:layout_alignBottom="@+id/main_input"
  46. android:layout_alignLeft="@+id/main_input"
  47. android:layout_alignTop="@+id/main_input"
  48. android:src="@drawable/clear" />
  49.  
  50. <ImageView
  51. android:id="@+id/main_search_btn"
  52. android:layout_width="wrap_content"
  53. android:layout_height="wrap_content"
  54. android:layout_alignBottom="@+id/main_input"
  55. android:layout_alignRight="@+id/main_input"
  56. android:layout_alignTop="@+id/main_input"
  57. android:src="@drawable/search" >
  58. </ImageView>
  59. </RelativeLayout>
  60.  
  61. <GridView
  62. android:id="@+id/main_grid"
  63. android:layout_width="match_parent"
  64. android:layout_height="match_parent"
  65. android:layout_below="@id/top_layout"
  66. android:layout_marginTop="20dp"
  67. android:gravity="center_horizontal"
  68. android:numColumns="3"
  69. android:scrollbars="none"
  70. android:verticalSpacing="20dp" >
  71. </GridView>
  72.  
  73. </RelativeLayout>

通过 http://api.yi18.net/cook/cookclass接口能够获取到全部的主分类信息。

我们通过定制自有的MainGridAdapter实现GridView的渲染。源代码例如以下所看到的:

  1. import java.util.List;
  2.  
  3. import android.content.Context;
  4. import android.content.Intent;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.view.ViewGroup;
  9. import android.widget.BaseAdapter;
  10. import android.widget.ImageView;
  11. import android.widget.TextView;
  12.  
  13. public class MainGridAdapter extends BaseAdapter {
  14.  
  15. private List<Item> items;
  16. private Context ctx;
  17.  
  18. public MainGridAdapter(List<Item> items, Context ctx) {
  19. this.items = items;
  20. this.ctx = ctx;
  21. }
  22.  
  23. @Override
  24. public int getCount() {
  25. return items.size();
  26. }
  27.  
  28. @Override
  29. public Object getItem(int arg0) {
  30. return items.get(arg0);
  31. }
  32.  
  33. @Override
  34. public long getItemId(int arg0) {
  35. return arg0;
  36. }
  37.  
  38. @Override
  39. public View getView(final int position, View view, ViewGroup arg2) {
  40. if(view == null) {
  41. view = LayoutInflater.from(ctx).inflate(R.layout.item, null);
  42. }
  43. final Item item = items.get(position);
  44. ImageView icon = (ImageView) view.findViewById(R.id.item_icon);
  45. icon.setImageResource(item.icon);
  46. TextView text = (TextView) view.findViewById(R.id.item_text);
  47. text.setText(ctx.getString(item.text));
  48. view.setOnClickListener(new OnClickListener() {
  49. @Override
  50. public void onClick(View v) {
  51. Intent intent = new Intent();
  52. intent.putExtra("id", position+1);
  53. intent.putExtra("title", ctx.getString(item.text));
  54. intent.setClass(ctx, MListActivity.class);
  55. ctx.startActivity(intent);
  56. }
  57. });
  58. return view;
  59. }
  60.  
  61. static class Item {
  62.  
  63. public Item() {
  64.  
  65. }
  66.  
  67. public Item(int bgColor, int icon, int text) {
  68. super();
  69. this.bgColor = bgColor;
  70. this.icon = icon;
  71. this.text = text;
  72. }
  73.  
  74. public int bgColor;
  75. public int icon;
  76. public int text;
  77. }
  78.  
  79. }

当中Item为保存了背景图、分类图标和分类名称的模型对象。

我们为了实现方便。将背景图忽略。

MainGridAdapter为每一个分类提供了单击事件。点击后将进入子分类列表:

  1. view.setOnClickListener(new OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. Intent intent = new Intent();
  5. intent.putExtra("id", position+1);
  6. intent.putExtra("title", ctx.getString(item.text));
  7. intent.setClass(ctx, MListActivity.class);
  8. ctx.startActivity(intent);
  9. }
  10. });

该Adapter使用方式例如以下所看到的:
  1. private void initGrid() {
  2. List<Item> items = new ArrayList<Item>();
  3. items.add(new Item(R.color.item1, R.drawable.item1, R.string.item1));
  4. items.add(new Item(R.color.item2, R.drawable.item2, R.string.item2));
  5. items.add(new Item(R.color.item3, R.drawable.item3, R.string.item3));
  6. items.add(new Item(R.color.item4, R.drawable.item4, R.string.item4));
  7. items.add(new Item(R.color.item5, R.drawable.item5, R.string.item5));
  8. items.add(new Item(R.color.item6, R.drawable.item6, R.string.item6));
  9. items.add(new Item(R.color.item7, R.drawable.item7, R.string.item7));
  10. items.add(new Item(R.color.item8, R.drawable.item8, R.string.item8));
  11. items.add(new Item(R.color.item9, R.drawable.item9, R.string.item9));
  12. items.add(new Item(R.color.item9, R.drawable.item10, R.string.item10));
  13. items.add(new Item(R.color.item9, R.drawable.item11, R.string.item11));
  14. items.add(new Item(R.color.item9, R.drawable.item12, R.string.item12));
  15. items.add(new Item(R.color.item9, R.drawable.item13, R.string.item13));
  16. items.add(new Item(R.color.item9, R.drawable.item14, R.string.item14));
  17. grid.setAdapter(new MainGridAdapter(items, this));
  18. }

以下给出主界面Activity:

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.Timer;
  4. import java.util.TimerTask;
  5.  
  6. import android.app.Activity;
  7. import android.content.Intent;
  8. import android.os.Bundle;
  9. import android.view.KeyEvent;
  10. import android.view.View;
  11. import android.view.View.OnClickListener;
  12. import android.widget.EditText;
  13. import android.widget.GridView;
  14. import android.widget.ImageView;
  15. import android.widget.Toast;
  16.  
  17. public class MainActivity extends Activity implements OnClickListener {
  18.  
  19. private GridView grid;
  20. private ImageView clearButton, searchButton;
  21. private EditText input;
  22.  
  23. @Override
  24. protected void onCreate(Bundle savedInstanceState) {
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.main);
  27. clearButton = (ImageView) findViewById(R.id.main_clear_btn);
  28. clearButton.setOnClickListener(this);
  29. searchButton = (ImageView) findViewById(R.id.main_search_btn);
  30. searchButton.setOnClickListener(this);
  31. input = (EditText) findViewById(R.id.main_input);
  32. grid = (GridView) findViewById(R.id.main_grid);
  33. initGrid();
  34. }
  35.  
  36. private void initGrid() {
  37. List<Item> items = new ArrayList<Item>();
  38. items.add(new Item(R.color.item1, R.drawable.item1, R.string.item1));
  39. items.add(new Item(R.color.item2, R.drawable.item2, R.string.item2));
  40. items.add(new Item(R.color.item3, R.drawable.item3, R.string.item3));
  41. items.add(new Item(R.color.item4, R.drawable.item4, R.string.item4));
  42. items.add(new Item(R.color.item5, R.drawable.item5, R.string.item5));
  43. items.add(new Item(R.color.item6, R.drawable.item6, R.string.item6));
  44. items.add(new Item(R.color.item7, R.drawable.item7, R.string.item7));
  45. items.add(new Item(R.color.item8, R.drawable.item8, R.string.item8));
  46. items.add(new Item(R.color.item9, R.drawable.item9, R.string.item9));
  47. items.add(new Item(R.color.item9, R.drawable.item10, R.string.item10));
  48. items.add(new Item(R.color.item9, R.drawable.item11, R.string.item11));
  49. items.add(new Item(R.color.item9, R.drawable.item12, R.string.item12));
  50. items.add(new Item(R.color.item9, R.drawable.item13, R.string.item13));
  51. items.add(new Item(R.color.item9, R.drawable.item14, R.string.item14));
  52. grid.setAdapter(new MainGridAdapter(items, this));
  53. }
  54.  
  55. @Override
  56. public void onClick(View v) {
  57. switch (v.getId()) {
  58. case R.id.main_clear_btn:
  59. input.setText("");
  60. break;
  61. case R.id.main_search_btn:
  62. String searchStr = input.getText().toString();
  63. if(searchStr == null || searchStr.trim().equals("")) {
  64. Toast.makeText(this, "请输入要搜索的菜谱!", Toast.LENGTH_SHORT).show();
  65. } else {
  66. Intent intent = new Intent();
  67. intent.putExtra("keyword", searchStr);
  68. intent.setClass(this, CListActivity.class);
  69. startActivity(intent);
  70. }
  71. break;
  72.  
  73. default:
  74. break;
  75. }
  76. }
  77.  
  78. }

子分类界面设计开发

当用户点击主界面的主分类条目时,将进入该分类的子分类列表界面。子分类接口为:http://api.yi18.net/cook/cookclass?id=myid
我们在MUtils中提供获取子分类的方法:
  1. @SuppressWarnings("serial")
  2. public static ArrayList<HashMap<String, Object>> getChildClass(final int pid) {
  3. String url = "http://api.yi18.net/cook/cookclass";
  4. String result = HttpUtils.httpGet(url, new HashMap<String, Object>(){{
  5. put("id", pid);
  6. }});
  7. ArrayList<HashMap<String, Object>> dataMap = new ArrayList<HashMap<String, Object>>();
  8. if(result != null) {
  9. try {
  10. JSONObject root = new JSONObject(result);
  11. if(root.getBoolean("success")) {
  12. JSONArray datas = root.getJSONArray("yi18");
  13. for(int i = 0, len = datas.length(); i < len; i++) {
  14. HashMap<String, Object> data = new HashMap<String, Object>();
  15. JSONObject obj = datas.getJSONObject(i);
  16. data.put("id", obj.getInt("id"));
  17. data.put("name", obj.getString("name"));
  18. dataMap.add(data);
  19. }
  20. }
  21. } catch (Exception e) {
  22. }
  23. }
  24. return dataMap;
  25. }

返回ArrayList<HashMap>是为了便于SimpleAdapter直接使用,使用见例如以下的MListActivity中的相关代码:

  1. import java.util.ArrayList;
  2. import java.util.HashMap;
  3.  
  4. import android.app.Activity;
  5. import android.content.Intent;
  6. import android.os.Bundle;
  7. import android.os.Handler;
  8. import android.os.Message;
  9. import android.view.View;
  10. import android.view.View.OnClickListener;
  11. import android.widget.AdapterView;
  12. import android.widget.AdapterView.OnItemClickListener;
  13. import android.widget.ImageView;
  14. import android.widget.ListView;
  15. import android.widget.SimpleAdapter;
  16. import android.widget.TextView;
  17.  
  18. import com.my.lib.Utils;
  19.  
  20. public class MListActivity extends Activity implements OnClickListener, OnItemClickListener, Runnable {
  21.  
  22. private ImageView unconnect;
  23. private ListView mlist;
  24. Handler handler;
  25. ArrayList<HashMap<String, Object>> mdata;
  26.  
  27. @Override
  28. protected void onCreate(Bundle savedInstanceState) {
  29. super.onCreate(savedInstanceState);
  30. setContentView(R.layout.list);
  31. findViewById(R.id.list_return).setOnClickListener(this);
  32. mlist = (ListView) findViewById(R.id.mlist);
  33. mlist.setOnItemClickListener(this);
  34. unconnect = (ImageView) findViewById(R.id.list_unconnect);
  35. unconnect.setOnClickListener(this);
  36. ((TextView)findViewById(R.id.list_title)).setText(getIntent().getStringExtra("title"));
  37. handler = new Handler() {
  38. @Override
  39. public void handleMessage(Message msg) {
  40. if(mdata == null) {
  41. change(true);
  42. } else {
  43. change(false);
  44. mlist.setAdapter(new SimpleAdapter(MListActivity.this, mdata, R.layout.list_item, new String[]{"name"}, new int[]{R.id.list_item_text}));
  45. }
  46. }
  47. };
  48. new Thread(this).start();
  49. }
  50.  
  51. @Override
  52. @SuppressWarnings("unchecked")
  53. public void onItemClick(AdapterView<?
  54.  
  55. > av, View v, int position, long arg3) {
  56. HashMap<String, Object> item = (HashMap<String, Object>)av.getItemAtPosition(position);
  57. Intent intent = new Intent();
  58. intent.putExtra("id", (Integer)item.get("id"));
  59. intent.putExtra("title", (String)item.get("name"));
  60. intent.setClass(this, CListActivity.class);
  61. startActivity(intent);
  62. }
  63.  
  64. @Override
  65. public void onClick(View v) {
  66. switch (v.getId()) {
  67. case R.id.list_return:
  68. MListActivity.this.finish();
  69. break;
  70. case R.id.list_unconnect:
  71. new Thread(this).start();
  72. break;
  73. default:
  74. break;
  75. }
  76. }
  77.  
  78. @Override
  79. public void run() {
  80. if(Utils.canAccessNetwork(MListActivity.this)) {
  81. mdata = MUtils.getChildClass(getIntent().getIntExtra("id", 1));
  82. }
  83. handler.sendEmptyMessage(1);
  84. }
  85.  
  86. void change(boolean flag) {
  87. if(flag) {
  88. mlist.setVisibility(View.GONE);
  89. unconnect.setVisibility(View.VISIBLE);
  90. } else {
  91. mlist.setVisibility(View.VISIBLE);
  92. unconnect.setVisibility(View.GONE);
  93. }
  94. }
  95. }

须要注意的是:Http请求处理不能在主线程中调用,须要开启新的线程调用。子分类点击后将进入该子分类的食谱列表


分类列表布局XML例如以下所看到的:
  1. <?
  2.  
  3. xml version="1.0" encoding="utf-8"?
  4.  
  5. >
  6. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent"
  9. android:background="@drawable/list_item_bg"
  10. android:orientation="vertical" >
  11.  
  12. <RelativeLayout
  13. android:layout_width="match_parent"
  14. android:layout_height="50dp"
  15. android:background="@drawable/title_bg" >
  16.  
  17. <ImageView
  18. android:id="@+id/list_return"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:layout_alignParentLeft="true"
  22. android:layout_centerVertical="true"
  23. android:layout_marginLeft="20dp"
  24. android:src="@drawable/arrowl" />
  25.  
  26. <TextView
  27. android:id="@+id/list_title"
  28. android:layout_width="wrap_content"
  29. android:layout_height="wrap_content"
  30. android:layout_centerInParent="true"
  31. android:textColor="@android:color/white"
  32. android:textSize="18sp"
  33. android:textStyle="bold" />
  34. </RelativeLayout>
  35.  
  36. <ListView
  37. android:id="@+id/mlist"
  38. android:layout_width="match_parent"
  39. android:layout_height="match_parent"
  40. android:scrollbars="none" >
  41. </ListView>
  42.  
  43. <ImageView
  44. android:id="@+id/list_unconnect"
  45. android:layout_marginTop="160dp"
  46. android:layout_gravity="center"
  47. android:layout_width="wrap_content"
  48. android:layout_height="wrap_content"
  49. android:src="@drawable/unconnect"
  50. android:visibility="gone"/>
  51.  
  52. </LinearLayout>

Item布局xml例如以下所看到的:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="50dp"
  5. android:background="@drawable/list_selector" >
  6.  
  7. <ImageView
  8. android:id="@+id/mlist_item_icon"
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:layout_alignParentLeft="true"
  12. android:layout_centerVertical="true"
  13. android:src="@drawable/list_item_icon"
  14. android:layout_marginLeft="20dp"
  15. android:layout_marginRight="20dp" />
  16.  
  17. <TextView
  18. android:id="@+id/list_item_text"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:layout_centerVertical="true"
  22. android:layout_toRightOf="@+id/mlist_item_icon"
  23. android:textColor="@android:color/white"
  24. android:textSize="16sp" />
  25.  
  26. <ImageView
  27. android:id="@+id/mlist_item_arrow"
  28. android:layout_width="wrap_content"
  29. android:layout_height="wrap_content"
  30. android:src="@drawable/arrowr"
  31. android:layout_alignParentRight="true"
  32. android:layout_centerVertical="true"
  33. android:layout_marginRight="20dp" />
  34.  
  35. </RelativeLayout>




版权声明:本文博主原创文章,博客,未经同意不得转载。

Android开发实例-健康食谱应用(一)的更多相关文章

  1. Android开发实例之miniTwitter登录界面的实现

    原文: http://www.jizhuomi.com/android/example/134.html 本文要演示的Android开发实例是如何完成一个Android中的miniTwitter登录界 ...

  2. Android开发实例详解之IMF(Android SDK Sample—SoftKeyboard)

    本博前面的文章介绍了Android开发环境的搭建和模拟器的常用操作.本次,将以Android Sample中经典的SoftKeyboard项目为例,详细解析Android上一个小型项目的开发过程和注意 ...

  3. Android开发实例总结

    写一个修改密码的界面 1画界面总结: 需要弄清楚什么地方用相对布局,什么地方使用线性布局 希望这过后自己花时间去弄清楚他们内嵌的的所有组件以及组件的属性包括用法. 2逻辑总结: 逻辑描述总是那么几步的 ...

  4. Android开发实例之多点触控程序

    智能终端设备的多点触控操作为我们带来了种种炫酷体验,这也使得很多Android开发者都对多点触控程序的开发感兴趣.实际上多点触控程序的实现并不是那么遥不可及,而是比较容易.本文就主要通过一个实例具体讲 ...

  5. Android开发实例之闹钟提醒

    本实例通过TimePickerDialog时间选择对话框让用户设置闹钟.并通过AlarmManager全局定时器在指定的时间启动闹钟Activity . 程序执行效果图: 实例代码: package ...

  6. 【Android 开发实例】时间管理APP开发之数据库设计

    当然也能够先写界面什么的.可是,总认为先把数据库后台写好在写界面比較放心. 对于数据库的设计,我一開始没什么概念.甚至不知道怎样下手,一開始想着设计成几个表?有哪些字段? 最后用了两天时间,还是一无所 ...

  7. Android开发实例 Unity显示Toast

    Android中的Toast是一种简易的消息提示框. 当视图显示给用户,在应用程序中显示为浮动.和Dialog不一样的是,它永远不会获得焦点,无法被点击.用户将可能是在中间键入别的东西.Toast类的 ...

  8. Android音乐播放器的开发实例

    本文将引导大家做一个音乐播放器,在做这个Android开发实例的过程中,能够帮助大家进一步熟悉和掌握学过的ListView和其他一些组件.为了有更好的学习效果,其中很多功能我们手动实现,例如音乐播放的 ...

  9. android开发学习---基础知识学习、如何导入已有项目和开发一个电话拨号器

    一.基础知识点学习  1.Android体系结构 如图所示,android 架构分为三层: (1)最底层是linux内核,主要是各种硬件的驱动,如相机驱动(Camera Driver),闪存驱动(Fl ...

随机推荐

  1. php开源项目学习二次开发的计划

      开源项目: cms 国内 dedecms cmstop 国外 joomla, drupal 电商 国内 ecshop 国外 Magento 论坛 discuz 博客 wordpress   学习时 ...

  2. PHP代码分离

    所谓的代码分离 其实只是一种思路,既然是一种思路 那就意味着他是有需求的 没有需求就没有解决方案 没有方案就不存在思路. 在这之前,我们制作 PHP 程序页面的时候.都是 HTML 和 PHP 混合写 ...

  3. c++中的vector原理

    vectorvector就是动态数组.它也是在堆中分配内存,元素连续存放,有保留内存,如果减少大小后,内存也不会释放.如果新值>当前大小时才会再分配内存. 它拥有一段连续的内存空间,并且起始地址 ...

  4. Laravel之路——事务

    准备: 表必须是InnoDB引擎 DB::beginTransaction(); try{ $name = 'abc'; $result1 = Test::create(['name'=>$na ...

  5. Python学习笔记(一)Python安装及环境变量的配置

    1.下载python安装包. 下载地址:https://www.python.org/ 2.配置环境变量 找到python的安装路径.C:\Python27;script的路径:C:\Python27 ...

  6. 如何查看Windows下端口占用

    查看端口占用的PID进程号 C:\Users\yan>netstat -ano | findstr "8888" 查看是哪个进程或者程序占用了17840端口 C:\Users ...

  7. Hashtable,HashMap实现原理

    http://blog.csdn.net/czh0766/article/details/5260360 昨天看了算法导论对散列表的介绍,今天看了一下Hashtable, HashMap这两个类的源代 ...

  8. Party

    hdu3062:http://acm.hdu.edu.cn/showproblem.php?pid=3062 题意:中文题. 题解:很明显的2-sat.然后要深刻理解命题和逆否命题.如这一题,c1,c ...

  9. Git fork指令

    ​ork并且更新一个仓库 现在有这样一种情形:有一个叫做Joe的程序猿写了一个游戏程序,而你可能要去改进它.并且Joe将他的代码放在了GitHub仓库上.下面是你要做的事情: fork并且更新GitH ...

  10. cocosBuilder使用总结

    原创,转载请注明出处! 基本流程 >=-. 准备工作 #. 把一个项目场景相关的,相对独立(别的场景用不到)的碎图,用TexturePack拼接成大的png图片文件及plist数据字处理文件 # ...