左轮

我是一把手枪

Android – ActionBar

ActionBar是在安卓3.0(API11)之后引入Android框架,如果想在3.0之前的版本使用,就得使用支持库去完成这个工作了。支持库支持2.1(API7)级以上版本。所以当我们引入类的时候聚需要主义,如果是在API11及以上版本可以直接引入Android框架中的ActionBar

1
import android.app.ActionBar

如果是在API7及以上版本,就需要引入支持库中的ActionBar

1
import android.support.v7.app.ActionBar

在API11以上的版本,当我们创建Activity的时候是默认自带ActionBar的,如果要在API7以上使用ActionBar的时候,Activity需要继承自ActionBarActivity,在代码中我们可以通过getSupportActionBar()获取ActionBar,如果需要隐藏ActionBar可以调用它的hide()方法。如果需要再次显示可以调用show()方法

1
2
3
ActionBar ab = getSupportActionBar();
ab.hide();
//ab.show();

当调用hide()方法的时候,系统会对界面布局进行调整,填充原来ActionBar的位置。

Android – Layout

LinearLayout

顾名思义,线性布局,其中的控件要么被竖向排列,要么被横向排列,排列方式是通过android:orientation属性来完成,这是一般应用中最常使用的一种布局文件,比如下边的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?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:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:orientation="vertical" >
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/to" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="@string/subject" />
    <EditText
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:gravity="top"
        android:hint="@string/message" />
    <Button
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:text="@string/send" />
</LinearLayout>

从上到下,一次排列了三个EditText和一个Button,具体使用可参考LinearLayout和参数LinearLayout.LayoutParams

Android IOS 推送

之前简单实现IOS本地消息推送的功能,但是这种方式太过死板,不能灵活应用,像游戏这种不定时开启活动,需要推送告知玩家的活动消息,这个变化性就比较大,一般游戏推送服务都需要和服务器端来配合完成,但是自己实现一套推送系统还是比较麻烦的,所以为了快速完成开发功能,好多游戏都是采用第三方推送系统。现在有好多优秀的第三方推送平台,有极光,个推,百度,小米的,每个平台都有自己的一些优势,可根据自己需求进行选择,这篇文章就学习总结接入极光推送平台到Android和IOS应用。

首先需要在“极光官网”注册帐号,下载SDK,这些都不用多说。下边开始动手

Android平台接入

极光的SDK还是做的很不错的,配置很简单,只需要简单的操作就可以完成,之前我也想试试个推来着,然后我看了下SDK接入文档后,毫不犹豫的选择了极光,哈哈,主要是简单啊。
这里我使用的SDK版本是:Jpush_Android_SDK_1.7.3
解压后有几个目录,doc下是文档,example是一个eclipse工程,可以直接跑,直接进行测试,libs下就是我们真正需要的库文件了,除此之外还有一个AndroidManifest.xml文件。因为比较简单,可以按照官方文档迅速进行配置,这里主要说下我在Android Studio中遇到的问题。

Android – Activity

Activity是应用程序的一个组件,它提供一个屏幕使用户可以与程序进行交互,像打电话,看微博,发邮件,浏览地图等其实都是在Activity中完成的,我们平时看到Android应用程序的界面,其实就是一个Activity。通常一个应用程序会含有多个Activity,像左右滑动切换界面,不同的功能界面等。其实就是从一个Activity切换的另一个Activity,新的Activity显示了,那么旧的Activity呢,它被压入了手机后台的一个栈中,栈具有后进先出的特性,所以当我们点击Back键的时候,程序就会从后台栈中取出上次压入的Activity。Activity在前台与后台之间切换的时候,会调用不同的回调函数,这就是Activity的生命周期了,我们可以在这些对应的函数中完成我们想要的操作。

创建Activity

当我们创建Activity的时候,必须继承自Activity或者它的子类。同时必须实现父类中的onCreate()方法。因为系统会调用改方法来创建Activity,在该方法中,我们应该对页面进行显示处理。还有其他一些生命周期方法,比如onStart()onStop()onResume()等可根据需要来自己实现。创建好Activity后,我们就需要对页面添加空间,使程序可以和用户进行交互。Android提供了大量的控件供程序使用,比如按钮,复选框,图片等。我们可以通过程序对这些控件进行布局管理,通常每个Activity我们都会配置一个对应的XML文件进行布局管理,然后通过程序进行调用响应事件处理。

Android – 再学android

新的征程,再学Android。

原来在学校的时候学习过一段时间Android开发,毕业找工作的时候也一直想找个Android的工作,可是后来阴差阳错的却做了cocos2d-x开发,虽然交叉编译有用到Android,但是毕竟不多,比起原来,现在Android已经变化很多,新的编辑器,新的版本,快速的Genymotion模拟器,再也不用一跑一下午了。所以想利用闲暇时间了重新学一下Android,在以后cocos2d-x开发中也能更得心应手。

这里会记录一下学习的笔记,也好做个备忘录,也方便以后查找。虽然现在大部分开发Android,以及cocos2d-x使用都是在eclipse进行的,但是学习还是会用Android Studio编辑器,毕竟这是以后的趋势。

