IDEA插件開發(fā)

一茁裙、概述

相信大家在使用Android Studio的時候,或多或少的會使用一些插件势誊,適當?shù)呐浜喜寮梢詭椭覀兲嵘欢ǖ拈_發(fā)效率呜达,更加快樂谣蠢。例如:

有句話叫做授人以魚不如授人以漁粟耻,不能一直跟隨著別人的腳步去使用插件了,有必要去學習編寫插件眉踱,當自己有好的創(chuàng)意的時候挤忙,就可以自己實現(xiàn)了。So谈喳,本文的內容是:

  • 自己編寫一個Android Studio插件

ok册烈,其實編寫插件并不難,官方也有詳細的文檔婿禽,所以你也可以選擇直接閱讀下文學習:

為了文章有一定的流暢性赏僧,決定以ECTranslation作為編寫Android Studio插件的例子。

我為什么選這個呢扭倾?因為創(chuàng)意好淀零,實用并且代碼簡單。

貼一個今天這個插件的最終效果圖:

image

注:效果與ECTranslation基本一致膛壹,本文僅用作學習驾中,不造輪子,如果需要使用模聋,直接使用ECTranslation即可肩民。

二、準備工作

首先需要安裝IntelliJ IDEA

下載好就可以了~~

然后安裝链方,運行,點擊create New Project:

image

按照上圖進行選擇,如果沒有SDK暂题,則點擊New新建一個即可薪者。

然后點擊Next,輸入項目名稱選擇位置,就可以點擊finish了取试。

項目的結構如下:

image

src目錄下主要用于存放我們編寫的代碼瞬浓。

這樣準備工作就結束了~~

三猿棉、編碼

(1) 關鍵知識

編碼實際上核心的一個類叫做AnAction萨赁,可以直接選擇NEW->Action杖爽,如下圖:

image

然后填寫一些相關信息:

image

需要填寫的屬性如下:

  • ActionID:代表該Action的唯一的ID,一般的格式為:pluginName.ID
  • ClassName:類名
  • Name:就是最終插件在菜單上的名稱
  • Description:對這個Action的描述信息

然后往下化焕,選擇這個Action即將存在的位置:

我們選擇的是EditMenu锣杂,右側選擇為first元莫,即EditMenu下的第一個踱蠢,效果如圖:

image

再往下就是制定快捷鍵了~~

都填寫完成就可以點擊OK了茎截。

點擊ok之后企锌,可以看到為我們生成了下類:

public class TranslateAction extends AnAction {
    @Override
    public void actionPerformed(AnActionEvent e) {
        // TODO: insert action logic here
    }
}

此外我們剛才填寫的信息撕攒,也在plugin.xml中完成了注冊,大家可以進去看一眼萍鲸,actions的標簽中脊阴,

當我們點擊菜單的時候嘿期,就回觸發(fā)actionPerformed()方法秽五。

那么這么看饥悴,我們在這個方法中只要完成三件事:

  1. 獲得當前選中的單詞
  2. 調用相關API得到單詞的意思
  3. 通過一個類似于PopupWindow來顯示

當然西设,為了盡快的測試贷揽,你可以先在里面彈一個對話框禽绪,例如如下:

 public void actionPerformed(AnActionEvent event) {
        Messages.showMessageDialog("Hello World !", "Information", Messages.getInformationIcon());
    }

預期效果是點擊Tranlate菜單印屁,或者按快捷鍵會彈出一個提示對話框雄人。

那么點擊Run:

image

然后它會默認啟動一個新的IntelliJ IDEA的界面础钠,你可以隨便新建一個項目旗吁,進入以后停局,你會發(fā)現(xiàn)Edit下多了一個Translate菜單,點擊即可彈出我們設定的對話框:

image

ok回还,測試通過就放心了~

  1. 獲得當前選中的單詞
  2. 調用相關API得到單詞的意思
  3. 通過一個類似于PopupWindow來顯示

剩下的就是功能性的API了~

(2) 獲得當前選中的單詞

 @Override
