React Native顯示點9圖片

1.背景

本文使用的RN(使用RN表示React Native)的版本為0.44版本。在應(yīng)用的開發(fā)過程射窒,可能會遇到這么一種場景霹崎,就是在圖片的拉伸過程中蕾各,需要保持部分區(qū)域不被拉伸,而部分區(qū)域需要進行拉伸袱箱。比如IM中聊天的背景氣泡等遏乔。那么這個時候我們就可能需要使用到點9圖片。那么在RN中发笔,該如何使用點9圖片呢盟萨?

2.RN上顯示點9圖片的思路

首先既然是圖片,那么在RN中肯定是需要在組件Image中進行顯示了讨,那么RN的Image可以同時支持Android和ios平臺的點9圖片的制作和顯示嗎捻激?我們?nèi)ス俜降腁pi文檔上找找看。在RN的文檔上我們看到了這樣的介紹

ios
capInsets {top: number, left: number, bottom: number, right: number}
當(dāng)圖片被縮放的時候前计,capInsets指定的角上的尺寸會被固定而不進行縮放胞谭,而中間和邊上其他的部分則會被拉伸。這在制作一些可變大小的圓角按鈕男杈、陰影丈屹、以及其它資源的時候非常有用(譯注:這就是常說的九宮格或者.9圖。了解更多信息伶棒,可以參見[蘋果官方文檔]

可以看到RN的Image組件是可以直接支持capInsets屬性旺垒,對我們需要的圖片進行對應(yīng)的拉伸操作,這與ios原生的使用是一樣的苞冯,那么在Android平臺上該如何使用呢袖牙?很遺憾,在RN上并沒有這方面的介紹舅锄。
??做過Android原生開發(fā)的可能知道鞭达,在Android平臺上是可以通過工具制作點9圖片司忱,然后作為背景圖片直接使用,那么按照這個思路畴蹭,我們可以在Android封裝對應(yīng)的組件坦仍,然后在Android平臺上要使用的時候就直接使用制作好的點9圖片,而在ios平臺上我們使用capInsets屬性叨襟。

3.React Native 9patch image

在這里繁扎,我們找到了一個封裝好的開源組件,Github地址:https://github.com/rusfearuth/react-native-9patch-image 我們來看下它在Android平臺下的封裝思路

public class RCTImageCapInsetManager extends SimpleViewManager<RCTImageCapInsetView> {
    @Override
    public String getName() {
        return "RCTImageCapInset";
    }

    @Override
    protected RCTImageCapInsetView createViewInstance(ThemedReactContext reactContext) {
        return new RCTImageCapInsetView(reactContext);
    }

    @ReactProp(name = "source")
    public void setSource(final RCTImageCapInsetView view, ReadableMap source) {
        String uri = source.getString("uri");
        view.setSource(uri);
    }
}

首先從source中獲取uri的地址糊闽,然后將其賦值給這里的RCTImageCapInsetView梳玫,而對于RCTImageCapInsetView

public class RCTImageCapInsetView extends ImageView {
    private String mUri;

    public RCTImageCapInsetView(Context context) {
        super(context);
    }

    public void setSource(String uri) {
        mUri = uri;
        reload();
    }

    public void reload() {
        Integer resId = null;
        if (getImageCache().has(mUri)) {
            resId = getImageCache().get(mUri);
            if (resId == null) {
                getImageCache().remove(mUri);
            }
        }

        if (resId == null) {
            resId = getResourceDrawableId(mUri);
            getImageCache().put(mUri, resId);
        }

        setBackgroundResource(resId);
    }

    private @NonNull Integer getResourceDrawableId(@NonNull final String aName) {
        if (aName == null || aName.isEmpty()) {
                return 0;
        }

        final String name = aName.toLowerCase().replace("-", "_");

        return getResources().getIdentifier(
                name,
                "drawable",
                getContext().getPackageName()
        );
    }

    private RCTImageCache getImageCache()
    {
        return RCTImageCache.getInstance();
    }
}

RCTImageCapInsetView的本質(zhì)是一個ImageView,獲取到uri的名稱右犹,然后在drawable之中查找到對應(yīng)的id名稱提澎,最后得到圖片資源作為ImageView背景,跟我們在Android原生上使用點9圖片的方式是一樣的念链。

4.制作點9圖片

4.1 Android平臺下制作

在這里我們用到的是Android上默認(rèn)的logo圖片

ic_launcher.png

??將其賦值到res/drawable目錄下盼忌,并將其改名為image.9.png,在android studio中雙擊打開它掂墓,選擇9-patch模式

image.png

??這個時候我們就可以直接在android studio直接進行點9圖片的制作谦纱,當(dāng)然我們也可以打開android sdk中提供的點9圖片制作工具進行制作,工具路徑為:/Users/hzl/Library/Android/sdk/tools/draw9patch 至于如何點9圖片的上下左右邊界代表的意思君编,這里不作過多的闡述跨嘉,可以通過百度,Google等去搜索相關(guān)的介紹啦粹。這樣Android平臺上的點9圖片就制作完成了偿荷。

4.2 ios平臺下制作

在上面我們制作了Android平臺下的點9圖片,那么在ios平臺上唠椭,對應(yīng)的capInsets屬性是多少呢跳纳?我們把鼠標(biāo)懸停在邊界上

image.png
image.png

可以看到Horizontal Patch:29-66px,那么對應(yīng)的capInsets屬性中的left和right就是29和29(95-66=29贪嫂,其中95是原始圖片的寬)寺庄,同理根據(jù)Vertical Patch:40-86px,可以知道capInsets屬性中的top和bottom就是40和9

5.RN上顯示點9圖片

在上面中我們制作好了對應(yīng)的點9圖片力崇,那么我們分別在Android和ios平臺上看下效果如果斗塘。

import React, {Component} from 'react';
import {View, Platform} from 'react-native';
import NinePatchView from 'react-native-9patch-image';

export default class Main extends Component {

    render() {
        return (
            <View style={{flex: 1, justifyContent: 'center', alignItems: 'center'}}>
                <NinePatchView
                    style={{width: 200, height: 200}}
                    source={Platform.OS === 'android' ? {uri: 'image'} : require('./image.png')}
                    capInsets={{top: 40, left: 29, bottom: 9, right: 29}}/>
            </View>)
    }
}

這里要特別注意的是Android平臺要使用Release版本的apk才可以看到效果,至于如何打包Android Release版本apk亮靴,可以去看下RN官方文檔上的介紹,http://reactnative.cn/docs/0.43/signed-apk-android.html#content

ios.png
android.png

??可以看到馍盟,兩個平臺上的顯示效果是一致的。

6.最后

文章中使用的例子已經(jīng)上傳了Github:https://github.com/hzl123456/NinePatchView

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茧吊,一起剝皮案震驚了整個濱河市贞岭,隨后出現(xiàn)的幾起案子八毯,更是在濱河造成了極大的恐慌,老刑警劉巖瞄桨,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件话速,死亡現(xiàn)場離奇詭異,居然都是意外死亡芯侥,警方通過查閱死者的電腦和手機泊交,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柱查,“玉大人廓俭,你說我怎么就攤上這事∥锔希” “怎么了白指?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長酵紫。 經(jīng)常有香客問我,道長错维,這世上最難降的妖魔是什么奖地? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮赋焕,結(jié)果婚禮上参歹,老公的妹妹穿的比我還像新娘。我一直安慰自己隆判,他們只是感情好犬庇,可當(dāng)我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侨嘀,像睡著了一般臭挽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咬腕,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天欢峰,我揣著相機與錄音,去河邊找鬼涨共。 笑死纽帖,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的举反。 我是一名探鬼主播懊直,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼火鼻!你這毒婦竟也來了室囊?” 一聲冷哼從身側(cè)響起雕崩,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎波俄,沒想到半個月后晨逝,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡懦铺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年捉貌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冬念。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡趁窃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出急前,到底是詐尸還是另有隱情醒陆,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布裆针,位于F島的核電站刨摩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏世吨。R本人自食惡果不足惜澡刹,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望耘婚。 院中可真熱鬧罢浇,春花似錦、人聲如沸沐祷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赖临。三九已至胞锰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間思杯,已是汗流浹背胜蛉。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留色乾,地道東北人誊册。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像暖璧,于是被迫代替她去往敵國和親案怯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,658評論 2 350

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,848評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫澎办、插件嘲碱、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評論 4 62
  • 放緩自己的前行腳步麦锯,欣賞路邊的風(fēng)景恕稠,平凡的過一輩子,一切安好扶欣,也是一道美好人生風(fēng)景線鹅巍。 這幾天有個新聞,刺痛了我的...
    太湖晨風(fēng)閱讀 396評論 0 2
  • 尋一朵月季料祠, 追一米陽光骆捧, 凝一瞬格局, 換一個微笑髓绽, 藏一臉喜悅敛苇。 細(xì)之微處, 話那款款情深顺呕, 返璞歸真枫攀。
    佛笑來人閱讀 142評論 6 20
  • 回校已快一個星期,又回到了放假前的狀態(tài)株茶,從以前上個廁所吃個飯都要人陪的我脓豪,慢慢獨來獨往,一個人去吃飯忌卤、健身館、圖書...
    小小海棠閱讀 124評論 0 0