cocos2d-x官方自带的输入框,简直惨不忍睹,在ios还好,在安卓简直了。。用过的都知道。。。

所以为了用户体验,我们自己搞一个吧。输入框这种东西比较特殊,不像按钮、列表框之类的很容易实现,因为涉及到复制粘贴、操作虚拟键盘等,所以当然是用安卓原生的输入框最好了。

非常感谢我们的主程陈剑大哥,思路是陈剑大哥想的,我只负责记录一下。

本来代码50天前就写好了,但是绑定到js一直失败,恶心了好几天放弃了。前几天在用lua写点东西,把之前的代码拷过来试着绑定到lua,结果一次就成功了,完全没有踩坑,不知道说什么好了。。而且前几天官方发布了cocos2d-x 3.8版本,已经自带了,所以现在再发出来感觉毫无竞争力了呢。。。

使用原生控件的优点不用多说了,缺点当然也是有的。例如排版、布局、屏幕适配等,都要适应cocos2d的规则,而且由于是系统控件,渲染层级不受cocos2d的zorder的影响。当然这些努力一下也是可以解决的。

要注意的有:

1、c++通过jni控制java创建安卓控件。

2、c++持有java对象的引用,防止垃圾回收。

3、java回调c语言,c语言调用c++,所以需要处理好java对象与c++对象的对应关系。

我的做法是:

1、创建一个输入框工厂类,负责根据不同平台生成输入框,当然我只会安卓的。

2、工厂类维护一个map,保存c++对象和java对象的对应关系。

3、根据cocos2d的世界坐标系,更新安卓原生控件。

防止恶意转载还改名的恶心行为。本博客地址:http://www.cnblogs.com/wolfred7464/

上代码吧:

 #ifndef __CocosAndroidStudio__EditText__
#define __CocosAndroidStudio__EditText__ #include <string>
#include "cocos2d.h" class EditText : public cocos2d::Node {
public:
virtual ~EditText() {};
virtual void setString(const std::string& str) = ;
virtual std::string getString() = ; protected: }; #endif /* defined(__CocosAndroidStudio__EditText__) */

EditText.h

 #ifndef __CocosAndroidStudio__EditTextAndroid__
#define __CocosAndroidStudio__EditTextAndroid__ #include "EditText.h"
#include "platform/android/jni/JniHelper.h"
#include "EditTextFactory.h" class EditTextAndroid : public EditText {
public:
~EditTextAndroid(); virtual void setString(const std::string& str) override;
virtual std::string getString() override; virtual void setPosition(const cocos2d::Vec2& pos) override;
virtual void setContentSize(const cocos2d::Size& size) override; virtual void onEnter() override; friend class EditTextFactory; private:
EditTextAndroid();
static EditTextAndroid* create(); cocos2d::JniMethodInfo getJavaMethod(const char* name, const char* param);
void setPositionAndroid();
void setContentSizeAndroid(); jobject _object;
}; #endif /* defined(__CocosAndroidStudio__EditTextAndroid__) */

EditTextAndroid.h

 #include "EditTextAndroid.h"
