一茁裙、概述
相信大家在使用Android Studio的時候,或多或少的會使用一些插件势誊,適當?shù)呐浜喜寮梢詭椭覀兲嵘欢ǖ拈_發(fā)效率呜达,更加快樂谣蠢。例如:
- https://github.com/zzz40500/GsonFormat 可以幫助我們從Gson轉化為實體類
- https://github.com/avast/android-butterknife-zelezny 可以幫助我們更加方便的使用butterknife
- https://github.com/Skykai521/ECTranslation 可以幫助在IDE里面完成英文->中文的翻譯
有句話叫做授人以魚不如授人以漁粟耻,不能一直跟隨著別人的腳步去使用插件了,有必要去學習編寫插件眉踱,當自己有好的創(chuàng)意的時候挤忙,就可以自己實現(xiàn)了。So谈喳,本文的內容是:
- 自己編寫一個Android Studio插件
ok册烈,其實編寫插件并不難,官方也有詳細的文檔婿禽,所以你也可以選擇直接閱讀下文學習:
為了文章有一定的流暢性赏僧,決定以ECTranslation作為編寫Android Studio插件的例子。
我為什么選這個呢扭倾?因為創(chuàng)意好淀零,實用并且代碼簡單。
貼一個今天這個插件的最終效果圖:
注:效果與ECTranslation基本一致膛壹,本文僅用作學習驾中,不造輪子,如果需要使用模聋,直接使用ECTranslation即可肩民。
二、準備工作
首先需要安裝IntelliJ IDEA
- 下載網(wǎng)址:https://www.jetbrains.com/idea/
下載好就可以了~~
然后安裝链方,運行,點擊create New Project:
按照上圖進行選擇,如果沒有SDK暂题,則點擊New新建一個即可薪者。
然后點擊Next,輸入項目名稱選擇位置,就可以點擊finish了取试。
項目的結構如下:
src目錄下主要用于存放我們編寫的代碼瞬浓。
這樣準備工作就結束了~~
三猿棉、編碼
(1) 關鍵知識
編碼實際上核心的一個類叫做AnAction萨赁,可以直接選擇NEW->Action杖爽,如下圖:
然后填寫一些相關信息:
需要填寫的屬性如下:
- ActionID:代表該Action的唯一的ID,一般的格式為:pluginName.ID
- ClassName:類名
- Name:就是最終插件在菜單上的名稱
- Description:對這個Action的描述信息
然后往下化焕,選擇這個Action即將存在的位置:
我們選擇的是EditMenu锣杂,右側選擇為first元莫,即EditMenu下的第一個踱蠢,效果如圖:
再往下就是制定快捷鍵了~~
都填寫完成就可以點擊OK了茎截。
點擊ok之后企锌,可以看到為我們生成了下類:
public class TranslateAction extends AnAction {
@Override
public void actionPerformed(AnActionEvent e) {
// TODO: insert action logic here
}
}
此外我們剛才填寫的信息撕攒,也在plugin.xml中完成了注冊,大家可以進去看一眼萍鲸,actions的標簽中脊阴,
當我們點擊菜單的時候嘿期,就回觸發(fā)actionPerformed()
方法秽五。
那么這么看饥悴,我們在這個方法中只要完成三件事:
- 獲得當前選中的單詞
- 調用相關API得到單詞的意思
- 通過一個類似于PopupWindow來顯示
當然西设,為了盡快的測試贷揽,你可以先在里面彈一個對話框禽绪,例如如下:
public void actionPerformed(AnActionEvent event) {
Messages.showMessageDialog("Hello World !", "Information", Messages.getInformationIcon());
}
預期效果是點擊Tranlate菜單印屁,或者按快捷鍵會彈出一個提示對話框雄人。
那么點擊Run:
然后它會默認啟動一個新的IntelliJ IDEA的界面础钠,你可以隨便新建一個項目旗吁,進入以后停局,你會發(fā)現(xiàn)Edit下多了一個Translate菜單,點擊即可彈出我們設定的對話框:
ok回还,測試通過就放心了~
- 獲得當前選中的單詞
- 調用相關API得到單詞的意思
- 通過一個類似于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相叁,如下圖:
在里面填寫id,name,version等虑润。荣病。。記得隨便填一下~
然后,點擊build->prepare plugin…,如下圖:
會在項目的根目錄生成一個jar霸奕,如圖:
這個jar就可以用于安裝了。
(2)安裝插件
打開Andorid Studio,選擇Preferences -> Plugins -> Install plugin from disk,選擇我們生成的jar即可在旱,如圖:
點擊安裝毡泻,然后重啟即可。
好了,重啟完成就可以在EDIT下看到Translate菜單了,選中單詞,點擊菜單或者快捷鍵都能實現(xiàn)翻譯了。
如果你有興趣,趕緊編寫一個插件自己玩吧。
當然犬性,還可以把我們的插件發(fā)布到倉庫验辞,支持在plugin中搜索安裝,參考:
就是注冊賬號醉拓,提交jar钻哩,填寫信息伦乔,等著審核就可以了。
五、總結
終于到了總結的環(huán)節(jié)瞪浸,這么長的文章其實編寫插件總結起來就幾句話蹈矮。
- 下載Intellij IDEA北滥,新建一個Intellij IDEA plugin的項目
- 然后在里面new Action以及編寫API
- 點擊prepare plugin生成jar再芋,這個jar就可以用來安裝了。
恩蓖谢,就是這么簡單腕够,實踐起來會比較麻煩一點,等成功以后建邓,回過頭來總結盈厘,發(fā)現(xiàn)步驟其實就那么幾個步驟~~對于實際的Action相關的API,等你在編寫相關插件的時候官边,參考別的類似插件沸手,查看官方文檔都可以。