Cocos2dx 調(diào)用原生鍵盤

原文:《為cocos2d-x實現(xiàn)安卓輸入框舍咖。非全屏矩父,無dialog,綁定到lua》
http://www.cnblogs.com/wolfred7464/p/4819377.html
https://www.bbsmax.com/A/Ae5R7nmmdQ/

cocos2d-x官方自帶的輸入框排霉,簡直慘不忍睹窍株,在ios還好,在安卓簡直了攻柠。球订。用過的都知道。辙诞。辙售。
所以為了用戶體驗,我們自己搞一個吧飞涂。輸入框這種東西比較特殊旦部,不像按鈕祈搜、列表框之類的很容易實現(xiàn),因為涉及到復(fù)制粘貼士八、操作虛擬鍵盤等容燕,所以當(dāng)然是用安卓原生的輸入框最好了。
非常感謝我們的主程陳劍大哥婚度,思路是陳劍大哥想的蘸秘,我只負責(zé)記錄一下。
本來代碼50天前就寫好了蝗茁,但是綁定到j(luò)s一直失敗醋虏,惡心了好幾天放棄了。前幾天在用lua寫點東西哮翘,把之前的代碼拷過來試著綁定到lua颈嚼,結(jié)果一次就成功了,完全沒有踩坑饭寺,不知道說什么好了阻课。。而且前幾天官方發(fā)布了cocos2d-x 3.8版本艰匙,已經(jīng)自帶了限煞,所以現(xiàn)在再發(fā)出來感覺毫無競爭力了呢。员凝。署驻。
使用原生控件的優(yōu)點不用多說了,缺點當(dāng)然也是有的健霹。例如排版硕舆、布局、屏幕適配等骤公,都要適應(yīng)cocos2d的規(guī)則抚官,而且由于是系統(tǒng)控件,渲染層級不受cocos2d的zorder的影響阶捆。當(dāng)然這些努力一下也是可以解決的凌节。
要注意的有:
1、c++通過jni控制java創(chuàng)建安卓控件洒试。
2倍奢、c++持有java對象的引用,防止垃圾回收垒棋。
3卒煞、java回調(diào)c語言,c語言調(diào)用c++叼架,所以需要處理好java對象與c++對象的對應(yīng)關(guān)系畔裕。
我的做法是:
1衣撬、創(chuàng)建一個輸入框工廠類,負責(zé)根據(jù)不同平臺生成輸入框扮饶,當(dāng)然我只會安卓的具练。
2、工廠類維護一個map甜无,保存c++對象和java對象的對應(yīng)關(guān)系扛点。
3、根據(jù)cocos2d的世界坐標(biāo)系岂丘,更新安卓原生控件陵究。
防止惡意轉(zhuǎn)載還改名的惡心行為。本博客地址:http://www.cnblogs.com/wolfred7464/
上代碼吧:

EditText.h

 #ifndef __CocosAndroidStudio__EditText__
 #define __CocosAndroidStudio__EditText__
 
 #include <string>
 #include "cocos2d.h"
 
 class EditText : public cocos2d::Node {
 public:
     virtual ~EditText() {};
     ;
     ;
 
 protected:
 
 };
 
 #endif /* defined(__CocosAndroidStudio__EditText__) */

EditTextAndroid.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.cpp

#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());
     }
 }

EditTextFactory.h

 #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.cpp

 #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];
 }

RedEditText.java

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);
 
 }

最后是luabinding奥帘,吐血推薦教程:http://www.cocos.com/doc/tutorial/show?id=1295
這是我綁定之后的代碼畔乙,可以直接用:
lua_RedBindings_auto.hpp

 #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.cpp

 #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)
 {
     ;
     EditText* cobj = nullptr;
     bool ok  = true;
 
 #if COCOS2D_DEBUG >= 1
     tolua_Error tolua_err;
 #endif
 
 #if COCOS2D_DEBUG >= 1
     ,,&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);
         ;
     }
 #endif
 
     argc = lua_gettop(tolua_S)-;
     )
     {
         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);
             ;
         }
         cobj->setString(arg0);
         lua_settop(tolua_S, );
         ;
     }
     luaL_error(tolua_S, );
     ;
 
 #if COCOS2D_DEBUG >= 1
     tolua_lerror:
     tolua_error(tolua_S,"#ferror in function 'lua_RedBindings_EditText_setString'.",&tolua_err);
 #endif
 
     ;
 }
 int lua_RedBindings_EditText_getString(lua_State* tolua_S)
 {
     ;
     EditText* cobj = nullptr;
     bool ok  = true;
 
 #if COCOS2D_DEBUG >= 1
     tolua_Error tolua_err;
 #endif
 
 #if COCOS2D_DEBUG >= 1
     ,,&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);
         ;
     }
 #endif
 
     argc = lua_gettop(tolua_S)-;
     )
     {
         if(!ok)
         {
             tolua_error(tolua_S,"invalid arguments in function 'lua_RedBindings_EditText_getString'", nullptr);
             ;
         }
         std::string ret = cobj->getString();
         tolua_pushcppstring(tolua_S,ret);
         ;
     }
     luaL_error(tolua_S, );
     ;
 
 #if COCOS2D_DEBUG >= 1
     tolua_lerror:
     tolua_error(tolua_S,"#ferror in function 'lua_RedBindings_EditText_getString'.",&tolua_err);
 #endif
 
     ;
 }
 static int lua_RedBindings_EditText_finalize(lua_State* tolua_S)
 {
     printf("luabindings: finalizing LUA object (EditText)");
     ;
 }
 
 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";
     ;
 }
 
 int lua_RedBindings_EditTextFactory_getEditTextByJobject(lua_State* tolua_S)
 {
     ;
     EditTextFactory* cobj = nullptr;
     bool ok  = true;
 
 #if COCOS2D_DEBUG >= 1
     tolua_Error tolua_err;
 #endif
 
 #if COCOS2D_DEBUG >= 1
     ,,&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);
         ;
     }
 #endif
 
     argc = lua_gettop(tolua_S)-;
     )
     {
         _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);
             ;
         }
         EditText* ret = cobj->getEditTextByJobject(arg0);
         object_to_luaval<EditText>(tolua_S, "EditText",(EditText*)ret);
         ;
     }
     luaL_error(tolua_S, );
     ;
 
 #if COCOS2D_DEBUG >= 1
     tolua_lerror:
     tolua_error(tolua_S,"#ferror in function 'lua_RedBindings_EditTextFactory_getEditTextByJobject'.",&tolua_err);
 #endif
 
     ;
 }
 int lua_RedBindings_EditTextFactory_createEditText(lua_State* tolua_S)
 {
     ;
     EditTextFactory* cobj = nullptr;
     bool ok  = true;
 
 #if COCOS2D_DEBUG >= 1
     tolua_Error tolua_err;
 #endif
 
 #if COCOS2D_DEBUG >= 1
     ,,&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);
         ;
     }
 #endif
 
     argc = lua_gettop(tolua_S)-;
     )
     {
         if(!ok)
         {
             tolua_error(tolua_S,"invalid arguments in function 'lua_RedBindings_EditTextFactory_createEditText'", nullptr);
             ;
         }
         EditText* ret = cobj->createEditText();
         object_to_luaval<EditText>(tolua_S, "EditText",(EditText*)ret);
         ;
     }
     luaL_error(tolua_S, );
     ;
 
 #if COCOS2D_DEBUG >= 1
     tolua_lerror:
     tolua_error(tolua_S,"#ferror in function 'lua_RedBindings_EditTextFactory_createEditText'.",&tolua_err);
 #endif
 
     ;
 }
 int lua_RedBindings_EditTextFactory_getInstance(lua_State* tolua_S)
 {
     ;
     bool ok  = true;
 
 #if COCOS2D_DEBUG >= 1
     tolua_Error tolua_err;
 #endif
 
 #if COCOS2D_DEBUG >= 1
     ,,&tolua_err)) goto tolua_lerror;
 #endif
 
     argc = lua_gettop(tolua_S) - ;
 
     )
     {
         if(!ok)
         {
             tolua_error(tolua_S,"invalid arguments in function 'lua_RedBindings_EditTextFactory_getInstance'", nullptr);
             ;
         }
         EditTextFactory* ret = EditTextFactory::getInstance();
         object_to_luaval<EditTextFactory>(tolua_S, "EditTextFactory",(EditTextFactory*)ret);
         ;
     }
     luaL_error(tolua_S, );
     ;
 #if COCOS2D_DEBUG >= 1
     tolua_lerror:
     tolua_error(tolua_S,"#ferror in function 'lua_RedBindings_EditTextFactory_getInstance'.",&tolua_err);
 #endif
     ;
 }
 static int lua_RedBindings_EditTextFactory_finalize(lua_State* tolua_S)
 {
     printf("luabindings: finalizing LUA object (EditTextFactory)");
     ;
 }
 
 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";
     ;
 }
 
 static int lua_RedBindings_EditTextAndroid_finalize(lua_State* tolua_S)
 {
     printf("luabindings: finalizing LUA object (EditTextAndroid)");
     ;
 }
 
 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";
     ;
 }
 TOLUA_API int register_all_RedBindings(lua_State* tolua_S)
 {
     tolua_open(tolua_S);
 
     tolua_module(tolua_S,);
     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);
     ;
 }
 
 #endif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市翩概,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌返咱,老刑警劉巖钥庇,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異咖摹,居然都是意外死亡评姨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門萤晴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吐句,“玉大人,你說我怎么就攤上這事店读∴率啵” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵屯断,是天一觀的道長文虏。 經(jīng)常有香客問我,道長殖演,這世上最難降的妖魔是什么氧秘? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮趴久,結(jié)果婚禮上丸相,老公的妹妹穿的比我還像新娘。我一直安慰自己彼棍,他們只是感情好灭忠,可當(dāng)我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布膳算。 她就那樣靜靜地躺著,像睡著了一般更舞。 火紅的嫁衣襯著肌膚如雪畦幢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天缆蝉,我揣著相機與錄音宇葱,去河邊找鬼。 笑死刊头,一個胖子當(dāng)著我的面吹牛黍瞧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播原杂,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼印颤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了穿肄?” 一聲冷哼從身側(cè)響起年局,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎咸产,沒想到半個月后矢否,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡脑溢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年僵朗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屑彻。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡验庙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出社牲,到底是詐尸還是另有隱情粪薛,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布搏恤,位于F島的核電站汗菜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏挑社。R本人自食惡果不足惜陨界,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望痛阻。 院中可真熱鬧菌瘪,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至录淡,卻和暖如春捌木,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嫉戚。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工刨裆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人彬檀。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓帆啃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親窍帝。 傳聞我的和親對象是個殘疾皇子努潘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,402評論 0 17
  • 《ilua》速成開發(fā)手冊3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 1...
    葉染柒丶閱讀 10,717評論 0 11
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,090評論 25 707
  • 基于google的官方文檔坤学,附帶一些自己的思考 服務(wù)(service) gRPC可以定義四種服務(wù) 簡單的reque...
    tom510230閱讀 3,773評論 0 2
  • ——火車站候車大廳疯坤,等待回家的車,看到來來往往的行人深浮,做此詩压怠。 站在候車大廳 看著來來往往的行人 時而歡聲笑語 時...
    清月流年閱讀 307評論 0 0