#include "cocos2d.h"
#include <unistd.h>
#include <string> USING_NS_CC;
using namespace std; EditTextAndroid* EditTextAndroid::create() {
auto ret = new EditTextAndroid();
ret->autorelease();
return ret;
} EditTextAndroid::EditTextAndroid() {
auto env = cocos2d::JniHelper::getEnv(); jclass cls = env->FindClass("org/red/tools/RedEditText");
assert(cls != NULL); jmethodID ctor = env->GetMethodID(cls, "<init>", "()V");
assert(ctor != NULL); this->_object = env->NewObject(cls, ctor);
env->NewGlobalRef(this->_object);
} EditTextAndroid::~EditTextAndroid() {
auto env = cocos2d::JniHelper::getEnv();
env->DeleteGlobalRef(this->_object);
} JniMethodInfo EditTextAndroid::getJavaMethod(const char* name, const char* param) {
JniMethodInfo info;
bool isHave = JniHelper::getMethodInfo(info, "org/red/tools/RedEditText", name, param);
assert(isHave);
return info;
} void EditTextAndroid::setString(const std::string& str) {
auto info = getJavaMethod("setString", "(Ljava/lang/String;)V");
jstring jstr = info.env->NewStringUTF(str.c_str());
info.env->CallVoidMethod(this->_object, info.methodID, jstr);
} std::string EditTextAndroid::getString() {
auto info = getJavaMethod("getString", "()Ljava/lang/String;");
auto jstr = (jstring)info.env->CallObjectMethod(this->_object, info.methodID); jboolean isCopy;
auto chars = info.env->GetStringUTFChars(jstr, &isCopy);
std::string str(chars);
if(isCopy == JNI_TRUE) {
info.env->ReleaseStringUTFChars(jstr, chars);
}
info.env->DeleteLocalRef(jstr);
return str;
} void EditTextAndroid::setPosition(const Vec2& pos) {
EditText::setPosition(pos);
setPositionAndroid();
} void EditTextAndroid::setContentSize(const Size& size) {
EditText::setContentSize(size);
setContentSizeAndroid();
} void EditTextAndroid::setPositionAndroid() {
if(isRunning()) {
auto pos = convertToWorldSpace(Vec2(, getContentSize().height));
auto info = getJavaMethod("setPosition", "(II)V");
auto visHeight = Director::getInstance()->getVisibleSize().height;
info.env->CallVoidMethod(this->_object, info.methodID, jint(pos.x), jint(visHeight - pos.y));
}
} void EditTextAndroid::setContentSizeAndroid() {
if(isRunning()) {
auto realSize = SizeApplyAffineTransform(getContentSize(), getNodeToWorldAffineTransform());
auto info = getJavaMethod("setContentSize", "(II)V");
info.env->CallVoidMethod(this->_object, info.methodID, jint(realSize.width), jint(realSize.height));
}
} void EditTextAndroid::onEnter() {
EditText::onEnter();
setPositionAndroid();
setContentSizeAndroid();
} extern "C" {
JNIEXPORT void JNICALL Java_org_red_tools_RedEditText_nativeOnTextChanged(JNIEnv *env, jobject javaThis, jstring jstr) {
jboolean isCopy;
auto chars = env->GetStringUTFChars(jstr, &isCopy);
std::string str(chars);
if(isCopy == JNI_TRUE) {
env->ReleaseStringUTFChars(jstr, chars);
}
log("[Red] textChanged: %s", str.c_str());
}
}

EditTextAndroid.cpp

 #ifndef __CocosAndroidStudio__EditTextFactory__
#define __CocosAndroidStudio__EditTextFactory__ #include "EditText.h"
#include <map>
#include "platform/android/jni/JniHelper.h" class EditTextFactory {
public:
static EditTextFactory* getInstance(); EditText* createEditText();
EditText* getEditTextByJobject(jobject obj); private:
EditTextFactory(); std::map<jobject, EditText*> _map;
}; #endif /* defined(__CocosAndroidStudio__EditTextFactory__) */

EditTextFactory.h

 #include "EditTextFactory.h"
#include "EditTextAndroid.h"
#include <string>
#include "cocos2d.h" EditTextFactory::EditTextFactory() {} EditTextFactory* EditTextFactory::getInstance() {
static EditTextFactory instance;
return &instance;
} EditText* EditTextFactory::createEditText() {
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
auto edit = EditTextAndroid::create();
auto jobj = edit->_object;
_map.insert(std::pair<jobject, EditText*>(jobj, edit));
return edit;
#endif return nullptr;
} EditText* EditTextFactory::getEditTextByJobject(jobject obj) {
return _map[obj];
}

EditTextFactory.cpp

 package org.red.tools;

 import org.cocos2dx.lib.Cocos2dxActivity;

 import android.graphics.Color;
