(轉(zhuǎn))Android 系統(tǒng)中竖共,那些能大幅提高工作效率的 API 匯總(持續(xù)更新中...)

轉(zhuǎn)自:https://juejin.im/post/58c407ee44d90400698757d8

“條條大路通羅馬蝙叛。”工作中公给,實(shí)現(xiàn)某個(gè)需求的方式往往不是唯一的借帘,這些不同實(shí)現(xiàn)方式不僅表現(xiàn)在代碼質(zhì)量上,還影響著我們的工作效率淌铐。就像姻蚓,在 Android 系統(tǒng)中,總有那么一些鮮為人知的 API 能夠減少我們很多零碎的工作量匣沼。于是狰挡,就想憑著一些經(jīng)驗(yàn),整理一些常用的释涛,找個(gè)地方歸納總結(jié)加叁,也供日后翻閱。

getResources().getIdentifier(String name, String defType, String defPackage)

根據(jù)資源名稱(chēng)獲取資源 id唇撬。正常情況下它匕,我們會(huì)在代碼中直接根據(jù)資源ID獲取資源,比如:

getResources().getDrawable(R.drawable.ic_launcher);

但有時(shí)候窖认,資源并不是固定的豫柬,需要根據(jù)使用情況從多個(gè)同類(lèi)資源中動(dòng)態(tài)選擇告希,比如根據(jù)服務(wù)器傳遞給客戶(hù)端的接口數(shù)據(jù)動(dòng)態(tài)設(shè)置,怎么辦呢烧给?設(shè)置一個(gè)硬編碼的映射關(guān)系數(shù)組燕偶?太繁瑣!不妨用上這個(gè)方法础嫡。

一個(gè)完整的資源名為package:type/entry指么,對(duì)應(yīng)該方法的三個(gè)參數(shù):資源名稱(chēng)、資源類(lèi)型榴鼎、應(yīng)用包名伯诬。舉幾個(gè)例子:

imageView.setImageResource(getResources().getIdentifier("ic_launcher", "drawable", getPackageName()));
radioGroup.check(getResources().getIdentifier("rb_indicator_" + position, "id", getPackageName()));

實(shí)際使用過(guò)程中,第一個(gè)參數(shù) name巫财,也就是資源名稱(chēng)盗似,根據(jù)需要?jiǎng)討B(tài)設(shè)置,這就需要多個(gè)資源在命名時(shí)保持一定的規(guī)范格式平项。另外桥言,需要注意的是,直接通過(guò) id 獲取資源比通過(guò)名字的方式效率更高葵礼,所以,如果沒(méi)有這般特殊需求的話(huà)并鸵,不提倡使用這個(gè)方法獲取資源鸳粉。

TextUtils.isEmpty(CharSequence str)

使用頻率超高的字符串判空方法,返回一個(gè) boolean 值园担,內(nèi)部實(shí)現(xiàn)的判斷條件為:str == null || str.length() == 0届谈。備受開(kāi)發(fā)人員喜愛(ài)的一個(gè) if 字符串判斷,系統(tǒng)已經(jīng)幫我們封裝過(guò)弯汰。

Html.fromHtml()

解析 Html 格式的富文本內(nèi)容艰山,并返回一個(gè)帶樣式的字符串,供 TextView 等控件顯示咏闪∈锇幔可以解決一些含超鏈接、圖文混排等格式的富文本內(nèi)容的顯示問(wèn)題鸽嫂。

DateUtils.formatDateTime()

利用 Android SDK 提供的這個(gè)日期工具類(lèi)可以將 long 類(lèi)型的毫秒級(jí)時(shí)間數(shù)據(jù)格式化成特定顯示格式的字符串纵装。通常我們使用 Java SDK 中的 SimpleDateFormat 格式化日期數(shù)據(jù),比如 new SimpleDateFormat("yyyy-MM-dd HH:mm").format()据某,DateUtils 的作用就是替我們封裝了這個(gè)過(guò)程橡娄。格式化結(jié)果與當(dāng)前設(shè)備的本地語(yǔ)言環(huán)境有關(guān)。這里列舉幾個(gè)常用 format 格式(中文環(huán)境下):

  • FORMAT_SHOW_DATE:3月3日
  • FORMAT_SHOW_TIME:10:37
  • FORMAT_SHOW_WEEKDAY:星期五
  • FORMAT_SHOW_YEAR:2017年3月3日
  • FORMAT_NUMERIC_DATE:3/3
  • FORMAT_NO_MONTH_DAY:三月

Formatter.formatFileSize(Context context, long sizeBytes)

格式化文件大小癣籽,將字節(jié)數(shù)據(jù)格式化為 B挽唉、KB滤祖、M 等單位的相應(yīng)數(shù)據(jù)。context 參數(shù)用于判斷返回結(jié)果的字符串順序瓶籽,right-to-left 還是 left-to-right 形式的匠童。這個(gè)工具類(lèi)免去我們自己轉(zhuǎn)化計(jì)算的過(guò)程,非常方便棘劣,特別適用于應(yīng)用內(nèi)文件下載的類(lèi)似場(chǎng)景俏让。

TypedValue.applyDimension(int unit, float value, DisplayMetrics metrics)

將指定單位的尺寸數(shù)據(jù)按照當(dāng)前設(shè)備屏幕信息轉(zhuǎn)化為相應(yīng)的像素值。其中茬暇,TypedValue 為第一個(gè)參數(shù)提供了常用的單位值首昔,比如:

  • COMPLEX_UNIT_PX
  • COMPLEX_UNIT_DIP
  • COMPLEX_UNIT_PT
  • COMPLEX_UNIT_SP

源碼如下:

public static float applyDimension(int unit, float value, DisplayMetrics metrics){
    switch (unit) {
    case COMPLEX_UNIT_PX:
        return value;
    case COMPLEX_UNIT_DIP:
        return value * metrics.density;
    case COMPLEX_UNIT_SP:
        return value * metrics.scaledDensity;
    case COMPLEX_UNIT_PT:
        return value * metrics.xdpi * (1.0f/72);
    case COMPLEX_UNIT_IN:
        return value * metrics.xdpi;
    case COMPLEX_UNIT_MM:
        return value * metrics.xdpi * (1.0f/25.4f);
    }
    return 0;
}

其實(shí)在實(shí)際使用過(guò)程中,像素值都是 int 整數(shù)類(lèi)型糙俗,而該方法返回的是 float 類(lèi)型勒奇,如果直接強(qiáng)制轉(zhuǎn)換的話(huà),會(huì)自動(dòng)舍去小數(shù)部分巧骚。所以赊颠,如果不用該方法的話(huà),通常我們會(huì)這么轉(zhuǎn)換:

public static int convertDipToPx(Context context, int dip) {
    float scale = context.getResources().getDisplayMetrics().density;
    // 0.5f 用于向上取整
    return (int) (dip * scale + 0.5f * (dip >= 0 ? 1 : -1));
}

Space

官方注釋如下:

Space is a lightweight View subclass that may be used to create gaps between components in general purpose layouts.

Space 是一個(gè)用于創(chuàng)建視圖之間空隙的輕量級(jí) View劈彪。在 onDraw() 方法中不執(zhí)行任何繪制竣蹦,所以 android:background 屬性對(duì)他來(lái)說(shuō)不起作用。通常我們使用 View 創(chuàng)建視圖間的空隙沧奴,在不考慮背景色的情況下痘括,Space 其實(shí)效率更高。注意滔吠,由于是 API 14 引入的控件纲菌,如果需要向前兼容的話(huà),需要使用到 support v4 包疮绷。

view.performClick()

自動(dòng)調(diào)用 View 點(diǎn)擊事件翰舌。通常按鈕等控件只有在用戶(hù)點(diǎn)擊時(shí)才能觸發(fā)其點(diǎn)擊事件,該方法可以由某些特殊條件觸發(fā)模擬用戶(hù)點(diǎn)擊行為冬骚。類(lèi)似的還有 performLongClick() 方法椅贱。

Log.getStackTraceString(Throwable tr)

Log 類(lèi)提供的一個(gè)公共靜態(tài)方法,與常見(jiàn)的 Log.i() 等方法打印日志到 logcat 控制臺(tái)不同的是只冻,該方法從 Throwable 對(duì)象中獲取錯(cuò)誤信息夜涕,并以字符串的形式返回。當(dāng)你需要做錯(cuò)誤信息的數(shù)據(jù)持久化属愤,比如保存至本地存儲(chǔ)卡中或者上傳至服務(wù)器時(shí)女器,利用這個(gè)方法就非常方便。

