Cocos2D-Android-1之源码详解:1.Cocos2D

/*

* Copyright (C) 2007 The Android Open Source Project

*

* Licensed under the Apache License, Version 2.0 (the "License");

* you may not use this file except in compliance with the License.

* You may obtain a copy of the License at

*

*      http://www.apache.org/licenses/LICENSE-2.0

*

* Unless required by applicable law or agreed to in writing, software

* distributed under the License is distributed on an "AS IS" BASIS,

* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

* See the License for the specific language governing permissions and

* limitations under the License.

*/

package org.cocos2d;

import java.text.Collator;

import java.util.ArrayList;

import java.util.Collections;

import java.util.Comparator;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import android.app.ListActivity;

import android.content.Intent;

import android.content.pm.PackageManager;

import android.content.pm.ResolveInfo;

import android.os.Bundle;

import android.view.View;

import android.widget.ListView;

import android.widget.SimpleAdapter;

public class Cocos2D extends ListActivity {//这个类用了ListActivity

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState); //继承 ListActivity 的 onCreate方法     //以下是设置list里的适配器

setListAdapter(new SimpleAdapter(this,//新的简单适配器,运用了自己的上下文

(List<Map<String, ?>>)getData("org.cocos2d.tests"),//getData是个方法,getData(String)往下看有方法的声明

android.R.layout.simple_list_item_1, new String[]{"title"},

new int[]{android.R.id.text1}));

getListView().setTextFilterEnabled(true);//启用过滤窗口

}

protected List<?> getData(String prefix) {//即上述方法

List<Map<String,?>> myData = new ArrayList<Map<String,?>>();//一个用来盛放map的list,map立盛放String

Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);//意图指定跳到系统桌面

mainIntent.addCategory(Intent.CATEGORY_TEST);//供测试使用

PackageManager pm = getPackageManager();//包控制器,用来获得现在有的进程

List<ResolveInfo> list = pm.queryIntentActivities(mainIntent, 0);//通过Intent查找相关的Activity,更准确

if (null == list)//没找到那个测试意图

return myData;//就结束

/* 以下是个没有被使用的方法用来分割字符串,用/

String[] prefixPath;

if (prefix.equals("")) {

prefixPath = null;

} else {

prefixPath = prefix.split("/");

}*/

int len = list.size();//得到list的长度

// Map<String, Boolean> entries = new HashMap<String, Boolean>();//一个没有被使用的map,用了哈希类型的map

for (int i = 0; i < len; i++) {

ResolveInfo info = list.get(i);//用来循环刚才得到的那个list

String activityName = info.activityInfo.name;//得到activity的名字

if (prefix.length() == 0 || activityName.startsWith(prefix)) {//如果要查找的那个activity的包名长度为0或者与我们要找的那个名字是以这个开头的

String[] labelPath = activityName.split("\\.");//把包名用.分开

String nextLabel = labelPath[labelPath.length - 1];//得到最后一个.后面的名字,即类名

addItem(myData, nextLabel, activityIntent(//现在把他添加到mydata的集合,这个方法在后面会出现,就是分别把各种信息用map区分了

info.activityInfo.applicationInfo.packageName,

info.activityInfo.name));

}

}

Collections.sort(myData, sDisplayNameComparator);//Collections是个很有用的集合,其中有个sort是用来排序的,参数中sDisplayNameComparator是个比较方法

return myData;

}

//下面这个定义,乍一看是方法,其实是个字段,定义一个比较方法的引用

private final static Comparator<Map<String, ?>> sDisplayNameComparator = new Comparator<Map<String, ?>>() {//对那个引用的实现

private final Collator collator = Collator.getInstance();//新疆一个集合

public int compare(Map<String,?> map1, Map<String,?> map2) {//两个的比较规则

return collator.compare(map1.get("title"), map2.get("title"));//就是比较他们字符的那种方法,就是从左到右一个一个字母,比ascll码

}

};

protected Intent activityIntent(String pkg, String componentName) {

Intent result = new Intent();

result.setClassName(pkg, componentName);//设置意图从哪个包到哪个类

return result;

}

protected Intent browserIntent(String path) {

Intent result = new Intent();

result.setClass(this, Cocos2D.class);//设置从哪个class到哪

result.putExtra("org.cocos2d.tests.Path", path);//加一个额外的变量

return result;

}

protected void addItem(List<Map<String,?>> data, String name, Intent intent) {

Map<String, Object> temp = new HashMap<String, Object>();

temp.put("title", name);

temp.put("intent", intent);

data.add(temp);//对data添加项目

}

@Override

protected void onListItemClick(ListView l, View v, int position, long id) {

Map<String,?> map = (Map<String,?>) l.getItemAtPosition(position);//得到点击了哪个包

Intent intent = (Intent) map.get("intent");//找到那个类全名

startActivity(intent);//打开那个类

}

}

时间: 2024-10-12 18:50:52

Cocos2D-Android-1之源码详解:1.Cocos2D的相关文章

android自定义SlideMenu源码详解之最简单侧滑实现