public void actionPerformed(AnActionEvent e) {
    // TODO: insert action logic here
    final Editor mEditor = e.getData(PlatformDataKeys.EDITOR);
    if (null == mEditor) {
        return;
    }
    SelectionModel model = mEditor.getSelectionModel();
    final String selectedText = model.getSelectedText();
    if (TextUtils.isEmpty(selectedText)) {
        return;
    }
}

是不是覺得API很陌生柠硕,恩蝗柔,我也覺得很陌生癣丧,關于API這里介紹其實沒什么意義栈妆,本文主要目的是讓大家對自定義插件有個類helloworld的認識鳞尔,至于插件里面的代碼涉及到的API等到大家需要編寫插件的時候寥假,再詳細學習就好了糕韧,現(xiàn)在就不要浪費精力記憶這些東西了。

上面的代碼就是獲得選中的文本粪滤,通過一個Editor额衙,然后拿到SelectionModel怕吴,再拿到selectedText伟件,從字面上還是蠻好理解的斧账。

拿到選中的文本之后,應該就是去查詢該單詞的意思了嗓袱,查詢呢习绢,ECTranslation用的是youdao的Open SDK梧却,其實也很簡單败去,就是拼接一個url圆裕,然后等著解析返回數(shù)據(jù)就好了。

(3)調用相關API得到單詞的意思

有道API的地址:

大家如果想要做單詞翻譯搜锰,可以看下,非常簡單焊傅。

涉及到的代碼:

String baseUrl = "http://fanyi.youdao.com/openapi.do?keyfrom=Skykai521&key=977124034&type=data&doctype=json&version=1.1&q=";

HttpUtils.doGetAsyn(baseUrl + selectedText, new HttpUtils.CallBack() {
    public void onRequestComplete(String result) {
        Translation translation = gson.fromJson(result, Translation.class);
        showPopupBalloon(mEditor, translation.toString());
    }
});

HttpUtils就不貼了狐胎,就是直接開了個線程握巢,通過HttpUrlConnection去訪問網(wǎng)絡暴浦,大家的項目中或者通過搜索引擎歌焦,代碼一搜一堆独撇。

baseUrl就是有道的url躁锁,加上我們選中的單詞就是完整的url了,然后通過http訪問匣吊,callback回調出返回的字符串寸潦,這里返回的是json類型的字符串见转。

baseUri是:

我們根據(jù)返回的json字符串生成了一個類Translation吏砂;

然后通過Gson轉化為Translation對象狐血。

ps:拿著上面的baseUrl后面跟一個任何單詞匈织,直接訪問瀏覽器就能看到返回的json數(shù)據(jù)了牡直,這里大家天天寫接口乡小,類似的步驟比我肯定還熟悉饵史。

好了胳喷,有了返回的數(shù)據(jù)以后,直接通過一個類似popupWindow展現(xiàn)即可牵辣。

(4)通過一個類似于PopupWindow來顯示

涉及到的代碼:

private void showPopupBalloon(final Editor editor, final String result) {
    ApplicationManager.getApplication().invokeLater(new Runnable() {
        public void run() {
            JBPopupFactory factory = JBPopupFactory.getInstance();
            factory.createHtmlTextBalloonBuilder(result, null, new JBColor(new Color(186, 238, 186), new Color(73, 117, 73)), null)
                    .setFadeoutTime(5000)
                    .createBalloon()
                    .show(factory.guessBestPopupLocation(editor), Balloon.Position.below);
        }
    });
}

這個API择浊,恩逾条,我copy的源碼师脂,依然是不求記住吃警,知道這有個類似的功能即可拌消。

簡單看一下墩崩,是通過創(chuàng)建一個JBPopupFactory鹦筹,然后通過它創(chuàng)建一個HtmlTextBalloonBuilder,通過這個builder去設置各種參數(shù)址貌,最后show铐拐。

ok,對于一個入門的例子芳誓,不要太強求對插件中這些API的掌握余舶,還是那句話,等需要寫了再去查锹淌,需要什么功能,哪怕到對應的插件中去copy源碼都可以赠制,當然也有文檔:

有興趣的可以整理各種類型的插件赂摆,比如彈出popupWindow,生成代碼钟些,生成文件類別的,然后對相關的API進行收集與整理迫筑。

這樣代碼寫完了,先測試一下,點擊RUN,然后看效果~

我們這里肯定是測試沒問題的,效果圖就是開始的那個gif.

如果沒有問題,就可以去部署和發(fā)布我們的插件給別人去使用了。

這兩部也非常簡單。

四、部署插件

(1)填寫插件相關信息

打開項目文件的plugin.xml相叁,如下圖:

image

在里面填寫id,name,version等虑润。荣病。。記得隨便填一下~

然后,點擊build->prepare plugin…,如下圖:

image

會在項目的根目錄生成一個jar霸奕,如圖:

image

這個jar就可以用于安裝了。

(2)安裝插件

打開Andorid Studio,選擇Preferences -> Plugins -> Install plugin from disk,選擇我們生成的jar即可在旱,如圖:

image

點擊安裝毡泻,然后重啟即可。

好了,重啟完成就可以在EDIT下看到Translate菜單了,選中單詞,點擊菜單或者快捷鍵都能實現(xiàn)翻譯了。

如果你有興趣,趕緊編寫一個插件自己玩吧。

當然犬性,還可以把我們的插件發(fā)布到倉庫验辞,支持在plugin中搜索安裝,參考:

就是注冊賬號醉拓,提交jar钻哩,填寫信息伦乔,等著審核就可以了。

五、總結

終于到了總結的環(huán)節(jié)瞪浸,這么長的文章其實編寫插件總結起來就幾句話蹈矮。

  1. 下載Intellij IDEA北滥,新建一個Intellij IDEA plugin的項目
  2. 然后在里面new Action以及編寫API
  3. 點擊prepare plugin生成jar再芋,這個jar就可以用來安裝了。

恩蓖谢,就是這么簡單腕够,實踐起來會比較麻煩一點,等成功以后建邓,回過頭來總結盈厘,發(fā)現(xiàn)步驟其實就那么幾個步驟~~對于實際的Action相關的API,等你在編寫相關插件的時候官边,參考別的類似插件沸手,查看官方文檔都可以。

原文地址
本文出自:【張鴻洋的博客】

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末注簿,一起剝皮案震驚了整個濱河市契吉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诡渴,老刑警劉巖捐晶,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異妄辩,居然都是意外死亡惑灵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門眼耀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來英支,“玉大人,你說我怎么就攤上這事哮伟「苫ǎ” “怎么了妄帘?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長池凄。 經(jīng)常有香客問我抡驼,道長,這世上最難降的妖魔是什么修赞? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任婶恼,我火速辦了婚禮,結果婚禮上柏副,老公的妹妹穿的比我還像新娘。我一直安慰自己蚣录,他們只是感情好割择,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著萎河,像睡著了一般荔泳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上虐杯,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天玛歌,我揣著相機與錄音,去河邊找鬼擎椰。 笑死支子,一個胖子當著我的面吹牛,可吹牛的內容都是我干的达舒。 我是一名探鬼主播值朋,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼巩搏!你這毒婦竟也來了昨登?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤贯底,失蹤者是張志新(化名)和其女友劉穎丰辣,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體禽捆,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡笙什,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了睦擂。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片得湘。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖顿仇,靈堂內的尸體忽然破棺而出淘正,到底是詐尸還是另有隱情摆马,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布鸿吆,位于F島的核電站囤采,受9級特大地震影響,放射性物質發(fā)生泄漏惩淳。R本人自食惡果不足惜蕉毯,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望思犁。 院中可真熱鬧代虾,春花似錦、人聲如沸激蹲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽学辱。三九已至乘瓤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間策泣,已是汗流浹背衙傀。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留萨咕,地道東北人统抬。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像任洞,于是被迫代替她去往敵國和親蓄喇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內容