import android.os.Handler;
import android.os.Looper;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.FrameLayout; public class RedEditText { private EditText _edit; public RedEditText() {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
RedEditText.this._edit = new EditText(Cocos2dxActivity.getContext());
EditText edit = RedEditText.this._edit;
//edit.setBackgroundDrawable(null);
edit.setTextColor(Color.rgb(255, 255, 255));
edit.setMaxLines(1);
edit.setSingleLine();
edit.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI);
Cocos2dxActivity activity = (Cocos2dxActivity)(Cocos2dxActivity.getContext());
FrameLayout root = (FrameLayout)activity.findViewById(android.R.id.content).getRootView();
root.addView(edit); edit.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
nativeOnTextChanged(s.toString());
} @Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void afterTextChanged(Editable s) {}
});
}
});
} public void setString(final String str) {
Log.e("red", str);
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
_edit.setText(str);
}
});
} public String getString() {
return _edit.getText().toString();
} public void setContentSize(final int w, final int h) {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams)_edit.getLayoutParams();
params.width = w;
params.height = h;
_edit.setLayoutParams(params);
}
});
} public void setPosition(final int x, final int y) {
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams)_edit.getLayoutParams();
params.leftMargin = x;
params.topMargin = y;
_edit.setLayoutParams(params);
}
});
} private native void nativeOnTextChanged(String s); }

RedEditText.java

最后是luabinding,吐血推荐教程:http://www.cocos.com/doc/tutorial/show?id=1295

这是我绑定之后的代码,可以直接用:

 #include "base/ccConfig.h"
#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32
#ifndef __RedBindings_h__
#define __RedBindings_h__ #ifdef __cplusplus
extern "C" {
#endif
#include "tolua++.h"
#ifdef __cplusplus
}
#endif int register_all_RedBindings(lua_State* tolua_S); #endif // __RedBindings_h__
#endif //#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32

lua_RedBindings_auto.hpp

 #include "lua_RedBindings_auto.hpp"
#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_IOS || CC_TARGET_PLATFORM == CC_PLATFORM_MAC || CC_TARGET_PLATFORM == CC_PLATFORM_WIN32
#include "RedBindings.h"
#include "tolua_fix.h"
#include "LuaBasicConversions.h" int lua_RedBindings_EditText_setString(lua_State* tolua_S)
{
int argc = ;
EditText* cobj = nullptr;
bool ok = true; #if COCOS2D_DEBUG >= 1
tolua_Error tolua_err;
#endif #if COCOS2D_DEBUG >= 1
if (!tolua_isusertype(tolua_S,,"EditText",,&tolua_err)) goto tolua_lerror;
#endif cobj = (EditText*)tolua_tousertype(tolua_S,,); #if COCOS2D_DEBUG >= 1
if (!cobj)
{
tolua_error(tolua_S,"invalid 'cobj' in function 'lua_RedBindings_EditText_setString'", nullptr);
return ;
}
#endif argc = lua_gettop(tolua_S)-;
if (argc == )
{
std::string arg0; ok &= luaval_to_std_string(tolua_S, ,&arg0, "EditText:setString");
if(!ok)
{
tolua_error(tolua_S,"invalid arguments in function 'lua_RedBindings_EditText_setString'", nullptr);
return ;
}
cobj->setString(arg0);
lua_settop(tolua_S, );
return ;
}
luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "EditText:setString",argc, );
return ; #if COCOS2D_DEBUG >= 1
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'lua_RedBindings_EditText_setString'.",&tolua_err);
#endif return ;
}
int lua_RedBindings_EditText_getString(lua_State* tolua_S)
{
int argc = ;
EditText* cobj = nullptr;
bool ok = true; #if COCOS2D_DEBUG >= 1
tolua_Error tolua_err;
#endif #if COCOS2D_DEBUG >= 1
if (!tolua_isusertype(tolua_S,,"EditText",,&tolua_err)) goto tolua_lerror;
#endif cobj = (EditText*)tolua_tousertype(tolua_S,,); #if COCOS2D_DEBUG >= 1
if (!cobj)
{
tolua_error(tolua_S,"invalid 'cobj' in function 'lua_RedBindings_EditText_getString'", nullptr);
return ;
}
#endif argc = lua_gettop(tolua_S)-;
if (argc == )
{
if(!ok)
{
tolua_error(tolua_S,"invalid arguments in function 'lua_RedBindings_EditText_getString'", nullptr);
return ;
}
std::string ret = cobj->getString();
tolua_pushcppstring(tolua_S,ret);
return ;
}
luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "EditText:getString",argc, );
return ; #if COCOS2D_DEBUG >= 1
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'lua_RedBindings_EditText_getString'.",&tolua_err);
#endif return ;
}
static int lua_RedBindings_EditText_finalize(lua_State* tolua_S)
{
printf("luabindings: finalizing LUA object (EditText)");
return ;
} int lua_register_RedBindings_EditText(lua_State* tolua_S)
{
tolua_usertype(tolua_S,"EditText");
tolua_cclass(tolua_S,"EditText","EditText","cc.Node",nullptr); tolua_beginmodule(tolua_S,"EditText");
tolua_function(tolua_S,"setString",lua_RedBindings_EditText_setString);
tolua_function(tolua_S,"getString",lua_RedBindings_EditText_getString);
tolua_endmodule(tolua_S);
std::string typeName = typeid(EditText).name();
g_luaType[typeName] = "EditText";
g_typeCast["EditText"] = "EditText";
return ;
} int lua_RedBindings_EditTextFactory_getEditTextByJobject(lua_State* tolua_S)
{
int argc = ;
EditTextFactory* cobj = nullptr;
bool ok = true; #if COCOS2D_DEBUG >= 1
tolua_Error tolua_err;
#endif #if COCOS2D_DEBUG >= 1
if (!tolua_isusertype(tolua_S,,"EditTextFactory",,&tolua_err)) goto tolua_lerror;
#endif cobj = (EditTextFactory*)tolua_tousertype(tolua_S,,); #if COCOS2D_DEBUG >= 1
if (!cobj)
{
tolua_error(tolua_S,"invalid 'cobj' in function 'lua_RedBindings_EditTextFactory_getEditTextByJobject'", nullptr);
return ;
}
#endif argc = lua_gettop(tolua_S)-;
if (argc == )
{
_jobject* arg0; ok &= luaval_to_object<_jobject>(tolua_S, , "_jobject",&arg0, "EditTextFactory:getEditTextByJobject");
if(!ok)
{
tolua_error(tolua_S,"invalid arguments in function 'lua_RedBindings_EditTextFactory_getEditTextByJobject'", nullptr);
return ;
}
EditText* ret = cobj->getEditTextByJobject(arg0);
object_to_luaval<EditText>(tolua_S, "EditText",(EditText*)ret);
return ;
}
luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "EditTextFactory:getEditTextByJobject",argc, );
return ; #if COCOS2D_DEBUG >= 1
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'lua_RedBindings_EditTextFactory_getEditTextByJobject'.",&tolua_err);
#endif return ;
}
int lua_RedBindings_EditTextFactory_createEditText(lua_State* tolua_S)
{
int argc = ;
EditTextFactory* cobj = nullptr;
bool ok = true; #if COCOS2D_DEBUG >= 1
tolua_Error tolua_err;
#endif #if COCOS2D_DEBUG >= 1
if (!tolua_isusertype(tolua_S,,"EditTextFactory",,&tolua_err)) goto tolua_lerror;
#endif cobj = (EditTextFactory*)tolua_tousertype(tolua_S,,); #if COCOS2D_DEBUG >= 1
if (!cobj)
{
tolua_error(tolua_S,"invalid 'cobj' in function 'lua_RedBindings_EditTextFactory_createEditText'", nullptr);
return ;
}
#endif argc = lua_gettop(tolua_S)-;
if (argc == )
{
if(!ok)
{
tolua_error(tolua_S,"invalid arguments in function 'lua_RedBindings_EditTextFactory_createEditText'", nullptr);
return ;
}
EditText* ret = cobj->createEditText();
object_to_luaval<EditText>(tolua_S, "EditText",(EditText*)ret);
return ;
}
luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d \n", "EditTextFactory:createEditText",argc, );
return ; #if COCOS2D_DEBUG >= 1
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'lua_RedBindings_EditTextFactory_createEditText'.",&tolua_err);
#endif return ;
}
int lua_RedBindings_EditTextFactory_getInstance(lua_State* tolua_S)
{
int argc = ;
bool ok = true; #if COCOS2D_DEBUG >= 1
tolua_Error tolua_err;
#endif #if COCOS2D_DEBUG >= 1
if (!tolua_isusertable(tolua_S,,"EditTextFactory",,&tolua_err)) goto tolua_lerror;
#endif argc = lua_gettop(tolua_S) - ; if (argc == )
{
if(!ok)
{
tolua_error(tolua_S,"invalid arguments in function 'lua_RedBindings_EditTextFactory_getInstance'", nullptr);
return ;
}
EditTextFactory* ret = EditTextFactory::getInstance();
object_to_luaval<EditTextFactory>(tolua_S, "EditTextFactory",(EditTextFactory*)ret);
return ;
}
luaL_error(tolua_S, "%s has wrong number of arguments: %d, was expecting %d\n ", "EditTextFactory:getInstance",argc, );
return ;
#if COCOS2D_DEBUG >= 1
tolua_lerror:
tolua_error(tolua_S,"#ferror in function 'lua_RedBindings_EditTextFactory_getInstance'.",&tolua_err);
#endif
return ;
}
static int lua_RedBindings_EditTextFactory_finalize(lua_State* tolua_S)
{
printf("luabindings: finalizing LUA object (EditTextFactory)");
return ;
} int lua_register_RedBindings_EditTextFactory(lua_State* tolua_S)
{
tolua_usertype(tolua_S,"EditTextFactory");
tolua_cclass(tolua_S,"EditTextFactory","EditTextFactory","",nullptr); tolua_beginmodule(tolua_S,"EditTextFactory");
tolua_function(tolua_S,"getEditTextByJobject",lua_RedBindings_EditTextFactory_getEditTextByJobject);
tolua_function(tolua_S,"createEditText",lua_RedBindings_EditTextFactory_createEditText);
tolua_function(tolua_S,"getInstance", lua_RedBindings_EditTextFactory_getInstance);
tolua_endmodule(tolua_S);
std::string typeName = typeid(EditTextFactory).name();
g_luaType[typeName] = "EditTextFactory";
g_typeCast["EditTextFactory"] = "EditTextFactory";
return ;
} static int lua_RedBindings_EditTextAndroid_finalize(lua_State* tolua_S)
{
printf("luabindings: finalizing LUA object (EditTextAndroid)");
return ;
} int lua_register_RedBindings_EditTextAndroid(lua_State* tolua_S)
{
tolua_usertype(tolua_S,"EditTextAndroid");
tolua_cclass(tolua_S,"EditTextAndroid","EditTextAndroid","EditText",nullptr); tolua_beginmodule(tolua_S,"EditTextAndroid");
tolua_endmodule(tolua_S);
std::string typeName = typeid(EditTextAndroid).name();
g_luaType[typeName] = "EditTextAndroid";
g_typeCast["EditTextAndroid"] = "EditTextAndroid";
return ;
}
TOLUA_API int register_all_RedBindings(lua_State* tolua_S)
{
tolua_open(tolua_S); tolua_module(tolua_S,"red",);
tolua_beginmodule(tolua_S,"red"); lua_register_RedBindings_EditText(tolua_S);
lua_register_RedBindings_EditTextFactory(tolua_S);
lua_register_RedBindings_EditTextAndroid(tolua_S); tolua_endmodule(tolua_S);
return ;
} #endif

