Android 表情面板的展示和表情的显示

59 篇文章 0 订阅
33 篇文章 1 订阅

前言

在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点击事件里面,我们创建了一个可扩展的字符串,他是显示表情的最关键的东西.至于它怎么使用的,麻烦大家自己去查阅吧,网上用法很多,这里就不复制用法过来了


还是老规矩,下面放出源码下载

源码下载

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值