我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android中如何使用自带的emoji表情

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android中如何使用自带的emoji表情

本篇文章为大家展示了Android中如何使用自带的emoji表情,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

什么是emoji表情

emoji表情是一种表情符号,在代码中它现在其实是一组遵循Unicode的编码,即每一个表情符号都对应了一个Unicode编码。更进一步说,emoji表情实际上是一组Unicode编码与一组表情描述之间的对应。注意,这里所说的不是表情图片,而是表情描述。那么图片的实现是由谁来负责的呢?图片是由各个系统或者软件针对统一的表情描述来各自实现的,他们都遵循统一的Unicode编码规范。也就是说Unicode编码其所对应的表情描述是统一的,是所有人都要共同遵守的一套标准或者规范,而具体的表情图片则可能因平台的不同而产生差异。

首先你得先从网上收集一套emoji的Unicode编码,例如这个网站Emoji Unicode Tables
该网站上面给出了每个emoji表情的图片,描述,Unicode编码的对照表,点击表中每一项emoji可看到如下所示:

Android中如何使用自带的emoji表情

红色框框就是我们要的值.在java中的Unicode表示就是:”\ud83d\ude01”,该编码字符可以直接被Android的TextView和EditText控件识别成对应的emoji表情.

本次demo中展示了从 “\ud83d\ude00” - “\ud83c\udf7c”这216个emoji表情.

效果图如下:

Android中如何使用自带的emoji表情

关于emoji编码的存放和获取

由于有216个emoji编码字符串,因此我把它整理到一个json数组中,然后保存到assets目录下.
然后获取的话,通过如下代码方式获取:

public String[] getEmojis() { BufferedReader br = null; String emojis[] = null; try { InputStream is = mContext.getAssets().open("emoji.json"); StringBuffer sb = new StringBuffer(); br = new BufferedReader(new InputStreamReader(is)); String line = null; while (null != (line = br.readLine())) { sb.append(line).append("\r\n"); } JSONArray emojiArray = new JSONArray(sb.toString()); if (null != emojiArray && emojiArray.length() > 0) { emojis = new String[emojiArray.length()]; for (int i = 0; i < emojiArray.length(); i++) { emojis[i] = emojiArray.optString(i); } } } catch (Exception e) { e.printStackTrace(); } finally { if (null != br) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } return emojis;}

表情组设计

通过上面的效果图也可以看得出,216个emoji表情被分成了8组,每组27个emoji+1个删除按钮.
实现这个效果也很简单,就是通过ViewPager来展示每一组emoji,而每一组emoji里面又是一个GridView控件,里面的item就是一个个的TextView.

每一组emoji页面的创建代码如下:

public List<View> getPagerList() { List<View> pagers = null; String[] eachPageEmojis = null; if (null != mEmojis && mEmojis.length > 0) { pagers = new ArrayList<>(); int pageCount = mEmojis.length / 27;//共8页表情 for (int i = 0; i < pageCount; i++) { GridView gridView = new GridView(mContext); gridView.setNumColumns(7); gridView.setSelector(new ColorDrawable(Color.TRANSPARENT)); gridView.setCacheColorHint(Color.TRANSPARENT); gridView.setStretchMode(GridView.STRETCH_COLUMN_WIDTH); gridView.setGravity(Gravity.CENTER); eachPageEmojis = new String[28]; //总共216个表情字符,索引变化为:0-26,27-53,54-80,81-107,108-134,135-161,162-188,189-215 System.arraycopy(mEmojis, i * 27, eachPageEmojis, 0, 27); eachPageEmojis[27] = "del";//第28是删除按钮,用特殊字符串表示 gridView.setAdapter(new EmojiGvAdapter(mContext, eachPageEmojis)); //点击表情监听 gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //获取选中的表情字符 String emoji = (String) parent.getAdapter().getItem(position); if (null != mEmojiClickListener) { mEmojiClickListener.onClick(emoji); } } }); pagers.add(gridView); } } return pagers;}

MainActivity的布局和代码

主布局是一个垂直的线性布局,大体分2部分,表情面板和上面的视图界面

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <!--显示表情的TextView--> <TextView android:id="@+id/tv_info" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:padding="15dp" /> <!--表情,输入框,发送--> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <Button android:id="@+id/btn_emoji" android:layout_width="55dp" android:layout_height="wrap_content" android:text="表情"/> <EditText android:id="@+id/edt_msg" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1"/> <Button android:id="@+id/btn_send" android:layout_width="55dp" android:layout_height="wrap_content" android:text="发送"/> </LinearLayout> <!--表情面板--> <FrameLayout android:id="@+id/fl_emoji" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone" > <android.support.v4.view.ViewPager android:id="@+id/vp_emoji" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingTop="10dp" /> <LinearLayout android:id="@+id/ll_point" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:layout_marginBottom="10dp" android:gravity="center" android:orientation="horizontal"></LinearLayout> </FrameLayout></LinearLayout>

MainActivity代码如下:

public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private Button mEmojiBtn, mSendBtn;//表情按钮和发送按钮 private EditText mMsgEdt;//输入框 private TextView mInfoTv;//展示界面 private ViewPager mEmojiVp;//表情ViewPager private FrameLayout mEmojiFl;//表情面板 private LinearLayout mVpPointLl;//表情ViewPager指示器 //输入法和表情平滑切换的辅助类 private EmotionKeyboardSwitchHelper mEmotionKeyboardSwitchHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mEmotionKeyboardSwitchHelper = EmotionKeyboardSwitchHelper.with(this); initView(); initListener(); } private void initListener() { mSendBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mInfoTv.append(mMsgEdt.getText() + "\r\n"); mMsgEdt.setText(""); } }); mEmotionKeyboardSwitchHelper.bind(mInfoTv, mMsgEdt, mEmojiBtn, mEmojiFl); } private void initView() { mEmojiBtn = (Button) findViewById(R.id.btn_emoji); mSendBtn = (Button) findViewById(R.id.btn_send); mMsgEdt = (EditText) findViewById(R.id.edt_msg); mInfoTv = (TextView) findViewById(R.id.tv_info); mEmojiVp = (ViewPager) findViewById(R.id.vp_emoji); mEmojiFl = (FrameLayout) findViewById(R.id.fl_emoji); mVpPointLl = (LinearLayout) findViewById(R.id.ll_point); initViewPager(); }  private void initViewPager() { EmojiVpAdapter adapter = new EmojiVpAdapter(this); mEmojiVp.setAdapter(adapter); //表情点击监听 adapter.setOnEmojiClickListener(new EmojiVpAdapter.OnEmojiClickListener() { @Override public void onClick(String emoji) { if ("del".equals(emoji)) { //表示点击的是删除按钮 KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL); mMsgEdt.onKeyDown(KeyEvent.KEYCODE_DEL, event); } else { mMsgEdt.append(emoji); } } }); mEmojiVp.setCurrentItem(0); //关联指示器点 adapter.setupWithPagerPoint(mEmojiVp, mVpPointLl); } @Override public void onBackPressed() { if (mEmotionKeyboardSwitchHelper.onBackPress()) { super.onBackPressed(); } }}

emoji ViewPager

public class EmojiVpAdapter extends PagerAdapter { private Context mContext; private String[] mEmojis;//216个表情字符 private List<View> mPagers;//展示的页面 private OnEmojiClickListener mEmojiClickListener;//表情点击监听接口 public EmojiVpAdapter(Context ctx) { this.mContext = ctx; this.mEmojis = getEmojis(); this.mPagers = getPagerList(); } @Override public int getCount() { return null == mPagers ? 0 : mPagers.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) { View view = mPagers.get(position); if (null != view) { container.addView(view); } return view; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); }  public String[] getEmojis() { BufferedReader br = null; String emojis[] = null; try { InputStream is = mContext.getAssets().open("emoji.json"); StringBuffer sb = new StringBuffer(); br = new BufferedReader(new InputStreamReader(is)); String line = null; while (null != (line = br.readLine())) { sb.append(line).append("\r\n"); } JSONArray emojiArray = new JSONArray(sb.toString()); if (null != emojiArray && emojiArray.length() > 0) { emojis = new String[emojiArray.length()]; for (int i = 0; i < emojiArray.length(); i++) { emojis[i] = emojiArray.optString(i); } } } catch (Exception e) { e.printStackTrace(); } finally { if (null != br) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } return emojis; }  public List<View> getPagerList() { List<View> pagers = null; String[] eachPageEmojis = null; if (null != mEmojis && mEmojis.length > 0) { pagers = new ArrayList<>(); int pageCount = mEmojis.length / 27;//共8页表情 for (int i = 0; i < pageCount; i++) { GridView gridView = new GridView(mContext); gridView.setNumColumns(7); gridView.setSelector(new ColorDrawable(Color.TRANSPARENT)); gridView.setCacheColorHint(Color.TRANSPARENT); gridView.setStretchMode(GridView.STRETCH_COLUMN_WIDTH); gridView.setGravity(Gravity.CENTER); eachPageEmojis = new String[28]; //总共216个表情字符,索引变化为:0-26,27-53,54-80,81-107,108-134,135-161,162-188,189-215 System.arraycopy(mEmojis, i * 27, eachPageEmojis, 0, 27); eachPageEmojis[27] = "del";//第28是删除按钮,用特殊字符串表示 gridView.setAdapter(new EmojiGvAdapter(mContext, eachPageEmojis)); //点击表情监听 gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { //获取选中的表情字符 String emoji = (String) parent.getAdapter().getItem(position); if (null != mEmojiClickListener) { mEmojiClickListener.onClick(emoji); } } }); pagers.add(gridView); } } return pagers; }  public void setupWithPagerPoint(ViewPager viewPager, final LinearLayout pointLayout) { //初始表情指示器 int pageCount = getCount(); for (int i = 0; i < pageCount; i++) { ImageView point = new ImageView(mContext); point.setImageResource(R.drawable.shape_vp_dot_unselected); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(-2, -2); params.rightMargin = (int) mContext.getResources().getDimension(R.dimen.dp10); if (i == 0) { point.setImageResource(R.drawable.shape_vp_dot_selected); } pointLayout.addView(point, params); } viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { //切换指示器 if (null != pointLayout && pointLayout.getChildCount() > 0) { for (int i = 0; i < pointLayout.getChildCount(); i++) { ((ImageView) pointLayout.getChildAt(i)).setImageResource(R.drawable.shape_vp_dot_unselected); } ((ImageView) pointLayout.getChildAt(position)).setImageResource(R.drawable.shape_vp_dot_selected); } } @Override public void onPageScrollStateChanged(int state) { } }); }  public interface OnEmojiClickListener { void onClick(String emoji); } public void setOnEmojiClickListener(OnEmojiClickListener l) { this.mEmojiClickListener = l; }}

emoji GridView

public class EmojiGvAdapter extends BaseAdapter { private Context mContext; private String[] mEmojis; public EmojiGvAdapter(Context context, String[] eachPageEmojis) { this.mContext = context; this.mEmojis = eachPageEmojis; } @Override public int getCount() { return null == mEmojis ? 0 : mEmojis.length; } @Override public String getItem(int position) { return null == mEmojis ? "" : mEmojis[position]; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = null; if (null == convertView) { holder = new ViewHolder(); convertView = View.inflate(mContext, R.layout.item_emoji, null); holder.emojiTv = (TextView) convertView.findViewById(R.id.tv_emoji); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } if (position == 27) { //第28个显示删除按钮 holder.emojiTv.setBackgroundResource(R.drawable.ic_emojis_delete); FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) holder.emojiTv.getLayoutParams(); lp.bottomMargin = (int) mContext.getResources().getDimension(R.dimen.dp12); } else { holder.emojiTv.setText(getItem(position)); } return convertView; } private static class ViewHolder { private TextView emojiTv; }}

上述内容就是Android中如何使用自带的emoji表情,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android中如何使用自带的emoji表情

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android中如何使用自带的emoji表情

本篇文章为大家展示了Android中如何使用自带的emoji表情,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。什么是emoji表情emoji表情是一种表情符号,在代码中它现在其实是一组遵循Unico
2023-05-30

Android中如何使用自带的TextToSpeech

要在Android中使用自带的TextToSpeech功能,您可以按照以下步骤进行操作:1. 在您的Android项目中的`AndroidManifest.xml`文件中,确保您已经添加了以下权限:```xml```2. 在您的Activi
2023-08-23

java自带的sort方法如何使用

Java自带的sort方法可以用于对数组或列表进行排序。具体使用方法如下:1. 对数组排序:- 使用Arrays类的静态方法sort(),该方法接受一个数组作为参数,并按照元素的自然顺序进行排序。- 示例代码:```javaint[] ar
2023-10-12

如何在Android应用中调用系统自带的分享功能

本篇文章给大家分享的是有关如何在Android应用中调用系统自带的分享功能,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。实现分享功能的几个办法1.调用系统的分享功能2.通过第三
2023-05-31

Win8自带的默认输入法如何打出特殊字符如符号及表情

我们知道Win8系统上线后,它自带的默认输入法微软拼音输入法相python比以往有很python大的改进,获得不少人的喜欢。如今它不仅中文输入比以前好,还能够打出特殊字符,包括一些标题符号和简单表情。现在小编就教你怎么在Win8系统下打出特
2023-06-06

如何使用spring boot中自带的图片服务器

今天就跟大家聊聊有关如何使用spring boot中自带的图片服务器,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。首先要写个配置类:application.properties文件中
2023-05-31

Lambda表达式如何在Android 中使用

这篇文章给大家介绍Lambda表达式如何在Android 中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1.Lambda表达式的基本写法如果想要在 Android 项目中使用 Lambda表达式 或者 Java8
2023-05-31

win10自带的远程控制如何使用

Windows 10自带的远程控制功能称为"远程桌面连接",可以让你从一台电脑上远程控制另一台电脑。以下是使用远程桌面连接的步骤:1. 打开目标电脑的远程桌面连接功能:- 在目标电脑上,按下Win + X键,选择"系统",然后选择"关于",
2023-09-07

如何使用Win8自带的解压缩工具

解压和压缩在我们的日常工作中经常会用到,所以我们也会使用一些辅助工具来完成这一过程。事实上在Win8系统中本身就带有这样一项功能,本期的《Win8大百科》我们就将介绍如何使用Win8自带的解压缩工具。首先是压缩文件,我们经常会把一类有关联的
2022-06-04

如何使用 Mac 上自带的「提醒事项」!

相信大部分人的手机或电脑上都有一款具有备忘或提醒功能的应用。不管是在工作、学习还是生活中,借助这些工具能给我们带来很多便利。比如,本期小编要给大家介绍的就是 Mac 自带的「提醒事项」应用。▍应用介绍macOS 上的「提醒事项」界面设计得非
2023-06-05

如何在不引用任何表的情况下使用 SELECT 来计算 MySQL 中的表达式?

借助以下 MySQL 语句,我们可以使用 SELECT 来计算表达式 -SELECT expression;上述语句没有引用任何表。以下是一些示例 -mysql> Select 10 DIV 5;+----------+| 10 DIV
2023-10-22

Win10如何使用自带的音乐播放器

在Windows 10中,有一个自带的音乐播放器叫做“Groove音乐”。以下是使用Groove音乐播放器的步骤:1. 打开Groove音乐应用程序。你可以在开始菜单中找到它,或在任务栏上搜索Groove音乐并打开它。2. 添加音乐到播放列
2023-08-25

如何在Android中使用achartengine绘制图表

如何在Android中使用achartengine绘制图表?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1. ABarChart.javapackage com
2023-05-30

lambda表达式如何在Android Studio应用中使用

本篇文章为大家展示了lambda表达式如何在Android Studio应用中使用,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。根目录下gradle文件配置buildscript { reposi
2023-05-31

电脑自带的win7截图工具如何使用

电脑截图有很多种方式可以操作,在win7系统中我们也可以使用系统自带的工具来进行截图,下面就教大家win7自带截图工具使用方法吧。1、点开开始菜单,找到附件。2、在“附件”里找到“截图工具”。3、我们右击“截图工具”选“属性”。4、弹出“属
2023-07-11

Android中使用自身携带的Junit新建一个测试工程

1、新建立一个Android工程package com.shellway.junit;public class Service {public int divide(int a,int b){return a/b;}}package com
2022-06-06

Win8.1自带分区功能的使用方法 win8.1使用自带分区功能如何进行分区

大家是否知道Win8.1自带分区功能,那么Win8.1自带分区功能如何使用?安装win8.1正式版系统后需要进行分区,可能很多用户第一反应就是下载分区功能。其实win8.1系统自带有分区功能,完全可以使用自带分区功能重新进行分区。相信有很多
2022-06-04

Win8如何使用自带的便利工具财经应用

Win8有个资讯应用,不过大都是新闻资讯。对于财经人士、或者广大炒股网民来说,Win8还提供了一个便利工具,那就是必应财经应用。如何使用这个内置应用呢?财经(必应财经)是在Win8安装后就默认安装好的应用,在应用的首页,我们可以看到资讯、上
2022-06-04

Win8如何使用自带的开始屏幕上的SkyDrive应用

在Win8的开始屏幕就能看到SkyDrive应用,它不是单一功能,而是具有多种功能。下面我们来详细了解一下这个与时俱进的新应用如何使用呢。在Win8的全新界面SkyDrive应用中我们可以轻松查看自己保存在云端的文件夹和文件,右键点击文件夹
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录