lua_RedBindings_auto.cpp

为cocos2d-x实现安卓输入框。非全屏,无dialog,绑定到lua的更多相关文章

  1. 微信非全屏播放设置(仅Iphone)

    由于微信X5内核强制视频全屏,用X5自带内核播放,一般内嵌视频打开播放就会被全屏. ihpone里面可以通过设置 x-webkit-airplay="true" webkit-pl ...

  2. IOS(苹果手机)使用video播放HLS流,实现在内部播放及全屏播放(即非全屏和全屏播放)。

    需求: 实现PC及移动端播放HLS流,并且可以自动播放,在页面内部播放及全屏播放功能. 初步:PC及安卓机使用hls.js实现hls流自动播放及全屏非全屏播放 首先使用了hls.js插件,可以实现在P ...

  3. OSG 初始化为非全屏窗口

    OSG默认的窗口时全屏的,调试的时候不方便. 在网上看到一段代码,可以非全屏显示 int _tmain(int argc, _TCHAR* argv[]){ osgViewer::Viewer vie ...

  4. android ActionBarActivity设置全屏无标题

    新建的Activity继承自ActionBarActivity,设置全屏无标题本来很简单的事,但是没想到app竟然无缘无故的挂,要么就是白屏一片,要么就是黑屏.坑了我一个多小时!!! 原因是Actio ...

  5. Android TV 全屏无标题

    想要全部窗口全屏无标题,修改 res\values\styles.xml 可设置主题和样式 <resources> <!-- Base application theme, depe ...

  6. ActionBarActivity设置全屏无标题

    新建的Activity继承自ActionBarActivity,设置全屏无标题本来非常easy的事,可是没想到app居然无缘无故的挂,要么就是白屏一片,要么就是黑屏.坑了我一个多小时.!! 原因是Ac ...

  7. 微信内置浏览器在使用video标签时(安卓)默认全屏的原因及解决办法

    根据X5论坛得到的答案是:设计如此. 腾讯真是越来越嚣张了,一家独大后用户体验都不注重了(不给程序员留活路). 听说有个申请加入vdeo白名单的,域名验证后就可以解决默认全屏(反正我是没见过申请入口, ...

  8. 自定义控件:抽屉SlidingDrawer——wrap_content非全屏

    android:allowSingleTap   指示抽屉是否可以打开/通过手柄上的一个水龙头关闭. android:animateOnClick  表示所述抽屉是否应该打开/与当用户点击手柄动画关闭 ...

  9. Java Swing JFrame实现全屏--无标题,无边框

    实现方式一: import java.awt.Dimension; import java.awt.Toolkit; import javax.swing.JFrame; public class T ...

随机推荐

  1. Linux下配置Node环境变量及问题详解

    这是之前在Linux下配置Node环境变量时踩过的坑,今天又有小伙伴询问这个问题,因此记录下来,不仅是给新童鞋们一些参考,也方便日后查阅 在这之前,相信都已经安装好了,没安装的可以查看博主另一篇文章 ...

  2. Linux系统上安装软件(JDK以及tomcat服务器)

    一:安装jdk linux系统上面如果运行java程序,就需要安装java的运行环境(jdk) 1:下载linux版本的jdk 地址:http://www.oracle.com/technetwork ...

  3. LeetCode 152

    Maximum Product Subarray Find the contiguous subarray within an array (containing at least one numbe ...

  4. [改善Java代码]强制声明泛型的实际类型

    Arrays工具类有一个方法asList可以把一个变长参数或数组变成列表,但是它有一个缺点:它所生成的List长度是不可改变的,而这在我们的项目开发中很不方便. import java.util.Ar ...

  5. 【贪心+一点小思路】Zoj - 3829 Known Notation

    借用别人一句话,还以为是个高贵的dp... ... 一打眼一看是波兰式的题,有点懵还以为要用后缀表达式或者dp以下什么什么的,比赛后半阶段才开始仔细研究这题发现贪心就能搞,奈何读错题了!!交换的时候可 ...

  6. poj 2446 二分图最大匹配

    思路:由(i+j)为偶数的点向(i+j)为奇数的点建边.求一次最大匹配,若正好为空格数(不包含洞)的一半,即输出YES. #include<iostream> #include<cs ...

  7. Linux 命令 - less: LESS IS MORE

    less 程序是为了替换早期 UNIX 中的 more 程序.less 这个名字是对短语 "less is more" 开了个玩笑,该短语是现代派建筑师和设计师们的座右铭. les ...

  8. Django学习--9 多对一关系模型

    保持前面的不变只是增加了一些 1.vim sdj/models.py class Blog(models.Model):        name = models.CharField(max_leng ...

  9. Android实现双进程守护 (转)

    做过android开发的人应该都知道应用会在系统资源匮乏的情况下被系统杀死!当后台的应用被系统回收之后,如何重新恢复它呢?网上对此问题有很多的讨论.这里先总结一下网上流传的各种解决方案,看看这些办法是 ...

  10. JAVA语法之小结

    对于JAVA的语法,我做了个小节: 类名:所有类名称首字母大写,如果由几个单词组成,那么组合内的第一个单词首字母应当大写,可以包括数字但是不能以数字开头. 方法名:方法没应当小写,如果由几个单词组成, ...