Android Studio 插件开发详解三:翻译插件实战
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78113868
本文出自【赵彦军的博客】
一:概述
如果不了解插件开发基础的同学可以先看,
Android Studio 插件开发详解一:入门练手
Android Studio 插件开发详解二:工具类
在上面的两篇文章,讲解了插件开发的基础,今天就来一个优点难度的项目,插件的名字叫 AndroidPluginTranslate , 顾名思义就是可以翻译文案的插件,废话不多说,先看最终效果图:
二、准备工作
1、环境变量配置及软件安装,这里省略,我在 Android Studio 插件开发详解一:入门练手 说的很清楚。
2、新建项目 AndroidPluginTranslate ,如下图所示:
三、编码
(1)关键知识
编码实际上核心的一个类叫做AnAction,可以直接选择NEW->Action,如下图:
然后填写一些相关信息
需要填写的属性如下:
- ActionID:代表该Action的唯一的ID,一般的格式为:pluginName.ID
- ClassName:类名
- Name:就是最终插件在菜单上的名称
- Description:对这个Action的描述信息
然后往下,选择这个Action即将存在的位置:
我们选择的是EditMenu,右侧选择为first,即EditMenu下的第一个,效果如图:
创建好 TranslateAction 后,它的代码很简单,如下:
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
public class TranslateAction extends AnAction {
@Override
public void actionPerformed(AnActionEvent e) {
// TODO: insert action logic here
}
}
当我们点击菜单的时候,就回触发actionPerformed()方法。
此外我们刚才填写的信息,也在plugin.xml中完成了注册,大家可以进去看一眼,actions的标签如下:
<idea-plugin>
<id>com.your.company.unique.plugin.id</id>
<name>Plugin display name here</name>
<version>1.0</version>
<vendor email="support@yourcompany.com" url="http://www.yourcompany.com">YourCompany</vendor>
<description><![CDATA[
Enter short description for your plugin here.<br>
<em>most HTML tags may be used</em>
]]></description>
<actions>
<action id="TranslateActionID" class="action.TranslateAction" text="Translate"
description="TranslateAction TranslateAction">
<add-to-group group-id="EditMenu" anchor="first"/>
<keyboard-shortcut keymap="$default" first-keystroke="ctrl Q"/>
</action>
</actions>
<idea-plugin>
这里大家一定要注意,要对 <id>
、<name>
、<version>
、 <vendor>
、 <description>
这几个标签要认真填写,其中 <id>
是这个插件的 id ,一定不能和市场上的其他插件一样;<description>
是描述这个插件的功能,尽可能的写的详细,否则在上架插件市场的的时候,会审核不过,白白浪费时间。
那么这么看,我们在这个方法中只要完成三件事:
- 获得当前选中的单词
- 调用相关API得到单词的意思
- 通过一个类似于PopupWindow来显示
(2)创建工具类
在 Android Studio 插件开发详解二:工具类 中介绍了三个工具类,分别是 http 工具类 HttpManager、json 解析工具类 JsonUtil 、日志打印工具类 Logger 。我们需要创建一个 util 包,然后把这三个类拷贝到我们的项目中。项目结构如下图所示:
有了这三个工具类就大大减轻了我们的开发任务。
(3) 获得当前选中的单词
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等到大家需要编写插件的时候,再详细学习就好了,现在就不要浪费精力记忆这些东西了。
上面的代码就是获得选中的文本,通过一个Editor,然后拿到SelectionModel,再拿到selectedText,从字面上还是蛮好理解的。
(4)调用相关API得到单词的意思
调用的 API 我们选择有道云的翻译 API
有道智云:http://ai.youdao.com/
有道智云API文档:http://ai.youdao.com/docs/doc-trans-api.s#p02
家如果想要做单词翻译,可以看下,非常简单, 不过这个API 现在是收费了,新注册的用户会有 100 元的体验金。
接口的调用这里不细说,官方有很详细的说明,另外本例子会上传至 Github , 还不清楚可以去我的Github 查看。我们根据返回的 json 字符串生成了一个类 TranslateBean;然后通过 Gson 转化为TranslateBean对象。
好了,有了返回的数据以后,直接通过一个类似popupWindow展现即可。
(5)通过一个类似于PopupWindow来显示
涉及到的代码:
/**
* 显示一个Popwindow
*
* @param editor
* @param result
*/
private void showPopupBalloon(final Editor editor, final String result) {
ApplicationManager.getApplication().invokeLater(new Runnable() {
public void run() {
LogUtil.thread();
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的源码,依然是不求记住,知道这有个类似的功能即可。
简单看一下,是通过创建一个JBPopupFactory,然后通过它创建一个HtmlTextBalloonBuilder,通过这个builder去设置各种参数,最后show。
ok,对于一个入门的例子,不要太强求对插件中这些API的掌握,还是那句话,等需要写了再去查,需要什么功能,哪怕到对应的插件中去copy源码都可以,当然也有文档:
有兴趣的可以整理各种类型的插件,比如弹出popupWindow,生成代码,生成文件类别的,然后对相关的API进行收集与整理。
四、插件部署
(1)、插件输出
Build --> Prepare Plugin Module... 生成插件。插件输出为 xxx.jar 包 或者 xxx.zip 包。
安装插件,这里就不讲了,在 Android Studio 插件开发详解一:入门练手 已经讲的很清楚了。
(2)插件演示
把插件安装在 Android Studio 后,重启 Android Studio ,就可以愉快的使用插件了
(3)插件上传到市场
插件上传到市场在这里就不讲了,详见 Android Studio 插件开发详解一:入门练手
五、总结
终于到了总结的环节,这么长的文章其实编写插件总结起来就几句话。
- 下载Intellij IDEA,新建一个Intellij IDEA plugin的项目
- 然后在里面new Action以及编写API
- 点击prepare plugin生成jar,这个jar就可以用来安装了。
恩,就是这么简单,实践起来会比较麻烦一点,等成功以后,回过头来总结,发现步骤其实就那么几个步骤~~对于实际的Action相关的API,等你在编写相关插件的时候,参考别的类似插件,查看官方文档都可以。
最后所有的代码都将上传至:https://github.com/zyj1609wz/AndroidPluginTranslate
参考资料
学会编写Android Studio插件 别停留在用的程度了
个人微信号:zhaoyanjun125 , 欢迎关注
Android Studio 插件开发详解三:翻译插件实战的更多相关文章
- Android Studio 插件开发详解四:填坑
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78265540 本文出自[赵彦军的博客] 在前面我介绍了插件开发的基本流程 [And ...
- Android Studio 插件开发详解二:工具类
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78112856 本文出自[赵彦军的博客] 在插件开发过程中,我们按照开发一个正式的项 ...
- Android Studio 插件开发详解一:入门练手
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/78112003 本文出自[赵彦军的博客] 一:概述 相信大家在使用Android S ...
- android studio 插件开发(自动生成框架代码插件)
android studio 插件开发 起因 去年公司开始上新项目,正好android在架构这方面的讨论也开始多了起来,于是mvp架构模型就进入我们技术选择方案里面,mvp有很多好处,但是有一个非常麻 ...
- Android WebView 开发详解(三)
转载请注明出处 http://blog.csdn.net/typename/article/details/40302351 powered by miechal zhao 概览 Android ...
- Android事件分发详解(三)——ViewGroup的dispatchTouchEvent()源码学习
package cc.aa; import android.os.Environment; import android.view.MotionEvent; import android.view.V ...
- Android清单文件详解(三)----应用程序的根节点<application>
<application>节点是AndroidManifest.xml文件中必须持有的一个节点,它包含在<manifest>节点下.通过<application>节 ...
- 【eclipse插件开发实战】 Eclipse插件开发6——eclipse在线翻译插件Translator开发实例详解
Eclipse插件开发6--eclipse在线翻译插件Translator开发实例详解 在上一篇文章中讲到了一个简单的eclipse插件开发实例,主要是对插件工程的基本创建步骤进行了讲解,这篇文章当中 ...
- Android 之窗口小部件详解(三) 部分转载
原文地址:http://blog.csdn.net/iefreer/article/details/4626274. (一) 应用程序窗口小部件App Widgets 应用程序窗口小部件(Widget ...
随机推荐
- 寻找第k元
要求:给定一个数组array[n],寻找大小排在第k的元素 思路一:最直接的思路就是先排序,这样可以直接通过数组下标找到第k大的元素,最好的快速排序时间复杂度为O(nlogn). 思路二:我们可以在快 ...
- 利用Dijkstra算法实现记录每个结点的所有最短路径
最近在做PAT时发现图论的一些题目需要对多条最短路径进行筛选,一个直接的解决办法是在发现最短路径的时候就进行判断,选出是否更换路径:另一个通用的方法是先把所有的最短路径记录下来,然后逐个判断.前者具有 ...
- TCP/IP入门(1) --链路层
/** 本博客由汗青ZJF整理并发布, 转载请注明出处: http://blog.csdn.net/zjf280441589/article/category/1854365 */ TCP/IP体系结 ...
- C++ Primer 有感(多重继承与虚继承)
1.多重继承的构造次序:基类构造函数按照基类构造函数在类派生列表中的出现次序调用,构造函数调用次序既不受构造函数初始化列表中出现的基类的影响,也不受基类在构造函数初始化列表中的出现次序的影响.2.在单 ...
- OC中的类别Category-协议Protocol-…
类别(category)--通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中.通常只在类别中定义方法. 类别,接口部分的定义,通常该文件命名为已有&quo ...
- PYTHON风格规范-Google 开源项目风格指南
Python风格规范 分号 Tip 不要在行尾加分号, 也不要用分号将两条命令放在同一行. 行长度 Tip 每行不超过80个字符 例外: 长的导入模块语句 注释里的URL 不要使用反斜杠连接行. Py ...
- 018-继承-OC笔记
学习目标 1.[掌握]Xcode开发文档 2.[掌握]static关键字 3.[掌握]self关键字 4.[掌握]继承 5.[掌握]NSObject 6.[掌握]访问修饰符 7.[掌握]私有实例变量和 ...
- [MSSQL]SQL Server里面导出SQL脚本(表数据的insert语句)(转)
最近需要导出一个表的数据并生成insert语句,发现SQL Server的自带工具并米有此功能.BAIDU一下得到如下方法(亲测OK) 用这个存储过程可以实现:CREATE PROCEDURE dbo ...
- 11_Eclipse中演示Git版本的创建,历史版本的修改,创建分支,合并历史版本和当前版本
1 执行以下案例: 某研发团队2011年初开发了一款名为Apollo的信息系统,目前已发布v1.0版本.此项目初期已有部分基础代码, 研发团队再此基础代码上经过3个月的努力发布了一个功能相对完备 ...
- Android中SQLiteOpenHelper类的onUpgrade方法浅谈
public abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int new Version) 这个方法在实现时需要重写. onUpg ...