android在文本框中输入和显示表情

本文深入探讨了AI音视频处理领域中的视频分割与语义识别技术,介绍了视频分割的基本概念、常见算法及其实现方式,并详细讲解了语义识别在自动驾驶场景中的应用案例。

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

public void inputFace(EditText contentEdt, int position, Context context) {

int index = contentEdt.getSelectionStart();

int drawId = ToolUtils.faceId[position];

String string = ToolUtils.stringId[position];

contentEdt.getText().insert(index, string);

SpannableString spannableString = new SpannableString(contentEdt.getText());

Drawable d = context.getResources().getDrawable(drawId);

//设置图片大小    

d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());

//插入的位置    

spannableString.setSpan(new ImageSpan(d, ImageSpan.ALIGN_BOTTOM), index, index + string.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

// spannableString.setSpan(new ImageSpan(context, drawId), index, index + string.length(),

// Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

contentEdt.setText(spannableString, TextView.BufferType.SPANNABLE);

contentEdt.setSelection(index + string.length());

contentEdt.setOnClickListener(new OnClickListener() {


@Override

public void onClick(View v) {

if (rootView != null) {

rootView.setVisibility(View.GONE);

}

}

});

}

public void showFace(TextView text, String content, ArrayList<String> indexText, String colorContent) {

if (StringUtils.isNullOrEmpty(content)) {

return;

}

if (null != indexText && !indexText.isEmpty()) {

String[] temp = null;

int start = 0;

int end = 0;

SpannableString spanText = new SpannableString(colorContent);

// LogUtils.d(TAG, "showFace: " + colorContent + "  " + Arrays.asList(indexText));

for (String string : indexText) {

temp = string.split("#");

start = Integer.valueOf(temp[0]);

end = Integer.valueOf(temp[1]);

spanText.setSpan(new ForegroundColorSpan(Color.parseColor("#0178b0")), start, end, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

}

text.append(spanText);

}

if (content.contains("/")) {

// LogUtils.d(TAG, "showFace() contain/");

Pattern pattern = null;

pattern = Pattern.compile("/[a-z]{2}");

Matcher matcher = pattern.matcher(content);

int size = ToolUtils.dip2px(text.getContext(), 20);

Integer drawableSrc = null;

SpannableString spannableString = new SpannableString(content);

while (matcher.find()) {

// LogUtils.d(TAG, "showFace() finded " + matcher.group());

int start = matcher.start();

int end = matcher.end();

drawableSrc = ToolUtils.getFaceId(matcher.group());

// LogUtils.d(TAG, "showFace() drawableSrc " + drawableSrc);

if (drawableSrc > 0) {

 //以下代码是在指定位置插入图片   

final Drawable d = text.getContext().getResources().getDrawable(drawableSrc);   

//设置图片大小    

d.setBounds(0, 0, size, size);

spannableString.setSpan(getDynamicSpan(d), start, end,

Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

}

}

text.append(spannableString);

} else {

text.append(content);

}

}

private DynamicDrawableSpan getDynamicSpan(final Drawable d) {

DynamicDrawableSpan dynamicDraw = new DynamicDrawableSpan(DynamicDrawableSpan.ALIGN_BOTTOM) {


@Override

public Drawable getDrawable() {

return d;

}

@Override

   public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {

       Drawable d = getDrawable();

       Rect rect = d.getBounds();


       if (fm != null) {

           fm.ascent = -rect.bottom; 

           fm.descent = 0; 


           fm.top = fm.ascent;

           fm.bottom = 0;

       }


       return rect.right;

   }


   /*

    * Copy-paste of super.draw(...) but use getDrawable() to get the image/frame to draw, in stead of

    * the cached drawable.

    */

   @Override

   public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {

       Drawable b = getDrawable();

       canvas.save();


       int transY = bottom - b.getBounds().bottom;

       if (mVerticalAlignment == ALIGN_BASELINE) {

           transY -= paint.getFontMetricsInt().descent;

       }


       canvas.translate(x, transY);

       b.draw(canvas);

       canvas.restore();


   }

};

return dynamicDraw;

}


转载于:https://my.oschina.net/u/2409806/blog/537525

这是一个已经集成了聊天发送文字表情语音功能的输入模块 无需再写任何代码 自己写的 5分绝对值 使用方法: 第一步:文件怎么放 把三个文件夹里的东西分别放在制定的地方就行 第二步:布局到我的activity中 把它当成一个普通的view就好 放在你想放的位置 以下是我在自己项目里放的位置 放在布局的最低端 <com example defined SendMassageRelativeLayout android:id "@+id rl bottom" android:layout width "fill parent" android:layout height "wrap content" android:layout alignParentBottom "true" android:background "#aaa" > 第三步:怎么用该控件实现发送文字表情语音 首先 在activity中获得该SendMassageRelativeLayout 并设置两个参数 第一个是语音的录音要放的文件夹路径(文件夹要在activity中建好) 通过SendMassageRelativeLayout对象 SetRootPath String path 设置 第二个是对象SendMessageListener对象 这个对象是一个自定义的接口 要在activity中实现 通过SendMassageRelativeLayout对象 SetSendMessageListener this ;设置 其中this是因为该activity实现了接口 也可以自定义一个类来实现接口 然后在SendMessageListener接口的两个函数中实现语音与 普通文字表情的发送代码就行了 public void getAndSendMessage String str 是发送文字与表情的 点击发送时会调用这个方法 表情已经转变为字符串 str就是要发送的内容 至于要发到哪怎么发自己编写 显示的时候还要解析一下 分离出表情 下面说解析过程 文件中提供的一个类ExpressionUtil java就是解析的工具类 只需要在设置显示的TextView内容时用以下代码就行 String message; 消息具体内容 String zhengze "f0[0 9]{2}|f10[0 7]"; 正则表达式 用 try { SpannableString spannableString ExpressionUtil getExpressionString context message zhengze ; myTextView setText spannableString ; } catch NumberFormatException e { e printStackTrace ; } catch SecurityException e { e printStackTrace ; } catch IllegalArgumentException e { e printStackTrace ; } 语音的发送 语音发送的时候会执行实现接口中的public void getAndSendVoice String path int time 方法path是录制的语音在本地的绝对路径 time是语音的时长 秒为单位 至于接下来是要通过网络发送出去还是播放 自己实现ok了 总之很简单方便 表情输入 文字输入 录音 以及这些功能的切换都已经在内部实现 不需要任何代码 ">这是一个已经集成了聊天发送文字表情语音功能的输入模块 无需再写任何代码 自己写的 5分绝对值 使用方法: 第一步:文件怎么放 把三个文件夹里的东西分别放在制定的地方就行 第二步:布局到我的activity中 [更多]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值