您的位置:首页 > 移动开发 > Android开发

Android即时通讯中的表情的定义和使用

2016-03-24 20:37 645 查看
界面定义
<!--表情图片-->
<LinearLayout
android:id="@+id/ll_face_container"
android:layout_width="match_parent"
android:layout_height="150dp"
android:orientation="vertical"
android:visibility="visible">
<android.support.v4.view.ViewPager
android:id="@+id/vPager"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
[/code]每一个表情容器的定义
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.fanxin.app.widget.ExpandGridView
android:id="@+id/gridview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:numColumns="7"
android:scrollbars="none"
android:verticalSpacing="5dp"
android:gravity="center"
android:layout_gravity="center"
android:layout_marginTop="6dp"
android:layout_marginBottom="6dp"
android:fadingEdge="none"
/>
</LinearLayout>
[/code]Imageview的定义
<?xmlversion="1.0"encoding="utf-8"?>
<ImageViewxmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/iv_expression"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="8dp"
android:scaleType="centerInside">
</ImageView>
[/code]表情界面的两个adapter的定义
publicclassExpressionAdapterextendsArrayAdapter<String>{
publicExpressionAdapter(Contextcontext,inttextViewResourceId,List<String>objects){
super(context,textViewResourceId,objects);
}
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
if(convertView==null){
convertView=View.inflate(getContext(),R.layout.row_expression,null);
}
ImageViewimageView=(ImageView)convertView.findViewById(R.id.iv_expression);
Stringfilename=getItem(position);
intresId=getContext().getResources().getIdentifier(filename,"drawable",getContext().getPackageName());
imageView.setImageResource(resId);
returnconvertView;
}
}
[/code]
publicclassExpressionPagerAdapterextendsPagerAdapter{
privateList<View>views;
publicExpressionPagerAdapter(List<View>views){
this.views=views;
}
@Override
publicintgetCount(){
returnviews.size();
}
@Override
publicbooleanisViewFromObject(Viewarg0,Objectarg1){
returnarg0==arg1;
}
@Override
publicObjectinstantiateItem(Viewarg0,intarg1){
((ViewPager)arg0).addView(views.get(arg1));
returnviews.get(arg1);
}
@Override
publicvoiddestroyItem(Viewarg0,intarg1,Objectarg2){
((ViewPager)arg0).removeView(views.get(arg1));
}
}
[/code]界面逻辑的两个重要方法
/**
*获取表情的gridview的子view
*
*@parami
*@return
*/
privateViewgetGridChildView(inti){
Viewview=View.inflate(this,R.layout.expression_gridview,null);
ExpandGridViewgv=(ExpandGridView)view.findViewById(R.id.gridview);
List<String>list=newArrayList<String>();
if(i==1){
List<String>list1=reslist.subList(0,20);
list.addAll(list1);
}elseif(i==2){
list.addAll(reslist.subList(20,reslist.size()));
}
list.add("delete_expression");
finalExpressionAdapterexpressionAdapter=newExpressionAdapter(this,
1,list);
gv.setAdapter(expressionAdapter);
gv.setOnItemClickListener(newOnItemClickListener(){
@Override
publicvoidonItemClick(AdapterView<?>parent,Viewview,
intposition,longid){
Stringfilename=expressionAdapter.getItem(position);
try{
//文字输入框可见时,才可输入表情
//按住说话可见,不让输入表情
if(buttonSetModeKeyboard.getVisibility()!=View.VISIBLE){
if(filename!="delete_expression"){//不是删除键,显示表情
//这里用的反射,所以混淆的时候不要混淆SmileUtils这个类
@SuppressWarnings("rawtypes")
Classclz=Class
.forName("com.fanxin.app.utils.SmileUtils");
Fieldfield=clz.getField(filename);
mEditTextContent.append(SmileUtils.getSmiledText(
ChatActivity.this,(String)field.get(null)));
}else{//删除文字或者表情
if(!TextUtils.isEmpty(mEditTextContent.getText())){
intselectionStart=mEditTextContent
.getSelectionStart();//获取光标的位置
if(selectionStart>0){
Stringbody=mEditTextContent.getText()
.toString();
StringtempStr=body.substring(0,
selectionStart);
inti=tempStr.lastIndexOf("[");//获取最后一个表情的位置
if(i!=-1){
CharSequencecs=tempStr.substring(i,
selectionStart);
if(SmileUtils.containsKey(cs
.toString()))
mEditTextContent.getEditableText()
.delete(i,selectionStart);
else
mEditTextContent.getEditableText()
.delete(selectionStart-1,
selectionStart);
}else{
mEditTextContent.getEditableText()
.delete(selectionStart-1,
selectionStart);
}
}
}
}
}
}catch(Exceptione){
}
}
});
returnview;
}
publicList<String>getExpressionRes(intgetSum){
List<String>reslist=newArrayList<String>();
for(intx=1;x<=getSum;x++){
Stringfilename="ee_"+x;
reslist.add(filename);
}
returnreslist;
}
[/code]具体使用逻辑
//表情list
reslist=getExpressionRes(35);
//初始化表情viewpager
List<View>views=newArrayList<View>();
Viewgv1=getGridChildView(1);
Viewgv2=getGridChildView(2);
views.add(gv1);
views.add(gv2);
expressionViewpager.setAdapter(newExpressionPagerAdapter(views));
[/code]非常中的表情Utils类,这个要和前面重要的两个方法类联用实现表情和textview的混排,其中需要注意字段的定义要和我们发送的字段是一一对应,具体使用请详细的观看代码体会其中的具体逻辑,另外图片需要是我们正常使用的png图片,gif图片会出现黑底的情况一定要注意
publicclassSmileUtils{
publicstaticfinalStringee_1="[):]";
publicstaticfinalStringee_2="[:D]";
publicstaticfinalStringee_3="[;)]";
publicstaticfinalStringee_4="[:-o]";
publicstaticfinalStringee_5="[:p]";
publicstaticfinalStringee_6="[(H)]";
publicstaticfinalStringee_7="[:@]";
publicstaticfinalStringee_8="[:s]";
publicstaticfinalStringee_9="[:$]";
publicstaticfinalStringee_10="[:(]";
publicstaticfinalStringee_11="[:'(]";
publicstaticfinalStringee_12="[:|]";
publicstaticfinalStringee_13="[(a)]";
publicstaticfinalStringee_14="[8o|]";
publicstaticfinalStringee_15="[8-|]";
publicstaticfinalStringee_16="[+o(]";
publicstaticfinalStringee_17="[<o)]";
publicstaticfinalStringee_18="[|-)]";
publicstaticfinalStringee_19="[*-)]";
publicstaticfinalStringee_20="[:-#]";
publicstaticfinalStringee_21="[:-*]";
publicstaticfinalStringee_22="[^o)]";
publicstaticfinalStringee_23="[8-)]";
publicstaticfinalStringee_24="[(|)]";
publicstaticfinalStringee_25="[(u)]";
publicstaticfinalStringee_26="[(S)]";
publicstaticfinalStringee_27="[(*)]";
publicstaticfinalStringee_28="[(#)]";
publicstaticfinalStringee_29="[(R)]";
publicstaticfinalStringee_30="[({)]";
publicstaticfinalStringee_31="[(})]";
publicstaticfinalStringee_32="[(k)]";
publicstaticfinalStringee_33="[(F)]";
publicstaticfinalStringee_34="[(W)]";
publicstaticfinalStringee_35="[(D)]";
privatestaticfinalFactoryspannableFactory=Spannable.Factory
.getInstance();
privatestaticfinalMap<Pattern,Integer>emoticons=newHashMap<Pattern,Integer>();
static{
addPattern(emoticons,ee_1,R.drawable.ee_1);
addPattern(emoticons,ee_2,R.drawable.ee_2);
addPattern(emoticons,ee_3,R.drawable.ee_3);
addPattern(emoticons,ee_4,R.drawable.ee_4);
addPattern(emoticons,ee_5,R.drawable.ee_5);
addPattern(emoticons,ee_6,R.drawable.ee_6);
addPattern(emoticons,ee_7,R.drawable.ee_7);
addPattern(emoticons,ee_8,R.drawable.ee_8);
addPattern(emoticons,ee_9,R.drawable.ee_9);
addPattern(emoticons,ee_10,R.drawable.ee_10);
addPattern(emoticons,ee_11,R.drawable.ee_11);
addPattern(emoticons,ee_12,R.drawable.ee_12);
addPattern(emoticons,ee_13,R.drawable.ee_13);
addPattern(emoticons,ee_14,R.drawable.ee_14);
addPattern(emoticons,ee_15,R.drawable.ee_15);
addPattern(emoticons,ee_16,R.drawable.ee_16);
addPattern(emoticons,ee_17,R.drawable.ee_17);
addPattern(emoticons,ee_18,R.drawable.ee_18);
addPattern(emoticons,ee_19,R.drawable.ee_19);
addPattern(emoticons,ee_20,R.drawable.ee_20);
addPattern(emoticons,ee_21,R.drawable.ee_21);
addPattern(emoticons,ee_22,R.drawable.ee_22);
addPattern(emoticons,ee_23,R.drawable.ee_23);
addPattern(emoticons,ee_24,R.drawable.ee_24);
addPattern(emoticons,ee_25,R.drawable.ee_25);
addPattern(emoticons,ee_26,R.drawable.ee_26);
addPattern(emoticons,ee_27,R.drawable.ee_27);
addPattern(emoticons,ee_28,R.drawable.ee_28);
addPattern(emoticons,ee_29,R.drawable.ee_29);
addPattern(emoticons,ee_30,R.drawable.ee_30);
addPattern(emoticons,ee_31,R.drawable.ee_31);
addPattern(emoticons,ee_32,R.drawable.ee_32);
addPattern(emoticons,ee_33,R.drawable.ee_33);
addPattern(emoticons,ee_34,R.drawable.ee_34);
addPattern(emoticons,ee_35,R.drawable.ee_35);
}
privatestaticvoidaddPattern(Map<Pattern,Integer>map,Stringsmile,
intresource){
map.put(Pattern.compile(Pattern.quote(smile)),resource);
}
/**
*replaceexistingspannablewithsmiles
*@paramcontext
*@paramspannable
*@return
*/
publicstaticbooleanaddSmiles(Contextcontext,Spannablespannable){
booleanhasChanges=false;
for(Entry<Pattern,Integer>entry:emoticons.entrySet()){
Matchermatcher=entry.getKey().matcher(spannable);
while(matcher.find()){
booleanset=true;
for(ImageSpanspan:spannable.getSpans(matcher.start(),
matcher.end(),ImageSpan.class))
if(spannable.getSpanStart(span)>=matcher.start()
&&spannable.getSpanEnd(span)<=matcher.end())
spannable.removeSpan(span);
else{
set=false;
break;
}
if(set){
hasChanges=true;
spannable.setSpan(newImageSpan(context,entry.getValue()),
matcher.start(),matcher.end(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
returnhasChanges;
}
publicstaticSpannablegetSmiledText(Contextcontext,CharSequencetext){
Spannablespannable=spannableFactory.newSpannable(text);
addSmiles(context,spannable);
returnspannable;
}
publicstaticbooleancontainsKey(Stringkey){
booleanb=false;
for(Entry<Pattern,Integer>entry:emoticons.entrySet()){
Matchermatcher=entry.getKey().matcher(key);
if(matcher.find()){
b=true;
break;
}
}
returnb;
}
}
[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: