Android QQ空间说说回复功能简介

简介:

转自:http://blog.csdn.net/guijiaoba/article/details/47287697

最近项目里面有很多关于textview的样式问题,比如一些字体设置了背景色,加粗,下划线,中划线等。

下面以QQ空间中说说的回复进行实例讲解。

这里写图片描述

由于mac上软件比较难用,没有到qq的apk里面去扣一些表情过来,暂时拿默认的图片作为一个表情。

上面图片的中实例表示,“今天去星巴克喝咖啡了”表示一条说说,下面有三条留言是对主人“流水不腐”评论,同时评论最后还加了一个表情。

下面简单说下技术要点: 
1、一般情况下,思路是这样的,一条评论是一行,可以是线性布局搞定,同时对用户名称和楼主的名称添加蓝色,如果有表情,那么则添加Imageview表示,这个在这里不做实现和分析,原因是因为,假如评论的条数太大,则效率是一个很大的问题。 
2、、还有一些情况就是一条评论,单独作为一个textview,使用Android 提供的SpannableString进行实现。

下面就上面的分析的思路,对方法二进行代码实现,代码如下

public class FirstFragment extends Fragment {

    @InjectView(R.id.textview)
    TextView textview;

    String host = "流水不腐";
    String[] names = {"张三", "李四", "二狗子"};
    String comment = "土豪求带啊";

    int color = Color.BLUE;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_first, container, false);
        ButterKnife.inject(this, view);
        return view;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);

        SpannableStringBuilder builder = new SpannableStringBuilder();
        for (String name : names) {
            String text = String.format("%s回复%s:%sicon\n", name, host, comment);
            SpannableString string = new SpannableString(text);
            string.setSpan(new ForegroundColorSpan(color), 0, name.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            string.setSpan(new ForegroundColorSpan(color), name.length() + 2, name.length() + 2 + host.length(),
                    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            string.setSpan(new ImageSpan(bitmap), text.length() - 5, text.length() - 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            builder.append(string);
        }

        textview.setText(builder);
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        ButterKnife.reset(this);
    }
}

这是一个fragment,布局里面只有一个textview,textview没有使用findviewByid进行初始化,使用的是开源工具butterknife。

然后就是一次赋值,每次评论玩后,进行回车。 
String text = String.format(“%s回复%s:%sicon\n”, name, host, comment); 
评论的内容是这样的,第一个参数表示用户名,第二个表示楼主,第三个表示内容,内容后面有个icon,我在这里只是对表情协议做简单的处理,实际上每个应用的对应的表情协议都是不一样的,使用特殊的字符串进行替换。

// 给name设置一个颜色
string.setSpan(new ForegroundColorSpan(color), 0, name.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// 给host设置一个颜色
string.setSpan(new ForegroundColorSpan(color), name.length() + 2, name.length() + 2 + host.length(),
        Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// 给icon进行替换,换成一个图片
string.setSpan(new ImageSpan(bitmap), text.length() - 5, text.length() - 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
builder.append(string);

以上就是一个QQ空间的回复功能的大致技术思路。

补充

由于Android对SpannableString设计的不太友好,所以本人对SpannableString进行的二次封装,叫做TextStylePlus,下面是github地址,欢迎各位前来讨论,里面有个相关的代码和demo,同时还对ImageSpan做了扩展,一般情况下,ImageSpan是替换的,如上面所示,字符串icon是被一个图片替换的,但是有些情况下,需要显示一个自定义的shape背景,那么就比较难搞。 
TextStylePlus

下面是对上面的QQ空间回复功能,使用TextStylePlus进行实现。

public class SecondFragment extends Fragment {

    @InjectView(R.id.textview)
    TextView textview;

    String host = "流水不腐";
    String[] names = {"张三", "李四", "二狗子"};
    String comment = "土豪求带啊";

    int color = Color.BLUE;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_first, container, false);
        ButterKnife.inject(this, view);
        return view;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        StyleBuilder styleBuilder = new StyleBuilder();
        for (String name : names) {
            styleBuilder.addStyleItem(
                    new TextStyleItem(name).setTextColor(color).setClickListener(new TextStyleItem.OnClickListener() {
                        @Override
                        public void onClick(String clickedText) {
                            Toast.makeText(SecondFragment.this.getActivity(), "text = " + clickedText, Toast.LENGTH_SHORT).show();
                        }
                    }))
                    .text("回复:")
                    .addStyleItem(new TextStyleItem(host).setTextColor(color))
                    .addStyleItem(new TextStyleItem("icon").setIconRes(R.drawable.ic_launcher))
                    .newLine();
        }
        styleBuilder.show(textview);
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        ButterKnife.reset(this);
    }
}

代码比较简单易懂,就是对回复的内容进行拼装,类似于使用StringBuffer一样,当最好拼装完成好后,直接传给textview进行显示,同时扩展了点击事件,当点击某一个用户的名字时,会弹出一个Toast,如下所示。

这里写图片描述

至此,本文基本技术,如需代码示例,请访问https://github.com/LiushuiXiaoxia/TextStylePlus ,项目里面共有三个子项目,libary表示TextStylePlus的库,app是对libary的demo,qqComment是QQ空间回复的功能实现。



相关文章
|
NoSQL 应用服务中间件 PHP
布谷一对一直播源码android版环境配置流程及功能明细
部署需基于 CentOS 7.9 系统,硬盘不低于 40G,使用宝塔面板安装环境,包括 PHP 7.3(含 Redis、Fileinfo 扩展)、Nginx、MySQL 5.6、Redis 和最新 Composer。Swoole 扩展需按步骤配置。2021.08.05 后部署需将站点目录设为 public 并用 ThinkPHP 伪静态。开发环境建议 Windows 操作系统与最新 Android Studio,基础配置涉及 APP 名称修改、接口域名更换、包名调整及第三方登录分享(如 QQ、微信)的配置,同时需完成阿里云与腾讯云相关设置。
|
Android开发
Android开发表情emoji功能开发
本文介绍了一种在Android应用中实现emoji表情功能的方法,通过将图片与表情字符对应,实现在`TextView`中的正常显示。示例代码展示了如何使用自定义适配器加载emoji表情,并在编辑框中输入或删除表情。项目包含完整的源码结构,可作为开发参考。视频演示和源码详情见文章内链接。
480 4
Android开发表情emoji功能开发
|
安全 Android开发 iOS开发
Android vs iOS:探索移动操作系统的设计与功能差异###
【10月更文挑战第20天】 本文深入分析了Android和iOS两个主流移动操作系统在设计哲学、用户体验、技术架构等方面的显著差异。通过对比,揭示了这两种系统各自的独特优势与局限性,并探讨了它们如何塑造了我们的数字生活方式。无论你是开发者还是普通用户,理解这些差异都有助于更好地选择和使用你的移动设备。 ###
697 3
|
编解码 测试技术 Android开发
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
本文详细介绍了如何利用CameraX库实现高质量的照片及视频拍摄功能,包括添加依赖、初始化、权限请求、配置预览与捕获等关键步骤。此外,还特别针对不同分辨率和帧率的视频拍摄提供了性能优化策略,确保应用既高效又稳定。
2020 1
Android经典实战之用 CameraX 库实现高质量的照片和视频拍摄功能
|
图形学 Android开发
小功能⭐️Unity调用Android常用事件
小功能⭐️Unity调用Android常用事件
|
Android开发 开发者
Android平台无纸化同屏如何实现实时录像功能
Android平台无纸化同屏,如果需要本地录像的话,实现难度不大,只要复用之前开发的录像模块的就可以,对我们来说,同屏采集这块,只是数据源不同而已,如果是自采集的其他数据,我们一样可以编码录像。
243 0
|
Android开发
Android中如何快速的实现RecycleView的拖动重排序功能
使用`ItemTouchHelper`和自定义`Callback`,在`RecyclerView`中实现拖动排序功能。定义`ItemTouchHelperAdapter`接口,`Adapter`实现它以处理`onItemMove`方法。`SimpleItemTouchHelperCallback`设置拖动标志,如`LEFT`或`RIGHT`(水平拖动),并绑定到`RecyclerView`以启用拖动。完成这些步骤后,即可实现拖放排序。关注公众号“AntDream”获取更多内容。
558 3
|
数据库 Android开发 数据安全/隐私保护
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
608 2
|
存储 数据库 Android开发
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
732 0

热门文章

最新文章