Linkify.addLinks()

我們知道對(duì)于 TextView 文本控件中的內(nèi)容住诸,通過(guò) android:autoLink 屬性可以為其添加諸如 web驾胆、phone 等固定模版的超鏈接點(diǎn)擊事件涣澡。但畢竟系統(tǒng)模版有限,而利用 Linkify.addLinks() 方法可以添加一些應(yīng)用內(nèi)自定義模版丧诺,比如新浪微博中的 "@XXX" 格式的超鏈接跳轉(zhuǎn)等入桂,都可以通過(guò)自定義正則表達(dá)式來(lái)匹配處理。

getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE)

設(shè)置安全窗口驳阎,禁用系統(tǒng)截屏抗愁。防止 App 中的一些界面被截屏,并顯示在其他設(shè)備中造成信息泄漏呵晚。(常見(jiàn)手機(jī)設(shè)備系統(tǒng)截屏操作方式為:同時(shí)按下電源鍵和音量鍵蜘腌。)

比如支付寶 App 的“向商家付款”的包含付款二維碼的界面。(補(bǔ)充說(shuō)明一點(diǎn)饵隙,微信付款界面不是這么做的撮珠,采用的是在 onResume() 生命周期方法中實(shí)時(shí)刷新付款二維碼,與支付寶在安全方法采取的手段不同金矛。)

攔截 Back 鍵芯急,使 App 進(jìn)入后臺(tái)而不是關(guān)閉

  @Override
  public void onBackPressed() {
    Intent launcherIntent = new Intent(Intent.ACTION_MAIN);
    launcherIntent.addCategory(Intent.CATEGORY_HOME);
    startActivity(launcherIntent);
  }

使用 Back 鍵返回桌面,但不關(guān)閉當(dāng)前應(yīng)用驶俊,而是使之進(jìn)入后臺(tái)娶耍,就像按下 Home 鍵一樣。

這個(gè)技巧厲害了饼酿。通常為了防止出現(xiàn)用戶(hù)誤按 Back 鍵退出 App 的情況榕酒,我們會(huì)在應(yīng)用首頁(yè)的 Activity 中監(jiān)聽(tīng)返回鍵操作,使用 Toast 弱提示甚至 Dialog 強(qiáng)提示的方式給到用戶(hù)一個(gè)再次確認(rèn)的操作嗜湃,但無(wú)法阻止用戶(hù)通過(guò)返回鍵逐步關(guān)閉應(yīng)用。

然而澜掩,如果用這個(gè)方法攔截 App 最后一個(gè) Activity(常見(jiàn)為首頁(yè)界面)购披,既沒(méi)有阻礙用戶(hù)操作(回到桌面),又沒(méi)有關(guān)閉掉我們的應(yīng)用(后臺(tái)運(yùn)行中)肩榕,間接提高 App 的存活時(shí)間刚陡,真乃暗度陳倉(cāng)。并且據(jù)我實(shí)驗(yàn)株汉,微信筐乳、支付寶、微博等 App 都是這么做的乔妈,大家不妨一試蝙云。

ThumbnailUtils

縮略圖工具類(lèi),可以根據(jù)本地視頻文件源路召、Bitmap 對(duì)象生成縮略圖勃刨,常用的公共靜態(tài)方法為:

  • createVideoThumbnail(String filePath, int kind)
  • extractThumbnail(Bitmap source, int width, int height)

bitmap.extractAlpha()

從源 bitmap 中根據(jù) alpha 獲取一個(gè)新的 bitmap 對(duì)象波材。比較繞口,通常 App 中的 Icon 多數(shù)是純色透明像素背景組成身隐,利用這個(gè)方法可以對(duì)該圖的非透明區(qū)域著色廷区,有多種使用場(chǎng)景,常見(jiàn)如 Button 的 pressed 狀態(tài)贾铝,View 的陰影狀態(tài)等隙轻。舉個(gè)例子:

private static Bitmap getDropShadow(ImageView iv, Bitmap src, float radius, int color) {

    final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setColor(color);

    final int width = src.getWidth(), height = src.getHeight();
    final Bitmap dest = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    final Canvas canvas = new Canvas(dest);
    final Bitmap alpha = src.extractAlpha();
    canvas.drawBitmap(alpha, 0, 0, paint);

    final BlurMaskFilter filter = new BlurMaskFilter(radius, BlurMaskFilter.Blur.OUTER);
    paint.setMaskFilter(filter);
    canvas.drawBitmap(alpha, 0, 0, paint);
    iv.setImageBitmap(dest);

    return dest;
}

ArgbEvaluator

系統(tǒng)提供的一個(gè) TypeEvaluator ,我們只需要提供兩個(gè)起始顏色值和一個(gè)分值垢揩,系統(tǒng)會(huì)通過(guò)特定的算法計(jì)算得出一個(gè)新的顏色中間值玖绿。利用這個(gè)類(lèi),我們至少可以做兩件事情水孩。

第一镰矿,用于屬性動(dòng)畫(huà)中。由于其實(shí)現(xiàn)了 TypeEvaluator 接口俘种,可以用來(lái)做自定義屬性動(dòng)畫(huà)的求值器秤标,改變 View 的顯示狀態(tài)。比如:

int colorStart = ContextCompat.getColor(this, R.color.black);
int colorEnd = ContextCompat.getColor(this, R.color.green);
ValueAnimator valueAnimator = ValueAnimator
    .ofObject(new ArgbEvaluator(), colorStart, colorEnd)
    .setDuration(3000);
valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
        textView.setTextColor((Integer) animation.getAnimatedValue());
    }
});
valueAnimator.start();

第二宙刘,利用該類(lèi)提供的顏色求值算法苍姜,配合 ViewPager 提供的滑動(dòng)偏離值使用。這種場(chǎng)景常見(jiàn)于使用 ViewPager 實(shí)現(xiàn)的引導(dǎo)頁(yè)悬包,其背景色隨著滑動(dòng)距離動(dòng)態(tài)改變衙猪;使用 ViewPager 實(shí)現(xiàn)的 Tab 樣式菜單頁(yè)面,Tab 中文本內(nèi)容隨著滑動(dòng)距離動(dòng)態(tài)改變字體顏色(可以參考安卓版微信)布近。這兩種使用都使得 ViewPager 頁(yè)面切換過(guò)渡得很自然垫释,體驗(yàn)極佳。如:

viewPager.addOnPageChangeListener(new OnPageChangeListener() {
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        new ArgbEvaluator().evaluate(positionOffset, startColor, endColor);
    }

    @Override
    public void onPageSelected(int position) {

    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
});

另外撑瞧,關(guān)于顏色差值的計(jì)算棵譬,Google Sample 里有另一種算法,可參考 SlidingTabStrip.java 文件源碼预伺,核心方法內(nèi)容如下:


/**
* Blend {@code color1} and {@code color2} using the given ratio.
*
* @param ratio of which to blend. 1.0 will return {@code color1}, 0.5 will give an even blend,
*              0.0 will return {@code color2}.
*/
private static int blendColors(int color1, int color2, float ratio) {
    final float inverseRation = 1f - ratio;
    float r = (Color.red(color1) * ratio) + (Color.red(color2) * inverseRation);
    float g = (Color.green(color1) * ratio) + (Color.green(color2) * inverseRation);
    float b = (Color.blue(color1) * ratio) + (Color.blue(color2) * inverseRation);
    return Color.rgb((int) r, (int) g, (int) b);
}

android:weightSum

用于 LinearLayout 中订咸,用于設(shè)置 Children weight 的總比重。在 LinearLayout 的 children 中酬诀,我們經(jīng)常會(huì)使用 android:layout_weight 按比例分配容器布局的空間脏嚷,但有時(shí)候不一定會(huì)分完。以往瞒御,有些朋友可能會(huì)使用一個(gè)空 放在最后來(lái)達(dá)到末尾占位效果父叙。如果你知道這個(gè)屬性的話(huà),就能少寫(xiě)一些代碼。

android:descendantFocusability

用于 ViewGroup 中高每,解決作為 Parent 的 ViewGroup 與 Children View 之間的焦點(diǎn)占用問(wèn)題屿岂。最最常見(jiàn)的使用場(chǎng)景就是 list item 中含有一些點(diǎn)擊效果的控件,比如 Button鲸匿、CheckBox 等爷怀,相信大家都遇到過(guò)。取值有三種带欢,含義就不用再多說(shuō)了:

  • afterDescendants
  • beforeDescendants
  • blocksDescendants

