【GT-安卓应用开发之表情列表】

本文介绍了如何在安卓应用中实现表情列表功能,通过ViewPager+GridView展示表情,并详细讲解了图片与表情名称的对应、点击事件处理、表情的插入与删除操作。提供了一个IM程序聊天表情部分的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:今天无聊翻了翻之前做的一个IM程序,趁着午休时间将聊天表情部分代码摘出来记录一下。

  所谓表情消息,其实就是一串特殊格式的字符串,记得之前QQ是可以手输表情的。我的思路是将图片与名字(也就是前面说的特殊格式的字符串)进行一一对应,利用ViewPager+GridView展示表情列表,点击某一表情获取表情名字,然后转为Bitmap后再转为ImageSpan插入到EditText中。

  1、资源准备

  将所需要的表情图片放在aeest资源下,我这里直接从项目中摘出来的,也可以自己手动添加,名字格式要保持一致

  2、初始化

  定义一个List,用于保存各个图片的名字

private void initStaticFaces() {
    try {
        staticFacesList = new ArrayList<String>();
        String[] faces = getAssets().list("face/png");
        for (int i = 0; i < faces.length; i++) {
            staticFacesList.add(faces[i]);
        }
        //去掉删除图片
        staticFacesList.remove("emotion_del_normal.png");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

初始化数据后初始化Viewpager

//获取页数
private int getPagerCount() {
    int count = staticFacesList.size();
    return count % (columns * rows - 1) == 0 ? count / (columns * rows - 1)
            : count / (columns * rows - 1) + 1;
}
//初始化ViewPager
private void initViewPager() {
    for (int i = 0; i < getPagerCount(); i++) {
        views.add(viewPagerItem(i));
        ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(16, 16);
        mDotsLayout.addView(dotsItem(i), params);
    }
    FaceVPAdapter mVpAdapter = new FaceVPAdapter(views);
    mViewPager.setAdapter(mVpAdapter);
    mDotsLayout.getChildAt(0).setSelected(true);
}

private ImageView dotsItem(int position) {
    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    View layout = inflater.inflate(R.layout.dot_image, null);
    ImageView iv = layout.findViewById(R.id.face_dot);
    iv.setId(position);
    return iv;
}

private View viewPagerItem(int position) {
    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    View layout = inflater.inflate(R.layout.face_gridview, null);//表情布局
    GridView gridview = layout.findViewById(R.id.chart_face_gv);
    /**
     * 注:因为每一页末尾都有一个删除图标,所以每一页的实际表情columns * rows - 1; 空出最后一个位置给删除图标
     * */
    List<String> subList = new ArrayList<String>();
    subList.addAll(staticFacesList
            .subList(position * (columns * rows - 1),
                    (columns * rows - 1) * (position + 1) > staticFacesList
                            .size() ? staticFacesList.size() : (columns
                            * rows - 1)
                            * (position + 1)));
    /**
     * 末尾添加删除图标
     * */
    subList.add("emotion_del_normal.png");
    FaceGVAdapter mGvAdapter = new FaceGVAdapter(subList, this);
    gridview.setAdapter(mGvAdapter);
    gridview.setNumColumns(columns);
    return gridview;
}

  3、添加事件处理

  点击表情,将表情插入到EditText中(如果是删除则删掉EditText中最后一个表情),长按删除则清空EditText

gridview.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        try {
            String png = ((TextView) ((LinearLayout) view).getChildAt(1)).getText().toString();
            if (!png.contains("emotion_del_normal")) {// 如果不是删除图标
                insert(getFace(png));
            } else {
                delete();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});
gridview.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
    @Override
    public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
        String png = ((TextView) ((LinearLayout) view).getChildAt(1)).getText().toString();
        if (!png.contains("emotion_del_normal")) {// 如果不是删除图标
        } else {
            deleteAll();
        }
        return false;
    }
});

  4、插入、删除以及清空

private void insert(CharSequence text) {
    int iCursorStart = Selection.getSelectionStart((input.getText()));
    int iCursorEnd = Selection.getSelectionEnd((input.getText()));
    if (iCursorStart != iCursorEnd) {
        input.getText().replace(iCursorStart, iCursorEnd, "");
    }
    int iCursor = Selection.getSelectionEnd((input.getText()));
    input.getText().insert(iCursor, text);
}
private void delete() {
    if (input.getText().length() != 0) {
        int iCursorEnd = Selection.getSelectionEnd(input.getText());
        int iCursorStart = Selection.getSelectionStart(input.getText());
        if (iCursorEnd > 0) {
            if (iCursorEnd == iCursorStart) {
                if (isDeletePng(iCursorEnd)) {
                    String st = "#[face/png/f_static_000.png]#";
                    input.getText().delete(
                            iCursorEnd - st.length(), iCursorEnd);
                } else {
                    input.getText().delete(iCursorEnd - 1,
                            iCursorEnd);
                }
            } else {
                input.getText().delete(iCursorStart,
                        iCursorEnd);
            }
        }
    }
}
private void deleteAll() {
    input.setText("");
}

  5、效果图

                               

  6、demo地址

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在 IT 领域,文档格式转换是常见需求,尤其在处理多种文件类型时。本文将聚焦于利用 Java 技术栈,尤其是 Apache POI 和 iTextPDF 库,实现 doc、xls(涵盖 Excel 2003 及 Excel 2007+)以及 txt、图片等格式文件向 PDF 的转换,并实现在线浏览功能。 先从 Apache POI 说起,它是一个强大的 Java 库,专注于处理 Microsoft Office 格式文件,比如 doc 和 xls。Apache POI 提供了 HSSF 和 XSSF 两个 API,其中 HSSF 用于读写老版本的 BIFF8 格式(Excel 97-2003),XSSF 则针对新的 XML 格式(Excel 2007+)。这两个 API 均具备读取和写入工作表、单元格、公式、样式等功能。读取 Excel 文件时,可通过创建 HSSFWorkbook 或 XSSFWorkbook 对象来打开相应格式的文件,进而遍历工作簿中的每个 Sheet,获取行和列数据。写入 Excel 文件时,创建新的 Workbook 对象,添加 Sheet、Row 和 Cell,即可构建新 Excel 文件。 再看 iTextPDF,它是一个用于生成和修改 PDF 文档的 Java 库,拥有丰富的 API。创建 PDF 文档时,借助 Document 对象,可定义页面尺寸、边距等属性来定制 PDF 外观。添加内容方面,可使用 Paragraph、List、Table 等元素将文本、列表和表格加入 PDF,图片可通过 Image 类加载插入。iTextPDF 支持多种字体和样式,可设置文本颜色、大小、样式等。此外,iTextPDF 的 TextRenderer 类能将 HTML、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值