前言
在Android项目中由于是社交类的项目,所以里面用到了表情,表情是emoji表情,所以实现了之后,弄个demo分享一下,主要实现了表情的选择和显示,只是一个demo,剩下的靠大家自己去扩展
国际惯例,先来个效果
demo比较简单,就是展示表情并且点击之后显示在TextView上,如果你不会,那就往下一起做吧!
xml布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
tools:context="com.yoursecondworld.emojidemo.MainActivity">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/rv"
android:text="我是TextView" />
<android.support.v7.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_alignParentBottom="true" />
</RelativeLayout>
列表是使用的是v7包里面的RecyclerView控件,然后上面有一个文本控件
列表使用的item的xml布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/iv"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_centerInParent="true"
android:src="@mipmap/emoji_0" />
</RelativeLayout>
Activity中代码
public class MainActivity extends AppCompatActivity {
private RecyclerView rv = null;
private TextView tv = null;
/**
* 显示表情的适配器
*/
private CommonRecyclerViewAdapter adapter = null;
/**
* 管理表情的布局管理器
*/
private StaggeredGridLayoutManager layoutManager = null;
/**
* 显示的数据
*/
private List<Integer> data = new ArrayList<Integer>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化列表控件
rv = (RecyclerView) findViewById(R.id.rv);
tv = (TextView) findViewById(R.id.tv);
//添加emoji表情资源
addAllEmogi();
rv.setBackgroundColor(Color.GRAY);
//创建适配器
adapter = new SelectEmojiFragmentAdapter(this, data);
//创建布局管理器
layoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.HORIZONTAL);
rv.setLayoutManager(layoutManager);
//创建条目间隔
EmojiSpaceItemDecoration itemDecoration = new EmojiSpaceItemDecoration();
rv.addItemDecoration(itemDecoration);
//设置适配器
rv.setAdapter(adapter);
adapter.setOnRecyclerViewItemClickListener(new CommonRecyclerViewAdapter.OnRecyclerViewItemClickListener() {
@Override
public void onItemClick(View v, int position) {
SpannableString s = new SpannableString("emoji");
ImageSpan i = new ImageSpan(MainActivity.this, data.get(position));
s.setSpan(i, 0, 5, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.append(s);
}
});
}
/**
* 加入所有表情
*/
private void addAllEmogi() {
data.add(R.mipmap.emoji_0);
data.add(R.mipmap.emoji_1);
data.add(R.mipmap.emoji_2);
data.add(R.mipmap.emoji_3);
data.add(R.mipmap.emoji_4);
data.add(R.mipmap.emoji_5);
data.add(R.mipmap.emoji_6);
data.add(R.mipmap.emoji_7);
data.add(R.mipmap.emoji_8);
data.add(R.mipmap.emoji_9);
data.add(R.mipmap.emoji_10);
data.add(R.mipmap.emoji_11);
data.add(R.mipmap.emoji_12);
data.add(R.mipmap.emoji_13);
data.add(R.mipmap.emoji_14);
data.add(R.mipmap.emoji_15);
data.add(R.mipmap.emoji_16);
data.add(R.mipmap.emoji_17);
data.add(R.mipmap.emoji_18);
data.add(R.mipmap.emoji_19);
data.add(R.mipmap.emoji_20);
data.add(R.mipmap.emoji_21);
data.add(R.mipmap.emoji_22);
data.add(R.mipmap.emoji_23);
data.add(R.mipmap.emoji_24);
data.add(R.mipmap.emoji_25);
data.add(R.mipmap.emoji_26);
data.add(R.mipmap.emoji_27);
data.add(R.mipmap.emoji_28);
data.add(R.mipmap.emoji_29);
data.add(R.mipmap.emoji_30);
data.add(R.mipmap.emoji_31);
data.add(R.mipmap.emoji_32);
data.add(R.mipmap.emoji_33);
data.add(R.mipmap.emoji_34);
data.add(R.mipmap.emoji_35);
data.add(R.mipmap.emoji_36);
data.add(R.mipmap.emoji_37);
data.add(R.mipmap.emoji_38);
data.add(R.mipmap.emoji_39);
data.add(R.mipmap.emoji_40);
data.add(R.mipmap.emoji_41);
data.add(R.mipmap.emoji_42);
data.add(R.mipmap.emoji_43);
data.add(R.mipmap.emoji_44);
data.add(R.mipmap.emoji_45);
data.add(R.mipmap.emoji_46);
data.add(R.mipmap.emoji_47);
data.add(R.mipmap.emoji_48);
data.add(R.mipmap.emoji_49);
data.add(R.mipmap.emoji_50);
data.add(R.mipmap.emoji_51);
data.add(R.mipmap.emoji_52);
data.add(R.mipmap.emoji_53);
data.add(R.mipmap.emoji_54);
data.add(R.mipmap.emoji_55);
data.add(R.mipmap.emoji_56);
data.add(R.mipmap.emoji_57);
data.add(R.mipmap.emoji_58);
data.add(R.mipmap.emoji_59);
data.add(R.mipmap.emoji_60);
data.add(R.mipmap.emoji_61);
data.add(R.mipmap.emoji_62);
data.add(R.mipmap.emoji_63);
data.add(R.mipmap.emoji_64);
data.add(R.mipmap.emoji_65);
data.add(R.mipmap.emoji_66);
data.add(R.mipmap.emoji_67);
data.add(R.mipmap.emoji_68);
data.add(R.mipmap.emoji_69);
data.add(R.mipmap.emoji_70);
data.add(R.mipmap.emoji_71);
data.add(R.mipmap.emoji_72);
data.add(R.mipmap.emoji_73);
data.add(R.mipmap.emoji_74);
data.add(R.mipmap.emoji_75);
data.add(R.mipmap.emoji_76);
data.add(R.mipmap.emoji_77);
data.add(R.mipmap.emoji_78);
data.add(R.mipmap.emoji_79);
data.add(R.mipmap.emoji_80);
data.add(R.mipmap.emoji_81);
data.add(R.mipmap.emoji_82);
data.add(R.mipmap.emoji_83);
data.add(R.mipmap.emoji_84);
data.add(R.mipmap.emoji_85);
data.add(R.mipmap.emoji_86);
data.add(R.mipmap.emoji_87);
data.add(R.mipmap.emoji_88);
data.add(R.mipmap.emoji_89);
data.add(R.mipmap.emoji_90);
data.add(R.mipmap.emoji_91);
data.add(R.mipmap.emoji_92);
data.add(R.mipmap.emoji_93);
data.add(R.mipmap.emoji_94);
data.add(R.mipmap.emoji_95);
data.add(R.mipmap.emoji_96);
data.add(R.mipmap.emoji_97);
data.add(R.mipmap.emoji_98);
data.add(R.mipmap.emoji_99);
data.add(R.mipmap.emoji_100);
data.add(R.mipmap.emoji_101);
data.add(R.mipmap.emoji_102);
data.add(R.mipmap.emoji_103);
data.add(R.mipmap.emoji_104);
data.add(R.mipmap.emoji_105);
data.add(R.mipmap.emoji_106);
data.add(R.mipmap.emoji_107);
data.add(R.mipmap.emoji_108);
data.add(R.mipmap.emoji_109);
data.add(R.mipmap.emoji_110);
data.add(R.mipmap.emoji_111);
data.add(R.mipmap.emoji_112);
data.add(R.mipmap.emoji_113);
data.add(R.mipmap.emoji_114);
data.add(R.mipmap.emoji_115);
data.add(R.mipmap.emoji_116);
data.add(R.mipmap.emoji_117);
data.add(R.mipmap.emoji_118);
data.add(R.mipmap.emoji_119);
data.add(R.mipmap.emoji_120);
data.add(R.mipmap.emoji_121);
data.add(R.mipmap.emoji_122);
data.add(R.mipmap.emoji_123);
data.add(R.mipmap.emoji_124);
data.add(R.mipmap.emoji_125);
data.add(R.mipmap.emoji_126);
data.add(R.mipmap.emoji_127);
data.add(R.mipmap.emoji_128);
data.add(R.mipmap.emoji_129);
}
}
可以看到我们有一个方法很长,就是添加表情的id到我们的集合中去的,因为要在列表中显示嘛!
布局管理器用了v7包里面自带的StaggeredGridLayoutManager,有横向和纵向的GridView的效果
适配器为了快速,使用了通用适配器,如果不明白的可以参看我另一篇博客,传送门:
http://blog.csdn.net/u011692041/article/details/51910677
适配器的代码
/**
* Created by cxj on 2016/7/30.
* 显示表情的适配器
*/
public class SelectEmojiFragmentAdapter extends CommonRecyclerViewAdapter<Integer> {
/**
* 构造函数
*
* @param context 上下文
* @param data 显示的数据
*/
public SelectEmojiFragmentAdapter(Context context, List<Integer> data) {
super(context, data);
}
@Override
public void convert(CommonRecyclerViewHolder h, Integer entity, int position) {
h.setImage(R.id.iv, entity);
}
@Override
public int getLayoutViewId(int viewType) {
return R.layout.item;
}
}
h.setImage(R.id.iv, entity);这句代码其实就是获取了item中的ImageView控件,然后设置了图片资源,这里只不是被封装了罢了,你们可以使用原始的
在Activity里面注册的item点击事件里面,我们创建了一个可扩展的字符串,他是显示表情的最关键的东西.至于它怎么使用的,麻烦大家自己去查阅吧,网上用法很多,这里就不复制用法过来了
还是老规矩,下面放出源码下载