android:duplicateParentState

是否將 View 自身的 drawable state 交給直接 parent ViewGroup 控制运授,值為 boolean 類(lèi)型。比如有一個(gè) item 布局乔煞,item 中有一個(gè) button吁朦,如果點(diǎn)擊 item layout 時(shí),需要 button 呈現(xiàn)對(duì)應(yīng)的點(diǎn)擊效果渡贾,就可以在 button 中用到這個(gè)屬性逗宜。不過(guò),從設(shè)計(jì)的角度來(lái)講空骚,這種場(chǎng)景還是比較少見(jiàn)的纺讲。知道有這個(gè)屬性就好,不推薦這種交互設(shè)計(jì)囤屹。

android:fillViewport

ScrollView 的一個(gè)屬性熬甚,用于設(shè)置內(nèi)容部分是否填滿(mǎn)屏幕,主要針對(duì)內(nèi)容不足以填滿(mǎn)屏幕的情況肋坚。這里推薦一個(gè)使用技巧乡括,參考我之前寫(xiě)的文章:Android 日常開(kāi)發(fā)中,兩個(gè)非常實(shí)用的布局技巧智厌。

android:adjustViewBounds

使用 ImageView 時(shí)诲泌,你可能會(huì)用 android:scaleType 屬性設(shè)置圖片縮放方式。殊不知铣鹏,android:adjustViewBounds 屬性也能起到類(lèi)似的效果敷扫。但要注意的是,后者需要至少指定 ImageView 寬高中的一個(gè)屬性吝沫,或者 maxHeight 之類(lèi)的呻澜,然后另一個(gè)屬性隨之適配递礼。這個(gè)屬性用在列表中較為合適惨险,比如 App 中的活動(dòng)列表頁(yè)面,圖片寬度設(shè)置為 match_parent脊髓,然后高度設(shè)為 wrap_content 使其自適應(yīng)辫愉,這樣便能保證從服務(wù)獲取的高分辨率圖片在不同的屏幕中不被拉伸變形。(備注:最好在項(xiàng)目資源文件中放置一個(gè)與網(wǎng)絡(luò)圖片相同尺寸的默認(rèn)圖将硝,起到 placeholder 作用恭朗,避免圖片顯示前高度為 0 的較差體驗(yàn)屏镊。)

持續(xù)更新中...

本文先記這么多吧,日積月累痰腮,后續(xù)持續(xù)更新中而芥,敬請(qǐng)關(guān)注...(當(dāng)然,你有什么高效而又少見(jiàn)的 API膀值,歡迎一起分享交流哦~)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末棍丐,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子沧踏,更是在濱河造成了極大的恐慌歌逢,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翘狱,死亡現(xiàn)場(chǎng)離奇詭異秘案,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)潦匈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)阱高,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人历等,你說(shuō)我怎么就攤上這事讨惩。” “怎么了寒屯?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵荐捻,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我寡夹,道長(zhǎng)处面,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任菩掏,我火速辦了婚禮魂角,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘智绸。我一直安慰自己野揪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布瞧栗。 她就那樣靜靜地躺著斯稳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪迹恐。 梳的紋絲不亂的頭發(fā)上挣惰,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼憎茂。 笑死珍语,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的竖幔。 我是一名探鬼主播板乙,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拳氢!你這毒婦竟也來(lái)了亡驰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤饿幅,失蹤者是張志新(化名)和其女友劉穎凡辱,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體栗恩,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡透乾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了磕秤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乳乌。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖市咆,靈堂內(nèi)的尸體忽然破棺而出汉操,到底是詐尸還是另有隱情,我是刑警寧澤蒙兰,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布磷瘤,位于F島的核電站,受9級(jí)特大地震影響搜变,放射性物質(zhì)發(fā)生泄漏采缚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一挠他、第九天 我趴在偏房一處隱蔽的房頂上張望扳抽。 院中可真熱鬧,春花似錦殖侵、人聲如沸贸呢。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)楞陷。三九已至,卻和暖如春朴沿,著一層夾襖步出監(jiān)牢的瞬間猜谚,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工赌渣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留魏铅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓坚芜,卻偏偏與公主長(zhǎng)得像览芳,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸿竖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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