先看下效果

一 、布局

二、自定义控件

2.1  ClearEditText 带删除按钮的输入框

public class ClearEditText extends AppCompatEditText implementsOnFocusChangeListener, TextWatcher {/*** 删除按钮的引用*/

privateDrawable mClearDrawable;publicClearEditText(Context context) {this(context, null);

}publicClearEditText(Context context, AttributeSet attrs) {//这里构造方法也很重要,不加这个很多属性不能再XML里面定义

this(context, attrs, android.R.attr.editTextStyle);

}public ClearEditText(Context context, AttributeSet attrs, intdefStyle) {super(context, attrs, defStyle);

init();

}private voidinit() {//获取EditText的DrawableRight,假如没有设置我们就使用默认的图片

mClearDrawable = getCompoundDrawables()[2];if (mClearDrawable == null) {

mClearDrawable=getResources().getDrawable(R.drawable.emotionstore_progresscancelbtn);

}

mClearDrawable.setBounds(0, 0, mClearDrawable.getIntrinsicWidth(), mClearDrawable.getIntrinsicHeight());

setClearIconVisible(false);

setOnFocusChangeListener(this);

addTextChangedListener(this);

}@Overridepublic booleanonTouchEvent(MotionEvent event) {if (getCompoundDrawables()[2] != null) {if (event.getAction() ==MotionEvent.ACTION_UP) {boolean touchable = event.getX() > (getWidth() - getPaddingRight() -mClearDrawable.getIntrinsicWidth())&& (event.getX() < ((getWidth() -getPaddingRight())));if (touchable) { //选中了“删除”按钮

this.setText("");

}

}

}return super.onTouchEvent(event);

}/*** 当ClearEditText焦点发生变化的时候,判断里面字符串长度设置清除图标的显示与隐藏*/@Overridepublic void onFocusChange(View v, booleanhasFocus) {if(hasFocus) {

setClearIconVisible(getText().length()> 0);

}else{

setClearIconVisible(false);

}

}/*** 设置清除图标的显示与隐藏,调用setCompoundDrawables为EditText绘制上去

*

*@paramvisible*/

protected void setClearIconVisible(booleanvisible) {

Drawable right= visible ? mClearDrawable : null;

setCompoundDrawables(getCompoundDrawables()[0], getCompoundDrawables()[1], right, getCompoundDrawables()[3]);

}/*** 当输入框里面内容发生变化的时候回调的方法*/@Overridepublic void onTextChanged(CharSequence s, int start, int count, intafter) {

setClearIconVisible(s.length()> 0);

}

@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, intafter) {

}

@Overridepublic voidafterTextChanged(Editable s) {

}

}

2.2  SideBar 右侧首字母列表

/*** 右侧首字母列表bar

*@authorJack

*@version创建时间:2014-2-6 下午3:37:33*/

