Giter Club home page Giter Club logo

gsyricktext's Introduction

支持类似微博的文本效果,表情、@某人、话题、url链接等。DEMO同时演示了MVVM模式的使用。

状态 功能
支持 表情
支持 #话题
支持 @某人
支持 url与数字(可配置)
支持 点击效果
支持 自定义span效果
支持 表情、#话题与@某人编辑时整块删除
支持 表情、#话题与@某人编辑时选择复制限制整块选择。
支持 表情大小设置、居中显示
支持 MVVM(DataBing)。
支持 kotlin(demo与lib)

Build Status

依赖方式

在project下的build.gradle添加

allprojects {
	repositories {
		...
		maven { url 'https://jitpack.io' }
	}
}

在module下的build.gradle添加

dependencies {
    compile 'com.github.CarGuo.RickText:textUtilsLib:v2.1.5'
}

kotlin版本的依赖

dependencies {
    compile 'com.github.CarGuo.RickText:textUtilsLib-kotlin:v2.1.5'
}

DEMO效果图

QQ群,有兴趣的可以进来,群里视频项目的人居多,平时多吹水吐槽:174815284 。

公众号


使用方式参考demo

1、文本模式

1.1、RichTextView

richTextView = (RichTextView) findViewById(R.id.rich_text_2);
//直接使用RichTextView
richTextView.setAtColor(Color.RED);
richTextView.setTopicColor(Color.BLUE);
richTextView.setLinkColor(Color.YELLOW);
richTextView.setNeedNumberShow(true);
richTextView.setNeedUrlShow(true);
richTextView.setSpanAtUserCallBackListener(spanAtUserCallBack);
richTextView.setSpanTopicCallBackListener(spanTopicCallBack);
richTextView.setSpanUrlCallBackListener(spanUrlCallBack);
//所有配置完成后才设置text
richTextView.setRichText(content, nameList, topicModels);

1.2、普通TextView

//url点击回调
SpanUrlCallBack spanUrlCallBack = new SpanUrlCallBack() {
    @Override
    public void phone(String phone) {
        Toast.makeText(MainActivity.this, phone + " 被点击了", Toast.LENGTH_SHORT).show();
        richText.setHighlightColor(Color.TRANSPARENT);
    }

    @Override
    public void url(String url) {
        Toast.makeText(MainActivity.this, url + " 被点击了", Toast.LENGTH_SHORT).show();
        richText.setHighlightColor(Color.TRANSPARENT);
    }
};

//@点击回调
SpanAtUserCallBack spanAtUserCallBack = new SpanAtUserCallBack() {
    @Override
    public void onClick(UserModel userModel1) {
        Toast.makeText(MainActivity.this, userModel1.getUser_name() + " 被点击了", Toast.LENGTH_SHORT).show();
        richText.setHighlightColor(Color.TRANSPARENT);
    }
};

//话题点击回调
SpanTopicCallBack spanTopicCallBack = new SpanTopicCallBack() {
    @Override
    public void onClick(TopicModel topicModel) {
        Toast.makeText(MainActivity.this, topicModel.getTopicName() + " 被点击了", Toast.LENGTH_SHORT).show();
        richText.setHighlightColor(Color.TRANSPARENT);
    }
};

//配置TextView显示文本
RichTextBuilder richTextBuilder = new RichTextBuilder(this);
richTextBuilder.setContent(content)
        .setAtColor(Color.RED)
        .setLinkColor(Color.BLUE)
        .setTopicColor(Color.YELLOW)
        .setListUser(nameList)
        .setListTopic(topicModels)
        .setTextView(richText)
        .setSpanAtUserCallBack(spanAtUserCallBack)
        .setSpanUrlCallBack(spanUrlCallBack)
        .setSpanTopicCallBack(spanTopicCallBack)
        .build();

2、编辑模式(RichEditText)

richEditText = (RichEditText) findViewById(R.id.emoji_edit_text);
emojiLayout.setEditTextSmile(richEditText);
RichEditBuilder richEditBuilder = new RichEditBuilder();
richEditBuilder.setEditText(richEditText)
        .setTopicModels(topicModels)
        .setUserModels(nameList)
        .setColorAtUser("#FF00C0")
        .setColorTopic("#F0F0C0")
        .setEditTextAtUtilJumpListener(new OnEditTextUtilJumpListener() {
            @Override
            public void notifyAt() {
                JumpUtil.goToUserList(MainActivity.this, MainActivity.REQUEST_USER_CODE_INPUT);
            }

            @Override
            public void notifyTopic() {
                JumpUtil.goToTopicList(MainActivity.this, MainActivity.REQUEST_TOPIC_CODE_INPUT);
            }
        })
        .builder();

版本更新

v2.1.5 (2018-01-23)

  • 修复了ellipsize问题

v2.1.4 (2017-12-05)

  • 修复了一个特殊场景下让人🥚疼的问题。
  • 修复某些情况下删除按键导致的问题