今天下午同时配置了eclipse和Android Studio开发环境,同时也在window下同步了我的octopress博客方便记录,以前没在windows下搭建octopress,以为不行,因为看到官方文档都是在命令行下操作的,后来找到这篇文章(Windows7下,用Octopress在Github上搭建博客)轻松搞定,因为之前有在mac上搭建,所以直接从github上clone下来就好,稍微配置就可使用。其中ruby使用的是ruby1.9.3。下载地址。此文章就是在windows下写的。最后下载传说中的超快模拟器Genymotion,自己也安装后跑了一下,确实速度很快,再也不用提起模拟器就头疼了。

谨以此文记录Andorid的开始!

Cocos2d-x – ClippingNode

ClippingNode是一个用于剪切的类,例如在游戏新手引导中会指定特定点击区域就可以使用此类来做,或者在游戏滚动公告中,也可以使用此类来完成。
如下边这个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Size visibleSize = Director::getInstance()->getVisibleSize();
Vec2 origin = Director::getInstance()->getVisibleOrigin();
//文字
auto label = LabelTTF::create("这是一个美好的早上,我坐在窗前敲代码", "Arial", 20);
label->setPosition(Vec2(visibleSize.width/2, visibleSize.height/2));
label->setColor(Color3B(0, 255, 0));
this->addChild(label);
//遮罩形状及大小
auto stencil = LayerColor::create(Color4B(255, 255, 255, 255), 400, 50);
stencil->ignoreAnchorPointForPosition(false);
stencil->setAnchorPoint(Vec2(0.5, 0.5));
//剪切
auto clipping = ClippingNode::create();
clipping->setStencil(stencil);
clipping->setInverted(true);
clipping->set
clipping->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));
this->addChild(clipping);
//要剪切的内容,此处为一个背景
auto sprite = Sprite::create("HelloWorld.png");
clipping->addChild(sprite);

Cocos2d-x – 富文本RichText

cocos2d-x在3.X版本中增加了富文本控件,使得处理游戏中多颜色字体及图片方便很多,这篇文章就学习总结下富文本控件RichText。RichText继承自Widget类,每个具体节点由RichElement的子类RichElementText,RichElementImage,RichElementCustomNode来处理文字,图片和自定义节点。当我们生成好RichElement的子类时,将其添加到RichText中,来进行富文本显示,像下边这样显示两种颜色文字。

1
2
3
4
5
6
7
8
9
auto rich = RichText::create();
rich->setPosition(Vec2(visibleSize.width/2, visibleSize.height/2));
this->addChild(rich);

auto element1 = RichElementText::create(100, Color3B(0, 255, 123), 125, "Hello world", "Arial", 20);
rich->pushBackElement(element1);

auto element2 = RichElementText::create(101, Color3B(255, 0, 0), 255, "Hello cocos2d-x", "Arial", 20);
rich->pushBackElement(element2);

先来看看RichElement和它的几个子类。

IOS – 编译静态库

今天项目接第三方静态库被坑了一下,模拟器编译错误,真机编译通过,原来不懂,以为项目路径等问题,查了半天,没发现问题,后来才发现是第三方静态库的问题,被坑也叫坑,有坑赶紧填,填了就是路,上!
原来ios静态库分为两种,模拟器和真机的,两个静态是不一样的,原因在于模拟器用的是i386框架的,真机使用的arm6,arm7框架的,上边的坑就是这样埋下的。下边来从一个新的静态库工程开始,看看静态库的创建过程。

创建静态库工程

如下图开始创建静态库工程

IOS – 本地通知

为了提高用户的关注度,我们经常会推送一些新的内容给用户。ios中主要有两种推送,一种是远程通知,一种是本地通知,远程通知是和服务器端配合完成的,这里暂不说明,这篇文章主要说下本地通知。
本地通知是在ios4.0之后添加的,但是在ios8之后,在设置通知之前,需要先对通知进行注册,注册需要的通知类型,否则收不到响应类型的通知消息。

1
2
3
4
5
6
7
8
9
10
11
//ios8需要注册推送
if ([UIApplication instancesRespondToSelector:@selector(registerUserNotificationSettings:)]){
    //通知类型
    UIUserNotificationType types = UIUserNotificationTypeBadge |
    UIUserNotificationTypeSound | UIUserNotificationTypeAlert;
    //设置通知类型和动画
    UIUserNotificationSettings *mySettings =
    [UIUserNotificationSettings settingsForTypes:types categories:nil];
    //注册
    [[UIApplication sharedApplication] registerUserNotificationSettings:mySettings];
}

设计模式 – 单例

单例可以说是我们最常使用的一种设计模式了,它使得我们在调用过程中始终保持一个实例,用来进行全局调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//Singleton.h
#ifndef __Singleton__Singleton__
#define __Singleton__Singleton__

#include <stdio.h>
class Singleton{
private:
    Singleton();

public:
    static Singleton* getInstance();
};

#endif /* defined(__Singleton__Singleton__) */

//Singleton.cpp
#include "Singleton.h"

static Singleton *instance = nullptr;
Singleton::Singleton()
{
}
Singleton* Singleton::getInstance()
{
    if (instance == nullptr) {
        instance = new Singleton();
    }
    return instance;
}