public class SideBar extendsView {/**触摸事件*/

privateOnTouchingLetterChangedListener onTouchingLetterChangedListener;/**26个字母*/

public static String[] characters = { "A", "B", "C", "D", "E", "F", "G","H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T","U", "V", "W", "X", "Y", "Z", "#"};private int ifSelected = -1; //选中

private Paint paint = newPaint();privateTextView mTextDialog;public voidsetTextView(TextView mTextDialog) {this.mTextDialog =mTextDialog;

}public SideBar(Context context, AttributeSet attrs, intdefStyle) {super(context, attrs, defStyle);

}publicSideBar(Context context, AttributeSet attrs) {super(context, attrs);

}publicSideBar(Context context) {super(context);

}/*** 重写这个方法*/

protected voidonDraw(Canvas canvas) {super.onDraw(canvas);//获取焦点改变背景颜色.

int height = getHeight(); //获取对应高度

int width = getWidth(); //获取对应宽度

int singleHeight = height / characters.length; //获取每一个字母的高度

for (int i = 0; i < characters.length; i++) {//设置颜色

paint.setColor(Color.rgb(33, 65, 98));//设置字体

paint.setTypeface(Typeface.DEFAULT_BOLD);//设置抗锯齿

paint.setAntiAlias(true);//设置字体大小

paint.setTextSize(20);//选中的状态

if (i ==ifSelected) {

paint.setColor(Color.parseColor("#3399ff"));

paint.setFakeBoldText(true);

}//x坐标等于中间-字符串宽度的一半.

float xPos = width / 2 - paint.measureText(characters[i]) / 2;float yPos = singleHeight * i +singleHeight;

canvas.drawText(characters[i], xPos, yPos, paint);

paint.reset();//重置画笔

}

}

@Overridepublic booleandispatchTouchEvent(MotionEvent event) {final int action =event.getAction();final float y = event.getY();//点击y坐标

final int oldSelected =ifSelected;final OnTouchingLetterChangedListener listener =onTouchingLetterChangedListener;final int selected = (int) (y / getHeight() * characters.length);//点击y坐标所占总高度的比例*b数组的长度就等于点击b中的个数.

switch(action) {caseMotionEvent.ACTION_UP:

setBackgroundDrawable(new ColorDrawable(0x00000000));

ifSelected= -1;//invalidate();if (mTextDialog != null) {

mTextDialog.setVisibility(View.INVISIBLE);

}break;default:

setBackgroundResource(R.drawable.sidebar_background);if (oldSelected !=selected) {if (selected >= 0 && selected

listener.onTouchingLetterChanged(characters[selected]);

}if (mTextDialog != null) {

mTextDialog.setText(characters[selected]);

mTextDialog.setVisibility(View.VISIBLE);

}

ifSelected=selected;

invalidate();

}

}break;

}return true;

}/*** 向外公开的方法

*@paramonTouchingLetterChangedListener*/

public voidsetOnTouchingLetterChangedListener(OnTouchingLetterChangedListener onTouchingLetterChangedListener) {this.onTouchingLetterChangedListener =onTouchingLetterChangedListener;

}/*** 触碰右侧列表时的回调接口*/

public interfaceOnTouchingLetterChangedListener {public voidonTouchingLetterChanged(String s);

}

三、事件处理

3.1 右侧字母栏滑动处理

sideBar =(SideBar) findViewById(R.id.sidrbar);

dialog=(TextView) findViewById(R.id.dialog);

sideBar.setTextView(dialog);//设置右侧触摸监听

sideBar.setOnTouchingLetterChangedListener(newSideBar.OnTouchingLetterChangedListener() {

@Overridepublic voidonTouchingLetterChanged(String s) {//该字母首次出现的位置

int position = adapter.getPositionForSection(s.charAt(0));if (position != -1) {

sortListView.setSelection(position);

}

}

});

3.2 输入框事件处理

//查询框设置监听

mClearEditText =(ClearEditText) findViewById(R.id.filter_edit);//根据输入框输入值的改变来过滤搜索

mClearEditText.addTextChangedListener(newTextWatcher() {

@Overridepublic void onTextChanged(CharSequence s, int start, intbefore,intcount) {//当输入框里面的值为空,更新为原来的列表,否则为过滤数据列表

filterData(s.toString());

}

@Overridepublic void beforeTextChanged(CharSequence s, int start, intcount,intafter) {

}

@Overridepublic voidafterTextChanged(Editable s) {

}

});

/*** 根据输入框中的值来过滤数据源,截取含有查询字符串的数据

*

*@paramfilterStr 查询字符串*/

private voidfilterData(String filterStr) {

List filterDataList = new ArrayList();if(TextUtils.isEmpty(filterStr)) {

filterDataList=sourceDataList;

}else{

filterDataList.clear();for(SortModel sortModel : sourceDataList) {

String name=sortModel.getName();/*if (name.indexOf(filterStr.toString()) != -1 || characterParser.getSelling(name).startsWith(filterStr.toString())) {

filterDataList.add(sortModel);

}*/

if (name.indexOf(filterStr.toString()) != -1 ||pinyin4JUtil.convertChineseToPinyin(name).startsWith(filterStr.toString())) {

filterDataList.add(sortModel);

}

}

}//根据a-z进行排序

Collections.sort(filterDataList, pinyinComparator);

adapter.updateListView(filterDataList);

}

