- 浏览: 286930 次
- 性别:
- 来自: 北京
最新评论
-
肆无忌惮_:
多谢楼主分享
android内存泄露优化总结 -
wwwjiandan:
我用自定义Action为什么每次调用Activity时都提示找 ...
Activity之间的通信与自定义Action -
Zero颴:
写得好
android内存泄露优化总结 -
pigeon200461:
你好!请问你的这个项目里面是否使用sqlite3数据库。
android通过webview+jquery设计界面 -
ZHxin:
在activity中引入Fragment的xml方式确信能在低 ...
通过Compatibility Package低版本使用Fragment
前段时间做新浪微博,遇到个表情微博处理问题,查了些资料,做了个demo:
上图:
要实现这个效果要分为三步:
1.准备表情图片,并新建一个在values文件加下建数组资源文件: arrays.xml
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string-array name="default_smiley_texts">
<item >"[爱你]"</item>
<item >[机器人]</item>
<item >[拜拜]</item>
<item >"[抱抱]"</item>
<item >"[悲剧]"</item>
<item >"[悲伤]"</item>
<item >"[便便]"</item>
<item >"[鄙视]"</item>
<item >"[闭嘴]"</item>
<item >"[不要]"</item>
<item >"[馋嘴]"</item>
</string-array>
<string-array name="default_smiley_names">
<item >"爱你"</item>
<item >"机器人"</item>
<item>"拜拜"</item>
<item >"抱抱"</item>
<item >"悲剧"</item>
<item >"悲伤"</item>
<item >"便便"</item>
<item>"鄙视"</item>
<item >"闭嘴"</item>
<item>"不要"</item>
<item >"馋嘴"</item>
</string-array>
</resources>
2.到网上google一下SmileyParser 得到SmileyParser类(http://www.oschina.net/code/explore/android-2.2-froyo/com/android/mms/util/SmileyParser.java)根据需求修改下表情图片与特殊字符对应关系。
下面是我demo中使用的类:
package com.my;
import android.content.Context;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.ImageSpan;
//import com.android.mms.R;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* A class for annotating a CharSequence with spans to convert textual emoticons
* to graphical ones.
*/
public class SmileyParser {
// Singleton stuff
private static SmileyParser sInstance;
public static SmileyParser getInstance() { return sInstance; }
public static void init(Context context) {
sInstance = new SmileyParser(context);
}
private final Context mContext;
private final String[] mSmileyTexts;
private final Pattern mPattern;
private final HashMap<String, Integer> mSmileyToRes;
private SmileyParser(Context context) {
mContext = context;
mSmileyTexts = mContext.getResources().getStringArray(DEFAULT_SMILEY_TEXTS);
mSmileyToRes = buildSmileyToRes();
mPattern = buildPattern();
}
static class Smileys {
//表情图片集合
private static final int[] sIconIds = {
R.drawable.aini,
R.drawable.aoteman,
R.drawable.baibai,
R.drawable.baobao,
R.drawable.beiju,
R.drawable.beishang,
R.drawable.bianbian,
R.drawable.bishi,
R.drawable.bizui,
R.drawable.buyao,
R.drawable.chanzui,
};
//将图片映射为 文字
public static int aini = 0;
public static int aoteman = 1;
public static int baibai = 2;
public static int baobao = 3;
public static int beiju = 4;
public static int beishang = 5;
public static int bianbian = 6;
public static int bishi = 7;
public static int bizui = 8;
public static int buyao = 9;
public static int chanzui = 10;
//得到图片表情 根据id
public static int getSmileyResource(int which) {
return sIconIds[which];
}
}
// NOTE: if you change anything about this array, you must make the corresponding change
// to the string arrays: default_smiley_texts and default_smiley_names in res/values/arrays.xml
public static final int[] DEFAULT_SMILEY_RES_IDS = {
Smileys.getSmileyResource(Smileys.aini), // 0
Smileys.getSmileyResource(Smileys.aoteman), // 1
Smileys.getSmileyResource(Smileys.baibai), // 2
Smileys.getSmileyResource(Smileys.baobao), // 3
Smileys.getSmileyResource(Smileys.beiju), // 4
Smileys.getSmileyResource(Smileys.beishang), // 5
Smileys.getSmileyResource(Smileys.bianbian), // 6
Smileys.getSmileyResource(Smileys.bishi), // 7
Smileys.getSmileyResource(Smileys.bizui), // 8
Smileys.getSmileyResource(Smileys.buyao), // 9
Smileys.getSmileyResource(Smileys.chanzui), // 10
};
public static final int DEFAULT_SMILEY_TEXTS = R.array.default_smiley_texts;
public static final int DEFAULT_SMILEY_NAMES = R.array.default_smiley_names;
/**
* Builds the hashtable we use for mapping the string version
* of a smiley (e.g. ":-)") to a resource ID for the icon version.
*/
private HashMap<String, Integer> buildSmileyToRes() {
if (DEFAULT_SMILEY_RES_IDS.length != mSmileyTexts.length) {
// Throw an exception if someone updated DEFAULT_SMILEY_RES_IDS
// and failed to update arrays.xml
throw new IllegalStateException("Smiley resource ID/text mismatch");
}
HashMap<String, Integer> smileyToRes =
new HashMap<String, Integer>(mSmileyTexts.length);
for (int i = 0; i < mSmileyTexts.length; i++) {
smileyToRes.put(mSmileyTexts[i], DEFAULT_SMILEY_RES_IDS[i]);
}
return smileyToRes;
}
/**
* Builds the regular expression we use to find smileys in {@link #addSmileySpans}.
*/
//构建正则表达式
private Pattern buildPattern() {
// Set the StringBuilder capacity with the assumption that the average
// smiley is 3 characters long.
StringBuilder patternString = new StringBuilder(mSmileyTexts.length * 3);
// Build a regex that looks like (:-)|:-(|...), but escaping the smilies
// properly so they will be interpreted literally by the regex matcher.
patternString.append('(');
for (String s : mSmileyTexts) {
patternString.append(Pattern.quote(s));
patternString.append('|');
}
// Replace the extra '|' with a ')'
patternString.replace(patternString.length() - 1, patternString.length(), ")");
return Pattern.compile(patternString.toString());
}
/**
* Adds ImageSpans to a CharSequence that replace textual emoticons such
* as :-) with a graphical version.
*
* @param text A CharSequence possibly containing emoticons
* @return A CharSequence annotated with ImageSpans covering any
* recognized emoticons.
*/
//根据文本替换成图片
public CharSequence addSmileySpans(CharSequence text) {
SpannableStringBuilder builder = new SpannableStringBuilder(text);
Matcher matcher = mPattern.matcher(text);
while (matcher.find()) {
int resId = mSmileyToRes.get(matcher.group());
builder.setSpan(new ImageSpan(mContext, resId),
matcher.start(), matcher.end(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return builder;
}
}
3.SmileyParser类处理完之后就是使用了
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tvShow = (TextView) findViewById(R.id.tvShow);
TextView tvSource = (TextView) findViewById(R.id.tvSource);
------------------------SmileyParser类的使用
//构建处理对象
SmileyParser.init(this);
SmileyParser parser = SmileyParser.getInstance();
String text = "[鄙视]"+"+"+ "[爱你]"+"+"+"[便便]"+"+"+"[馋嘴]";
tvSource.setText("原文:"+text);
//通过 调用 SmileyParser类的 addSmileySpans()方法处理 文本
tvShow.setText(parser.addSmileySpans("SmileyParser类处理后:"+text));
}
发表评论
-
android内存泄露优化总结
2012-03-25 12:50 28182android手机给应用分配的 ... -
Android Market 链接的生成与分享
2012-02-21 11:59 5214通过Java包名直接定位到 ... -
android 事件处理过程
2011-12-16 14:37 1151转自:http://blog.sina.com.c ... -
【转】设置android程序平板下全屏
2011-12-13 11:11 3131【转自】http://blog.csdn.net/huoshe ... -
android 图片处理
2011-11-24 10:11 3294多张图片四个方位的图片合成,改变bitmap大小,图片去色等功 ... -
android 手机指令大全
2011-11-23 17:59 1*#*#4636#*#* 显示手机信息、电池信息、电池记录 ... -
Android-Activity Task 与 Intent Filter Flag
2011-11-17 10:47 4483接触 Android 以来,一直 ... -
ListView加载原理
2011-10-20 10:52 1344http://www.cnblogs.com/xiaowenj ... -
【转】SoftReference 和 WeakReference
2011-10-10 10:45 1601Java 和 Android 内存优化的两个类:SoftRef ... -
android异常处理发送消息给服务器
2011-10-08 18:45 3223转自:http://www.cnblogs.com/st ... -
通过Compatibility Package低版本使用Fragment
2011-09-26 16:47 4689android 3.0有很多新特性 其中有Fragmen ... -
PopupWindow+listItem 泡泡效果
2011-09-21 15:48 3976package com.my; import androi ... -
Notification使用
2011-09-20 18:52 2100代码:package com.my; import a ... -
ViewSwitcher,ImageSwitcher,TextSwitcher的使用
2011-09-19 14:45 3248ImageSwitcher用于图片的切换动画效果 TextS ... -
requestWindowFeature使用详解
2011-09-19 10:41 100252requestWindowFeature可以设置的值有: / ... -
ViewSwitcher的使用
2011-09-16 10:17 4634[Android]ViewSwitcher使用范例 作 ... -
通过createPackageContext 实现皮肤打包成apk的demo
2011-09-14 16:56 4816通过Context friendContext = ... -
android selector使用
2011-08-30 10:10 3360转自:http://blog.sina.com ... -
android shape的使用
2011-08-30 10:07 1208转自:http://dev.10086.cn/cmdn/wi ... -
android迅雷下载搭建开发环境
2011-07-13 10:57 2224附件中有图片 转自: ...
相关推荐
在Android应用开发中,QQ表情功能的实现是一个常见的需求,特别是在聊天、社交类的应用中。这一功能涉及到的主要知识点包括:表情解析、数据存储、UI设计以及网络通信。 首先,我们需要理解QQ表情的格式。QQ表情...
本教程将详细介绍如何利用Android的SQLite数据库来实现这一功能,参照Google和百度搜索的联想效果。 首先,我们需要创建一个SQLite数据库。在Android中,可以通过`SQLiteOpenHelper`类来实现数据库的创建和版本管理...
本教程将详细讲解如何利用Paint和Canvas在Android应用中实现在竖直方向上写字。 1. **Canvas与Paint基础** - **Canvas**:Canvas是Android中的画布,提供了各种绘制方法,如drawRect(), drawText()等,让我们能够...
在Android开发中,实现类似QQ和微信的表情功能是一项常见的需求,尤其在聊天、社交类应用中。本项目“Android仿QQ微信表情”旨在帮助开发者理解并实现这些平台的表情输入和展示机制。通过分析和学习该项目,我们可以...
本教程将详细讲解如何在Android项目中实现搜狗输入法的Emoji表情支持,以提升用户体验。我们将关注`EmojiEditText`和`EmojiTextView`这两个组件,它们是实现此功能的关键。 首先,`EmojiEditText`是EditText的扩展...
这是一个android版的beyond comparer, 它的功能是找出两个文本的最大共同子串,其算法思想是LCS, 但我利用Hirschberg 的动态规划算法将存储复杂度由O(n^2)改为O(n), 具体详情请参看我的博文: ...
在Android平台上实现emoji表情功能是移动应用开发中的一个重要环节,特别是在社交、聊天或者任何需要用户输入情感表达的应用中。本文将详细阐述如何在Android应用中集成和使用emoji表情,包括必要的技术点、步骤以及...
本项目"Android PHP JSON 实现登陆注册功能"就是针对这一需求,通过使用Android客户端和PHP服务端相结合,利用JSON作为数据交换格式,实现用户信息的存储和检索。 首先,Android客户端是用户界面,它负责收集用户...
本文将深入探讨如何实现Android应用中的NFC数据读取和写入功能,这对于开发移动应用或者对物联网感兴趣的爱好者来说是极具价值的知识。 首先,我们需要了解Android系统中的NFC框架。在Android中,NFC功能主要由`...
本文将深入探讨如何在Android应用中实现聊天表情功能,并介绍如何实现下拉刷新以加载更多聊天记录。 首先,我们要理解表情库的实现。在Android中,常见的表情库有Emojicon、EmojiCompat、Unicode等。这些库提供了...
本文将深入探讨如何利用SQLite来实现用户登录和注册功能。 首先,我们需要了解SQLiteOpenHelper这个抽象类。它是Android SDK提供的一种方便创建和管理SQLite数据库的工具类。我们通常会创建一个继承自...
在Android开发中,EditText是用于用户输入文本的基本组件。然而,为了提供更好的用户体验,开发者经常需要对其进行自定义,以满足特定需求。...同时,这也展示了如何利用Android的自定义视图机制来扩展系统组件的功能。
实现文本视图输入Gif动态表情功能,该项目实现了 Android EditText及TextView实现输入Gif动态表情,通过点击“选择表情”来选择一张图片后,该图片会在输入框中显示出来,具体的如效果图所示。
在Android开发中,表情文字(EmotionText)的实现是一个常见的需求,特别是在社交应用、聊天软件或者论坛等场景。本文将深入探讨如何在Android平台上处理和显示表情文字,包括基本概念、实现方式以及相关的技术难点...
另外,Android还提供了`Linkify`类,可以在文本中自动识别并链接URL、电话号码等。如果需要这样的功能,可以在设置文本后添加: ```java Linkify.addLinks(textView, Linkify.ALL); ``` 至于压缩包文件...
实现了从相机获取图片和相册获得图片裁剪上传到服务器
本示例将详细介绍如何利用ViewPager和GridView来实现这一功能。 首先,`ViewPager`是Android SDK中的一个强大组件,主要用于展示多个页面并允许用户通过滑动在这些页面之间切换。它通常用于实现类似轮播图或者tab...
下面将详细讲解如何利用`ViewPager`实现类微信的滑动效果,并介绍`setOnPageChangeListener`、`Fragment`、`Scroller`等相关知识点。 首先,`ViewPager`是`PagerAdapter`的容器,`PagerAdapter`负责管理和填充`...
在Android开发中,EditText是用户输入文本的常见组件,但有时我们不希望用户在输入框中输入 Emoji 表情符号。这是因为Emoji可能会引起数据处理问题,例如数据库存储、后端接口解析等。本文将详细讲解如何在Android中...