v2.1.2 (2017-10-20)

  • 优化一些问题
  • 增加kotlin lib 与 kotlin demo

v2.1.1 (2017-09-19)

  • 增加表情居中功能的支持。

v2.1.0 (2017-09-17)

  • 修复了@和#输入存在的问题。

License

MIT

gsyricktext's People

Contributors

carguo avatar carguosmall avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gsyricktext's Issues

给@的UserMode的name末尾添加一位空格,删除没有了再次确认的效果

我给添加空格是为了保持和微博相同的规则,即:@和空格之间为一个用户名。这个也主要是为了和ios的规则做兼容。
但是我发现name追加一个空格后缀后,@标签删除不在触发二次确认的效果(背景选中效果)。
然后我怀疑是空格的问题,继续追加了一个不可见字符\u2060(Unicode3.2 新增了 \u2060 用来表示零宽不换行空格),仍然不能解决这个问题。尝试在空格后再追加一个普通的汉字,发现也不行。
所以我猜测:这个@name+一个空格,在框架内有特殊的处理吗?还是这只是一个bug?

thanks。

有考虑过移植到flutter吗?

添加表情可能太难了,但是@某人、#话题#,这种应该有可操作性才对。我试过通过监听输入框,对比前后的文本、光标,来进行快捷删除、插入字符、移动光标。我是用搜狗输入法试的,本来也能勉强达到要求,但是后来发现有的输入法,打拼音的时候,拼音会先出现在输入框,用户确定后会替换成汉子,这样,就无法对比文本了。
大佬可以给一点指导意见吗?

@失效

[表情]@某人

表情后,紧接着@某人,@失效

与SpannableString 结合使用,表情解析不出来

emojiText = TextCommonUtils.getEmojiText(mContext, entity.getComment_content());
SpannableString spannableString = new SpannableString(mContext.getString(R.string.reply) + entity.getCommented_user_nick() + ":" + emojiText);
spannableString.setSpan(new ForegroundColorSpan(mContext.getColor(R.color.font_blue_v2)), 2, entity.getCommented_user_nick().length() + 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
holder.tvSayWhat.setText(spannableString);
代码实现的是回复评论的功能,eg: 回复XXX:内容+表情, 对XXX加了字体颜色,但是表情。。解析不出来了。这块怎么处理,求给个思路

@某人前输入@符号问题

在有@某人前,不管是@某人前中间有文本还有没有文本,输入@符号之后跳转选择@用户回来文本并没有填充上还有@符号并没有删除。但是在@某人后输入@符号之后跳转回来是正常的。请问作者这是怎么回事呢?谢谢!

RichTextView不能匹配多个相同话题

输入多个相同话题不能只能匹配一个,匹配顺序有问题

修改如下TextCommonUtils 文件 的 getTopicText方法

修改成:

fun getTopicText(context: Context, listTopic: List?, content: String, textView: ITextViewShow?, clickable: Boolean,
color: Int, spanTopicCallBack: SpanTopicCallBack?): Spannable {
if (listTopic == null || listTopic.isEmpty())
return SpannableString(content)
val spannableString = SpannableString(content)
var indexStart = 0
val lenght = content.length
var hadHighLine = false
// val map = HashMap<String, String>()
var i = 0
while (i < listTopic.size) {
while (true) {
val index = content.indexOf("#" + listTopic[i].topicName + "#", indexStart) + 1
if (index > 0) {
val mathStart = index - 1
val indexEnd = index + listTopic[i].topicName.length
val hadAt = "#" == content.substring(mathStart, index) && "#" == content.substring(indexEnd, indexEnd + 1)
val matchEnd = indexEnd + 1
if (hadAt && (matchEnd <= lenght || indexEnd == lenght)) {
if (indexEnd >= indexStart) {
indexStart = indexEnd
}
hadHighLine = true
var clickTopicSpan: ClickTopicSpan? = null
if (textView != null) {
clickTopicSpan = textView.getCustomClickTopicSpan(context, listTopic[i], color, spanTopicCallBack!!)
}
if (clickTopicSpan == null) {
clickTopicSpan = ClickTopicSpan(context, listTopic[i], color, spanTopicCallBack)
}
spannableString.setSpan(clickTopicSpan, mathStart, if (indexEnd == lenght) lenght else matchEnd, Spanned.SPAN_MARK_POINT)
}
} else
break
}
i++
indexStart = 0
}
if (clickable && hadHighLine)
textView!!.setMovementMethod(LinkMovementMethod.getInstance())
return spannableString
}

null

关闭 解决了

RichEditText resolveInsertText

RichEditText的resolveInsertText方法 添加的listUser和listTopic 并未加入nameList和topicList,导致getReal系列的获取值发生错误

大佬,你这个库靠谱么 改得我好痛苦

表情高度问题

表情弹框的高度如何设置 我从写了这个表情库 为什么高度也没有改变 求赐教/...急急急

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.