四、汉字转拼音及多音字处理

4.1 初始化转换格式

/*** 获取拼音初始汉语拼音格式化实例

*

*@paramwithTone

*@return

*/

private HanyuPinyinOutputFormat getHanyuPinyinOutputFormat(booleanwithTone) {

HanyuPinyinOutputFormat format= newHanyuPinyinOutputFormat();if(withTone) {//直接用音标符

format.setToneType(HanyuPinyinToneType.WITH_TONE_MARK);//WITHOUT_TONE:无音标 (xing)//format.setToneType(HanyuPinyinToneType.WITH_TONE_NUMBER);//WITH_TONE_NUMBER:1-4数字表示英标 (xing2)//直接用ü (nü)

format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);//WITH_V:用v表示ü (nv)//WITH_U_AND_COLON:用”u:”表示ü (nu:)

format.setCaseType(HanyuPinyinCaseType.LOWERCASE);

}else{//直接用音标符

format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);

format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);

format.setCaseType(HanyuPinyinCaseType.UPPERCASE);

}returnformat;

}

setToneType 设置音标的显示方式:

HanyuPinyinToneType.WITH_TONE_MARK:在拼音字母上显示音标,如“zhòng”

HanyuPinyinToneType.WITH_TONE_NUMBER:在拼音字符串后面通过数字显示,如“zhong4”

HanyuPinyinToneType.WITHOUT_TONE:不显示音标

setCaseType 设置拼音大小写:

HanyuPinyinCaseType.LOWERCASE:返回的拼音为小写字母

HanyuPinyinCaseType.UPPERCASE:返回的拼音为大写字母

setVCharType 设置拼音字母“ü”的显示方式

汉语拼音中的“ü”不能简单的通过英文来表示,所以需要单独定义“ü”的显示格式

HanyuPinyinVCharType.WITH_U_UNICODE:默认的显示方式,输出“ü”

HanyuPinyinVCharType.WITH_V:输出“v”

HanyuPinyinVCharType.WITH_U_AND_COLON:输出“u:”

4.2 转换成汉语拼音

HanyuPinyinOutputFormat defaultFormat = getHanyuPinyinOutputFormat(false);

String[] results= PinyinHelper.toHanyuPinyinStringArray(ch, defaultFormat);//ch是要转化的汉字,用char表示。如'重'

如果results中拼音个数如果大于1说明该汉字是多音字

4.3 多音字处理

4.3.1 获取py4j.txt中的数据转换成map形式

private HashMapinitDictionary(Context context) {

String fileName= "py4j.txt";

InputStreamReader inputReader= null;

BufferedReader bufferedReader= null;

HashMap polyphoneMap = new HashMap();try{

inputReader= new InputStreamReader(context.getResources().getAssets().open(fileName), "UTF-8");

bufferedReader= newBufferedReader(inputReader);

String line= null;while ((line = bufferedReader.readLine()) != null) {//Log.d(TAG,"======"+line);

if (line != null) {

String[] arr= line.split("#");

String pinyin= arr[0];

String chinese= arr[1];if (chinese != null) {

String[] strs= chinese.split(" ");

List list =Arrays.asList(strs);

pinyinMap.put(pinyin, list);

}

}

}

}catch(IOException e) {

e.printStackTrace();

}finally{try{

bufferedReader.close();

}catch(IOException e) {

e.printStackTrace();

}

}return null;

}

将py4j.txt保存到assets目录通过context.getResources().getAssets().open(fileName)打开,存放到字符流中。

4.3.2 判断多音字并找到最优的拼音

{int len =results.length;if (len == 1) { //不是多音字

String[] pinyinArray = getHanyuStrings(true, ch);

pinyin.append(pinyinArray[0]);

}else if (results[0].equals(results[1])) { //非多音字 有多个音,取第一个//pinyin.append(results[0]);

String[] pinyinArray = getHanyuStrings(true, ch);

pinyin.append(pinyinArray[0]);

}else { //多音字

int length =chinese.length();boolean flag = false;

String s= null;

List keyList = null;for (int x = 0; x < len; x++) {

String py=results[x];

keyList=pinyinMap.get(py.toLowerCase());

resultPos=x;if (i + 3 <= length) { //后向匹配2个汉字 大西洋

s = chinese.substring(i, i + 3);if (keyList != null &&(keyList.contains(s))) {

flag= true;break;

}

}if (i + 2 <= length) { //后向匹配 1个汉字 大西

s = chinese.substring(i, i + 2);if (keyList != null &&(keyList.contains(s))) {

flag= true;break;

}

}if ((i - 2 >= 0) && (i + 1 <= length)) { //前向匹配2个汉字 龙固大

s = chinese.substring(i - 2, i + 1);if (keyList != null &&(keyList.contains(s))) {

flag= true;break;

}

}if ((i - 1 >= 0) && (i + 1 <= length)) { //前向匹配1个汉字 固大

s = chinese.substring(i - 1, i + 1);if (keyList != null &&(keyList.contains(s))) {

flag= true;break;

}

}if ((i - 1 >= 0) && (i + 2 <= length)) { //前向1个,后向1个 固大西

s = chinese.substring(i - 1, i + 2);if (keyList != null &&(keyList.contains(s))) {

flag= true;break;

}

}

}if (!flag) {//都没有找到,匹配默认的 读音 大

s =String.valueOf(ch);for (int x = 0; x < len; x++) {

String py=results[x];

keyList=pinyinMap.get(py.toLowerCase());if (keyList != null &&(keyList.contains(s))) {

String[] pinyinArray= getHanyuStrings(true, ch);

pinyin.append(pinyinArray[x]);break;

}

}

}else{

String[] pinyinArray= getHanyuStrings(true, ch);

pinyin.append(pinyinArray[resultPos]);

}

}

}

如果是多音字,则去匹配py4j.txt中的字符是否存在找到对应的多音字下标

String[] pinyinArray = getHanyuStrings(true, ch);

pinyin.append(pinyinArray[resultPos]);

...

private String[] getHanyuStrings(boolean withTone, char ch) {

HanyuPinyinOutputFormat format = getHanyuPinyinOutputFormat(withTone);

String[] pinyinArray = new String[0];

try {

pinyinArray = PinyinHelper.toHanyuPinyinStringArray(ch, format);

} catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) {

badHanyuPinyinOutputFormatCombination.printStackTrace();

}

return pinyinArray;

}

五、缺点

判断多音字存在缺陷,只能通过py4j.txt字库中查找,字库资源不完善。

https://github.com/MichealPan9999/chinesetopinyin

java 多音词语转拼音_py4j汉语转拼音多音字处理相关推荐

  1. java 多音词语转拼音_转多音_词语_成语_百度汉语

    (形声.从车,专声.转运要用车,故从车.本义:转运) 同本义(通过陆路运输) 转,运也.--<说文> 胡转予于恤?--<诗·小雅·祈父> 丁壮苦军旅,老弱罢转饷.--<汉 ...

  2. java将中文转换成拼音_java实现将汉语转换为拼音功能

    这几天在做项目的时候用到了通过拼音去数据库表里面去模糊查询汉语字段,刚开始的时候感觉特别神奇,查了好多资料,直接去模糊查询是能实现的,但是貌似很复杂.所以最终取了一个比较容易的方案,就是给数据库表里面 ...

  3. java实现将汉语转换为拼音

    这几天在做项目的时候用到了通过拼音去数据库表里面去模糊查询汉语字段,刚开始的时候感觉特别神奇,查了好多资料,直接去模糊查询是能实现的,但是貌似很复杂.所以最终取了一个比较容易的方案,就是给数据库表里面 ...

  4. Java语言汉语转换为拼音

    最近做东西需要将汉语转换为拼音,在网上正好有开源的包可以实现,下载地址:http://pinyin4j.sourceforge.net/.Mark一下,以后可能用得到,示例代码如下: import n ...

  5. java 修改wav文件头_使用Java聲音API從WAV文件中修剪開頭和結尾

    我有製作的基礎知識.但是,輸出文件一遍又一遍地重複WAV標頭字節.生成的文件大小合適,但是它與垃圾一起提交.使用Java聲音API從WAV文件中修剪開頭和結尾 我想使用一個擴展AudioInputSt ...

  6. 用C#写的汉语转拼音缩写的例子

    以前用C#写的一个汉语转拼音所写的例子,拿出来与大家共享下,呵呵,有什么好的改进,希望大家共同探讨:原文链接  1using System;  2using System.Data;  3using  ...

  7. iOS汉语转拼音以及按照拼音排序

    在iOS中汉语转拼音可以使用系统提供的方法,也可以使用第三方库来实现,但是网上说使用系统方法实现的话性能会比较差,此处只是提供方法,至于选择使用哪种方法,自己看情况而定. 1.系统方法 主要使用到了方 ...

  8. JAVA 编程专业词语解释~~映射

    JAVA 编程专业词语解释~~映射 话不多说,直接来... 映射最早发源于数学,映射是个术语,指两个元素的集之间元素相互"对应"的关系,为名词.映射,或者射影,在数学及相关的领域经 ...

  9. 转拼音的 php 类文件夹,基于PHP语言汉语转拼音类

    项目开发中,需要把汉字转换为拼音的需求很多,所以特意整理了一个类库,以便使用. (中华文化博大精深,难免有遗漏的汉字) /** * 基于PHP语言的汉语转拼音的类 * 兼容 UTF8.GBK.GB23 ...

  10. 通过Java程序将“/你的名字拼音缩写/input1/shixun1.txt”文件上传到HDFS的“/你的名字拼音缩写/java/input1/”目录下;通过Java程序将HDFS上的“/你的名字拼音

    题目: 通过Java程序将"/你的名字拼音缩写/input1/shixun1.txt"文件上传到HDFS的"/你的名字拼音缩写/java/input1/"目录下 ...

最新文章

  1. securecrt 自动登录的设置
  2. 10.1 国庆 考试
  3. iOS开发小知识之正则表达式的简单用法
  4. 23LC1024四线访问数据
  5. Ubuntu12.04配置LAMP 环境
  6. mxnet基础到提高(5)-- 卷积神经网络基础(1)
  7. java 技术点_Java的21个技术点和知识点归纳
  8. linux的nfs端口号,#Linux NFS服务 固定端口及防火墙配置#
  9. 【Matlab】模式识别——聚类算法集锦
  10. ASP.NET 1.1与ASP.NET 2.0 应用运行并存
  11. IntelliJ IDEA 2017.3-2018.1 全系列汉化包
  12. 张鹏程:7月24日阿里云上海峰会弹性计算大神
  13. CATIA二次开发—遍历结构树
  14. 微信小程序实现人脸识别认证
  15. emule电骡无法连网的原因和解决方法-更新服务器与kad节点
  16. 本地测试微信授权登录
  17. Hibernate Serach 5.9全文检索快速入门
  18. 文献 | 柳叶刀发文:虚拟现实的新用途之治疗场所恐惧症
  19. 虚拟摄像头之二: 配置v4l2loopback虚拟摄像头为前置或后置摄像头
  20. 爬取《悲伤逆流成河》猫眼信息 | 郭敬明五年电影最动人之作

热门文章

  1. PHP外包简易加密后门
  2. 下载堆糖图片-正则-xpath-BeautifulSoup-selenium-python爬虫
  3. Python学习笔记(01 Hello World的条件输出 02 数值运算)
  4. 腾讯魏巍:Eunomia云原生资源编排优化
  5. JavaScript中会打印出undefined的情况汇总
  6. Apollo Planning决策规划算法代码解析 (17):SPEED_HEURISTIC_OPTIMIZER 速度动态规划下
  7. 小牛叔讲Python第1章: 编程界的瑞士军刀Python
  8. win10安装atom的步骤
  9. MATLAB神经网络工具箱(代码简单实现)
  10. 信息流广告的发展前景!