实现原理:在一个Activity的布局中需要有两部分,一个是菜单(menu)的布局,一个是内容(content)的布局.两个布局横向排列,菜单布局在左,内容布局在右.初始化的时候将菜单布局向左偏移,以至于能够完全隐藏,这样内容布局就会完全显示在Activity中.然后通过监听手指滑动事件,来改变菜单布局的左偏移距离,从而控制菜单布局的显示和隐藏. 下来来实现这个效果: 1.打开layout下的activity_main.xml <LinearLayout xmlns:android="ht

Android编程之Fragment动画加载方法源码详解

上次谈到了Fragment动画加载的异常问题,今天再聊聊它的动画加载loadAnimation的实现源代码: Animation loadAnimation(Fragment fragment, int transit, boolean enter, int transitionStyle) { 接下来具体看一下里面的源码部分,我将一部分一部分的讲解,首先是: Animation animObj = fragment.onCreateAnimation(transit, enter, fragm

Android View 事件分发机制源码详解(View篇)

前言 在Android View 事件分发机制源码详解(ViewGroup篇)一文中,主要对ViewGroup#dispatchTouchEvent的源码做了相应的解析,其中说到在ViewGroup把事件传递给子View的时候,会调用子View的dispatchTouchEvent,这时分两种情况,如果子View也是一个ViewGroup那么再执行同样的流程继续把事件分发下去,即调用ViewGroup#dispatchTouchEvent:如果子View只是单纯的一个View,那么调用的是Vie

Android ArrayMap源码详解

尊重原创,转载请标明出处    http://blog.csdn.net/abcdef314159 分析源码之前先来介绍一下ArrayMap的存储结构,ArrayMap数据的存储不同于HashMap和SparseArray,在上一篇<Android SparseArray源码详解>中我们讲到SparseArray是以纯数组的形式存储的,一个数组存储的是key值一个数组存储的是value值,今天我们分析的ArrayMap和SparseArray有点类似,他也是以纯数组的形式存储,不过不同的是他的

IntentService源码详解

IntentService可以做什么: 如果你有一个任务,分成n个子任务,需要它们按照顺序完成.如果需要放到一个服务中完成,那么IntentService就会使最好的选择. IntentService是什么: IntentService是一个Service(看起来像废话,但是我第一眼看到这个名字,首先注意的是Intent啊.),所以如果自定义一个IntentService的话,一定要在AndroidManifest.xml里面声明. 从上面的"可以做什么"我们大概可以猜测一下Inten

butterknife源码详解

butterknife源码详解 作为Android开发者,大家肯定都知道大名鼎鼎的butterknife.它大大的提高了开发效率,虽然在很早之前就开始使用它了,但是只知道是通过注解的方式实现的,却一直没有仔细的学习下大牛的代码.最近在学习运行时注解,决定今天来系统的分析下butterknife的实现原理. 如果你之前不了解Annotation,那强烈建议你先看注解使用. 废多看图: 从图中可以很直观的看出它的module结构,以及使用示例代码. 它的目录和我们在注解使用这篇文章中介绍的一样,大体

Java concurrent AQS 源码详解

一.引言 AQS(同步阻塞队列)是concurrent包下锁机制实现的基础,相信大家在读完本篇博客后会对AQS框架有一个较为清晰的认识 这篇博客主要针对AbstractQueuedSynchronizer的源码进行分析,大致分为三个部分: 静态内部类Node的解析 重要常量以及字段的解析 重要方法的源码详解. 所有的分析仅基于个人的理解,若有不正之处,请谅解和批评指正,不胜感激!!! 二.Node解析 AQS在内部维护了一个同步阻塞队列,下面简称sync queue,该队列的元素即静态内部类No

深入Java基础(四)--哈希表(1)HashMap应用及源码详解

继续深入Java基础系列.今天是研究下哈希表,毕竟我们很多应用层的查找存储框架都是哈希作为它的根数据结构进行封装的嘛. 本系列: (1)深入Java基础(一)--基本数据类型及其包装类 (2)深入Java基础(二)--字符串家族 (3)深入Java基础(三)–集合(1)集合父类以及父接口源码及理解 (4)深入Java基础(三)–集合(2)ArrayList和其继承树源码解析以及其注意事项 文章结构:(1)哈希概述及HashMap应用:(2)HashMap源码分析:(3)再次总结关键点 一.哈希概

Spring IOC源码详解之容器依赖注入

Spring IOC源码详解之容器依赖注入 上一篇博客中介绍了IOC容器的初始化,通过源码分析大致了解了IOC容器初始化的一些知识,先简单回顾下上篇的内容 载入bean定义文件的过程,这个过程是通过BeanDefinitionReader来完成的,其中通过 loadBeanDefinition()来对定义文件进行解析和根据Spring定义的bean规则进行处理 - 事实上和Spring定义的bean规则相关的处理是在BeanDefinitionParserDelegate中完成的,完成这个处理需

Spring IOC源码详解之容器初始化

Spring IOC源码详解之容器初始化 上篇介绍了Spring IOC的大致体系类图,先来看一段简短的代码,使用IOC比较典型的代码 ClassPathResource res = new ClassPathResource("beans.xml"); DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDe