Android(安卓)UI【android 仿微信、QQ聊天,带表情,可翻页,带翻页拖动缓冲】
16lz
2021-01-25
转载自:
http://blog.csdn.net/lnb333666/article/details/8546497
如题,这是公司项目的一个功能模块,先上个效果图:
其次大致说说原理:
1,首先判断输入的字符,是否包含表情的文字,比如 这个表情对应的文件名为emoji_1.png,它对应的文字描述 :[可爱],如果我们在输出的是输出这么一句话:老婆,我想你了。 那么我们对应的根本文字就是:老婆,我想你了[可爱]。
2,具体的转换过程就是用正则表达式比配文字中是否含有[xxx]这类的文字,如果有,那么我们就根据拿到的[xxx]找到它对应的资源文件id,当然这其中有一个关系表,看你怎么处理这个关系了。最后将其用SpannableString替换成文字,表面上显示有图片,其实TextView里的text依然是:老婆,我想你了[可爱]。这个过程明白么?
下面贴上DEMO工程的结构:
再贴上几个重要的类:
[java] view plain copy print ?- packagecom.example.facedemo;
- importjava.util.ArrayList;
- importjava.util.HashMap;
- importjava.util.List;
- importjava.util.regex.Matcher;
- importjava.util.regex.Pattern;
- importandroid.content.Context;
- importandroid.graphics.Bitmap;
- importandroid.graphics.BitmapFactory;
- importandroid.text.Spannable;
- importandroid.text.SpannableString;
- importandroid.text.TextUtils;
- importandroid.text.style.ImageSpan;
- importandroid.util.Log;
- /**
- *
- ******************************************
- *@author廖乃波
- *@文件名称:FaceConversionUtil.java
- *@创建时间:2013-1-27下午02:34:09
- *@文件描述:表情轉換工具
- ******************************************
- */
- publicclassFaceConversionUtil{
- /**每一页表情的个数*/
- privateintpageSize=20;
- privatestaticFaceConversionUtilmFaceConversionUtil;
- /**保存于内存中的表情HashMap*/
- privateHashMap<String,String>emojiMap=newHashMap<String,String>();
- /**保存于内存中的表情集合*/
- privateList<ChatEmoji>emojis=newArrayList<ChatEmoji>();
- /**表情分页的结果集合*/
- publicList<List<ChatEmoji>>emojiLists=newArrayList<List<ChatEmoji>>();
- privateFaceConversionUtil(){
- }
- publicstaticFaceConversionUtilgetInstace(){
- if(mFaceConversionUtil==null){
- mFaceConversionUtil=newFaceConversionUtil();
- }
- returnmFaceConversionUtil;
- }
- /**
- *得到一个SpanableString对象,通过传入的字符串,并进行正则判断
- *
- *@paramcontext
- *@paramstr
- *@return
- */
- publicSpannableStringgetExpressionString(Contextcontext,Stringstr){
- SpannableStringspannableString=newSpannableString(str);
- //正则表达式比配字符串里是否含有表情,如:我好[开心]啊
- Stringzhengze="\\[[^\\]]+\\]";
- //通过传入的正则表达式来生成一个pattern
- PatternsinaPatten=Pattern.compile(zhengze,Pattern.CASE_INSENSITIVE);
- try{
- dealExpression(context,spannableString,sinaPatten,0);
- }catch(Exceptione){
- Log.e("dealExpression",e.getMessage());
- }
- returnspannableString;
- }
- /**
- *添加表情
- *
- *@paramcontext
- *@paramimgId
- *@paramspannableString
- *@return
- */
- publicSpannableStringaddFace(Contextcontext,intimgId,
- StringspannableString){
- if(TextUtils.isEmpty(spannableString)){
- returnnull;
- }
- Bitmapbitmap=BitmapFactory.decodeResource(context.getResources(),
- imgId);
- bitmap=Bitmap.createScaledBitmap(bitmap,35,35,true);
- ImageSpanimageSpan=newImageSpan(context,bitmap);
- SpannableStringspannable=newSpannableString(spannableString);
- spannable.setSpan(imageSpan,0,spannableString.length(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- returnspannable;
- }
- /**
- *对spanableString进行正则判断,如果符合要求,则以表情图片代替
- *
- *@paramcontext
- *@paramspannableString
- *@parampatten
- *@paramstart
- *@throwsException
- */
- privatevoiddealExpression(Contextcontext,
- SpannableStringspannableString,Patternpatten,intstart)
- throwsException{
- Matchermatcher=patten.matcher(spannableString);
- while(matcher.find()){
- Stringkey=matcher.group();
- //返回第一个字符的索引的文本匹配整个正则表达式,ture则继续递归
- if(matcher.start()<start){
- continue;
- }
- Stringvalue=emojiMap.get(key);
- if(TextUtils.isEmpty(value)){
- continue;
- }
- intresId=context.getResources().getIdentifier(value,"drawable",
- context.getPackageName());
- //通过上面匹配得到的字符串来生成图片资源id,下边的方法可用,但是你工程混淆的时候就有事了,你懂的。不是我介绍的重点
- //Fieldfield=R.drawable.class.getDeclaredField(value);
- //intresId=Integer.parseInt(field.get(null).toString());
- if(resId!=0){
- Bitmapbitmap=BitmapFactory.decodeResource(
- context.getResources(),resId);
- bitmap=Bitmap.createScaledBitmap(bitmap,50,50,true);
- //通过图片资源id来得到bitmap,用一个ImageSpan来包装
- ImageSpanimageSpan=newImageSpan(bitmap);
- //计算该图片名字的长度,也就是要替换的字符串的长度
- intend=matcher.start()+key.length();
- //将该图片替换字符串中规定的位置中
- spannableString.setSpan(imageSpan,matcher.start(),end,
- Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
- if(end<spannableString.length()){
- //如果整个字符串还未验证完,则继续。。
- dealExpression(context,spannableString,patten,end);
- }
- break;
- }
- }
- }
- publicvoidgetFileText(Contextcontext){
- ParseData(FileUtils.getEmojiFile(context),context);
- }
- /**
- *解析字符
- *
- *@paramdata
- */
- privatevoidParseData(List<String>data,Contextcontext){
- if(data==null){
- return;
- }
- ChatEmojiemojEentry;
- try{
- for(Stringstr:data){
- String[]text=str.split(",");
- StringfileName=text[0]
- .substring(0,text[0].lastIndexOf("."));
- emojiMap.put(text[1],fileName);
- intresID=context.getResources().getIdentifier(fileName,
- "drawable",context.getPackageName());
- if(resID!=0){
- emojEentry=newChatEmoji();
- emojEentry.setId(resID);
- emojEentry.setCharacter(text[1]);
- emojEentry.setFaceName(fileName);
- emojis.add(emojEentry);
- }
- }
- intpageCount=(int)Math.ceil(emojis.size()/20+0.1);
- for(inti=0;i<pageCount;i++){
- emojiLists.add(getData(i));
- }
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- /**
- *获取分页数据
- *
- *@parampage
- *@return
- */
- privateList<ChatEmoji>getData(intpage){
- intstartIndex=page*pageSize;
- intendIndex=startIndex+pageSize;
- if(endIndex>emojis.size()){
- endIndex=emojis.size();
- }
- //不这么写,会在viewpager加载中报集合操作异常,我也不知道为什么
- List<ChatEmoji>list=newArrayList<ChatEmoji>();
- list.addAll(emojis.subList(startIndex,endIndex));
- if(list.size()<pageSize){
- for(inti=list.size();i<pageSize;i++){
- ChatEmojiobject=newChatEmoji();
- list.add(object);
- }
- }
- if(list.size()==pageSize){
- ChatEmojiobject=newChatEmoji();
- object.setId(R.drawable.face_del_icon);
- list.add(object);
- }
- returnlist;
- }
- }
下边是表情布局,带输入框的,这样可以多个地方使用,就不不会使用太多多余代码。
- packagecom.example.facedemo;
- importjava.util.ArrayList;
- importjava.util.List;
- importandroid.content.Context;
- importandroid.graphics.Color;
- importandroid.graphics.drawable.ColorDrawable;
- importandroid.support.v4.view.ViewPager;
- importandroid.support.v4.view.ViewPager.OnPageChangeListener;
- importandroid.text.SpannableString;
- importandroid.text.TextUtils;
- importandroid.util.AttributeSet;
- importandroid.view.Gravity;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.view.ViewGroup;
- importandroid.widget.AdapterView;
- importandroid.widget.AdapterView.OnItemClickListener;
- importandroid.widget.EditText;
- importandroid.widget.GridView;
- importandroid.widget.ImageView;
- importandroid.widget.LinearLayout;
- importandroid.widget.RelativeLayout;
- /**
- *
- ******************************************
- *@author廖乃波
- *@文件名称:FaceRelativeLayout.java
- *@创建时间:2013-1-27下午02:34:17
- *@文件描述:带表情的自定义输入框
- ******************************************
- */
- publicclassFaceRelativeLayoutextendsRelativeLayoutimplements
- OnItemClickListener,OnClickListener{
- privateContextcontext;
- /**表情页的监听事件*/
- privateOnCorpusSelectedListenermListener;
- /**显示表情页的viewpager*/
- privateViewPagervp_face;
- /**表情页界面集合*/
- privateArrayList<View>pageViews;
- /**游标显示布局*/
- privateLinearLayoutlayout_point;
- /**游标点集合*/
- privateArrayList<ImageView>pointViews;
- /**表情集合*/
- privateList<List<ChatEmoji>>emojis;
- /**表情区域*/
- privateViewview;
- /**输入框*/
- privateEditTextet_sendmessage;
- /**表情数据填充器*/
- privateList<FaceAdapter>faceAdapters;
- /**当前表情页*/
- privateintcurrent=0;
- publicFaceRelativeLayout(Contextcontext){
- super(context);
- this.context=context;
- }
- publicFaceRelativeLayout(Contextcontext,AttributeSetattrs){
- super(context,attrs);
- this.context=context;
- }
- publicFaceRelativeLayout(Contextcontext,AttributeSetattrs,intdefStyle){
- super(context,attrs,defStyle);
- this.context=context;
- }
- publicvoidsetOnCorpusSelectedListener(OnCorpusSelectedListenerlistener){
- mListener=listener;
- }
- /**
- *表情选择监听
- *
- *@authornaibo-liao
- *@时间:2013-1-15下午04:32:54
- */
- publicinterfaceOnCorpusSelectedListener{
- voidonCorpusSelected(ChatEmojiemoji);
- voidonCorpusDeleted();
- }
- @Override
- protectedvoidonFinishInflate(){
- super.onFinishInflate();
- emojis=FaceConversionUtil.getInstace().emojiLists;
- onCreate();
- }
- privatevoidonCreate(){
- Init_View();
- Init_viewPager();
- Init_Point();
- Init_Data();
- }
- @Override
- publicvoidonClick(Viewv){
- switch(v.getId()){
- caseR.id.btn_face:
- //隐藏表情选择框
- if(view.getVisibility()==View.VISIBLE){
- view.setVisibility(View.GONE);
- }else{
- view.setVisibility(View.VISIBLE);
- }
- break;
- caseR.id.et_sendmessage:
- //隐藏表情选择框
- if(view.getVisibility()==View.VISIBLE){
- view.setVisibility(View.GONE);
- }
- break;
- }
- }
- /**
- *隐藏表情选择框
- */
- publicbooleanhideFaceView(){
- //隐藏表情选择框
- if(view.getVisibility()==View.VISIBLE){
- view.setVisibility(View.GONE);
- returntrue;
- }
- returnfalse;
- }
- /**
- *初始化控件
- */
- privatevoidInit_View(){
- vp_face=(ViewPager)findViewById(R.id.vp_contains);
- et_sendmessage=(EditText)findViewById(R.id.et_sendmessage);
- layout_point=(LinearLayout)findViewById(R.id.iv_image);
- et_sendmessage.setOnClickListener(this);
- findViewById(R.id.btn_face).setOnClickListener(this);
- view=findViewById(R.id.ll_facechoose);
- }
- /**
- *初始化显示表情的viewpager
- */
- privatevoidInit_viewPager(){
- pageViews=newArrayList<View>();
- //左侧添加空页
- ViewnullView1=newView(context);
- //设置透明背景
- nullView1.setBackgroundColor(Color.TRANSPARENT);
- pageViews.add(nullView1);
- //中间添加表情页
- faceAdapters=newArrayList<FaceAdapter>();
- for(inti=0;i<emojis.size();i++){
- GridViewview=newGridView(context);
- FaceAdapteradapter=newFaceAdapter(context,emojis.get(i));
- view.setAdapter(adapter);
- faceAdapters.add(adapter);
- view.setOnItemClickListener(this);
- view.setNumColumns(7);
- view.setBackgroundColor(Color.TRANSPARENT);
- view.setHorizontalSpacing(1);
- view.setVerticalSpacing(1);
- view.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
- view.setCacheColorHint(0);
- view.setPadding(5,0,5,0);
- view.setSelector(newColorDrawable(Color.TRANSPARENT));
- view.setLayoutParams(newLayoutParams(LayoutParams.FILL_PARENT,
- LayoutParams.WRAP_CONTENT));
- view.setGravity(Gravity.CENTER);
- pageViews.add(view);
- }
- //右侧添加空页面
- ViewnullView2=newView(context);
- //设置透明背景
- nullView2.setBackgroundColor(Color.TRANSPARENT);
- pageViews.add(nullView2);
- }
- /**
- *初始化游标
- */
- privatevoidInit_Point(){
- pointViews=newArrayList<ImageView>();
- ImageViewimageView;
- for(inti=0;i<pageViews.size();i++){
- imageView=newImageView(context);
- imageView.setBackgroundResource(R.drawable.d1);
- LinearLayout.LayoutParamslayoutParams=newLinearLayout.LayoutParams(
- newViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,
- LayoutParams.WRAP_CONTENT));
- layoutParams.leftMargin=10;
- layoutParams.rightMargin=10;
- layoutParams.width=8;
- layoutParams.height=8;
- layout_point.addView(imageView,layoutParams);
- if(i==0||i==pageViews.size()-1){
- imageView.setVisibility(View.GONE);
- }
- if(i==1){
- imageView.setBackgroundResource(R.drawable.d2);
- }
- pointViews.add(imageView);
- }
- }
- /**
- *填充数据
- */
- privatevoidInit_Data(){
- vp_face.setAdapter(newViewPagerAdapter(pageViews));
- vp_face.setCurrentItem(1);
- current=0;
- vp_face.setOnPageChangeListener(newOnPageChangeListener(){
- @Override
- publicvoidonPageSelected(intarg0){
- current=arg0-1;
- //描绘分页点
- draw_Point(arg0);
- //如果是第一屏或者是最后一屏禁止滑动,其实这里实现的是如果滑动的是第一屏则跳转至第二屏,如果是最后一屏则跳转到倒数第二屏.
- if(arg0==pointViews.size()-1||arg0==0){
- if(arg0==0){
- vp_face.setCurrentItem(arg0+1);//第二屏会再次实现该回调方法实现跳转.
- pointViews.get(1).setBackgroundResource(R.drawable.d2);
- }else{
- vp_face.setCurrentItem(arg0-1);//倒数第二屏
- pointViews.get(arg0-1).setBackgroundResource(
- R.drawable.d2);
- }
- }
- }
- @Override
- publicvoidonPageScrolled(intarg0,floatarg1,intarg2){
- }
- @Override
- publicvoidonPageScrollStateChanged(intarg0){
- }
- });
- }
- /**
- *绘制游标背景
- */
- publicvoiddraw_Point(intindex){
- for(inti=1;i<pointViews.size();i++){
- if(index==i){
- pointViews.get(i).setBackgroundResource(R.drawable.d2);
- }else{
- pointViews.get(i).setBackgroundResource(R.drawable.d1);
- }
- }
- }
- @Override
- publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2,longarg3){
- ChatEmojiemoji=(ChatEmoji)faceAdapters.get(current).getItem(arg2);
- if(emoji.getId()==R.drawable.face_del_icon){
- intselection=et_sendmessage.getSelectionStart();
- Stringtext=et_sendmessage.getText().toString();
- if(selection>0){
- Stringtext2=text.substring(selection-1);
- if("]".equals(text2)){
- intstart=text.lastIndexOf("[");
- intend=selection;
- et_sendmessage.getText().delete(start,end);
- return;
- }
- et_sendmessage.getText().delete(selection-1,selection);
- }
- }
- if(!TextUtils.isEmpty(emoji.getCharacter())){
- if(mListener!=null)
- mListener.onCorpusSelected(emoji);
- SpannableStringspannableString=FaceConversionUtil.getInstace()
- .addFace(getContext(),emoji.getId(),emoji.getCharacter());
- et_sendmessage.append(spannableString);
- }
- }
- }
接下来是聊天数据填充器的
- packagecom.example.facedemo;
- importandroid.content.Context;
- importandroid.text.SpannableString;
- importandroid.view.LayoutInflater;
- importandroid.view.View;
- importandroid.view.ViewGroup;
- importandroid.widget.BaseAdapter;
- importandroid.widget.TextView;
- importjava.util.List;
- /**
- *
- ******************************************
- *@author廖乃波
- *@文件名称:ChatMsgAdapter.java
- *@创建时间:2013-1-27下午02:33:16
- *@文件描述:消息数据填充起
- ******************************************
- */
- publicclassChatMsgAdapterextendsBaseAdapter{
- publicstaticinterfaceIMsgViewType{
- intIMVT_COM_MSG=0;
- intIMVT_TO_MSG=1;
- }
- privateList<ChatMsgEntity>coll;
- privateLayoutInflatermInflater;
- privateContextcontext;
- publicChatMsgAdapter(Contextcontext,List<ChatMsgEntity>coll){
- this.coll=coll;
- mInflater=LayoutInflater.from(context);
- this.context=context;
- }
- publicintgetCount(){
- returncoll.size();
- }
- publicObjectgetItem(intposition){
- returncoll.get(position);
- }
- publiclonggetItemId(intposition){
- returnposition;
- }
- publicintgetItemViewType(intposition){
- ChatMsgEntityentity=coll.get(position);
- if(entity.getMsgType()){
- returnIMsgViewType.IMVT_COM_MSG;
- }else{
- returnIMsgViewType.IMVT_TO_MSG;
- }
- }
- publicintgetViewTypeCount(){
- return2;
- }
- publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
- ChatMsgEntityentity=coll.get(position);
- booleanisComMsg=entity.getMsgType();
- ViewHolderviewHolder=null;
- if(convertView==null){
- if(isComMsg){
- convertView=mInflater.inflate(
- R.layout.chatting_item_msg_text_left,null);
- }else{
- convertView=mInflater.inflate(
- R.layout.chatting_item_msg_text_right,null);
- }
- viewHolder=newViewHolder();
- viewHolder.tvSendTime=(TextView)convertView
- .findViewById(R.id.tv_sendtime);
- viewHolder.tvContent=(TextView)convertView
- .findViewById(R.id.tv_chatcontent);
- viewHolder.isComMsg=isComMsg;
- convertView.setTag(viewHolder);
- }else{
- viewHolder=(ViewHolder)convertView.getTag();
- }
- viewHolder.tvSendTime.setText(entity.getDate());
- SpannableStringspannableString=FaceConversionUtil.getInstace().getExpressionString(context,entity.getText());
- viewHolder.tvContent.setText(spannableString);
- returnconvertView;
- }
- classViewHolder{
- publicTextViewtvSendTime;
- publicTextViewtvContent;
- publicbooleanisComMsg=true;
- }
- }
- packagecom.example.facedemo;
- importjava.io.BufferedReader;
- importjava.io.IOException;
- importjava.io.InputStream;
- importjava.io.InputStreamReader;
- importjava.util.ArrayList;
- importjava.util.List;
- importandroid.content.Context;
- /**
- *
- ******************************************
- *@author廖乃波
- *@文件名称:FileUtils.java
- *@创建时间:2013-1-27下午02:35:09
- *@文件描述:文件工具类
- ******************************************
- */
- publicclassFileUtils{
- /**
- *读取表情配置文件
- *
- *@paramcontext
- *@return
- */
- publicstaticList<String>getEmojiFile(Contextcontext){
- try{
- List<String>list=newArrayList<String>();
- InputStreamin=context.getResources().getAssets().open("emoji");
- BufferedReaderbr=newBufferedReader(newInputStreamReader(in,
- "UTF-8"));
- Stringstr=null;
- while((str=br.readLine())!=null){
- list.add(str);
- }
- returnlist;
- }catch(IOExceptione){
- e.printStackTrace();
- }
- returnnull;
- }
- }
下边这个是表情翻页的数据填充,用的是viewpager,每一页填充的是一个gridview [java] view plain copy print ?
- packagecom.example.facedemo;
- importjava.util.List;
- importandroid.support.v4.view.PagerAdapter;
- importandroid.support.v4.view.ViewPager;
- importandroid.view.View;
- /**
- *
- ******************************************
- *@author廖乃波
- *@文件名称:ViewPagerAdapter.java
- *@创建时间:2013-1-27下午02:35:27
- *@文件描述:ViewPager数据填充器,切记做其他操作!!!只填充View!!!!
- ******************************************
- */
- publicclassViewPagerAdapterextendsPagerAdapter{
- privateList<View>pageViews;
- publicViewPagerAdapter(List<View>pageViews){
- super();
- this.pageViews=pageViews;
- }
- //显示数目
- @Override
- publicintgetCount(){
- returnpageViews.size();
- }
- @Override
- publicbooleanisViewFromObject(Viewarg0,Objectarg1){
- returnarg0==arg1;
- }
- @Override
- publicintgetItemPosition(Objectobject){
- returnsuper.getItemPosition(object);
- }
- @Override
- publicvoiddestroyItem(Viewarg0,intarg1,Objectarg2){
- ((ViewPager)arg0).removeView(pageViews.get(arg1));
- }
- /***
- *获取每一个item�?类于listview中的getview
- */
- @Override
- publicObjectinstantiateItem(Viewarg0,intarg1){
- ((ViewPager)arg0).addView(pageViews.get(arg1));
- returnpageViews.get(arg1);
- }
- }
最后呢,是表情的配置文件,你想怎么搞都行,我就这么搞的
- emoji_1.png,[可爱]
- emoji_2.png,[笑脸]
- emoji_3.png,[囧]
- emoji_4.png,[生气]
- emoji_5.png,[鬼脸]
- emoji_6.png,[花心]
- emoji_7.png,[害怕]
- emoji_8.png,[我汗]
- emoji_9.png,[尴尬]
- emoji_10.png,[哼哼]
- emoji_11.png,[忧郁]
- emoji_12.png,[呲牙]
- emoji_13.png,[媚眼]
- emoji_14.png,[累]
- emoji_15.png,[苦逼]
- emoji_16.png,[瞌睡]
- emoji_17.png,[哎呀]
- emoji_18.png,[刺瞎]
- emoji_19.png,[哭]
- emoji_20.png,[激动]
- emoji_21.png,[难过]
- emoji_22.png,[害羞]
- emoji_23.png,[高兴]
- emoji_24.png,[愤怒]
- emoji_25.png,[亲]
- emoji_26.png,[飞吻]
- emoji_27.png,[得意]
- emoji_28.png,[惊恐]
- emoji_29.png,[口罩]
- emoji_30.png,[惊讶]
- emoji_31.png,[委屈]
- emoji_32.png,[生病]
- emoji_33.png,[红心]
- emoji_34.png,[心碎]
- emoji_35.png,[玫瑰]
- emoji_36.png,[花]
- emoji_37.png,[外星人]
- emoji_38.png,[金牛座]
- emoji_39.png,[双子座]
- emoji_40.png,[巨蟹座]
- emoji_41.png,[狮子座]
- emoji_42.png,[处女座]
- emoji_43.png,[天平座]
- emoji_44.png,[天蝎座]
- emoji_45.png,[射手座]
- emoji_46.png,[摩羯座]
- emoji_47.png,[水瓶座]
- emoji_48.png,[白羊座]
- emoji_49.png,[双鱼座]
- emoji_50.png,[星座]
- emoji_51.png,[男孩]
- emoji_52.png,[女孩]
- emoji_53.png,[嘴唇]
- emoji_54.png,[爸爸]
- emoji_55.png,[妈妈]
- emoji_56.png,[衣服]
- emoji_57.png,[皮鞋]
- emoji_58.png,[照相]
- emoji_59.png,[电话]
- emoji_60.png,[石头]
- emoji_61.png,[胜利]
- emoji_62.png,[禁止]
- emoji_63.png,[滑雪]
- emoji_64.png,[高尔夫]
- emoji_65.png,[网球]
- emoji_66.png,[棒球]
- emoji_67.png,[冲浪]
- emoji_68.png,[足球]
- emoji_69.png,[小鱼]
- emoji_70.png,[问号]
- emoji_71.png,[叹号]
- emoji_179.png,[顶]
- emoji_180.png,[写字]
- emoji_181.png,[衬衫]
- emoji_182.png,[小花]
- emoji_183.png,[郁金香]
- emoji_184.png,[向日葵]
- emoji_185.png,[鲜花]
- emoji_186.png,[椰树]
- emoji_187.png,[仙人掌]
- emoji_188.png,[气球]
- emoji_189.png,[炸弹]
- emoji_190.png,[喝彩]
- emoji_191.png,[剪子]
- emoji_192.png,[蝴蝶结]
- emoji_193.png,[机密]
- emoji_194.png,[铃声]
- emoji_195.png,[女帽]
- emoji_196.png,[裙子]
- emoji_197.png,[理发店]
- emoji_198.png,[和服]
- emoji_199.png,[比基尼]
- emoji_200.png,[拎包]
- emoji_201.png,[拍摄]
- emoji_202.png,[铃铛]
- emoji_203.png,[音乐]
- emoji_204.png,[心星]
- emoji_205.png,[粉心]
- emoji_206.png,[丘比特]
- emoji_207.png,[吹气]
- emoji_208.png,[口水]
- emoji_209.png,[对]
- emoji_210.png,[错]
- emoji_211.png,[绿茶]
- emoji_212.png,[面包]
- emoji_213.png,[面条]
- emoji_214.png,[咖喱饭]
- emoji_215.png,[饭团]
- emoji_216.png,[麻辣烫]
- emoji_217.png,[寿司]
- emoji_218.png,[苹果]
- emoji_219.png,[橙子]
- emoji_220.png,[草莓]
- emoji_221.png,[西瓜]
- emoji_222.png,[柿子]
- emoji_223.png,[眼睛]
- emoji_224.png,[好的]
忘了布局文件,哇哈哈
- <?xmlversion="1.0"encoding="utf-8"?>
- <com.example.facedemo.FaceRelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/FaceRelativeLayout"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- <RelativeLayout
- android:id="@+id/rl_input"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:background="@drawable/chat_footer_bg">
- <ImageButton
- android:id="@+id/btn_face"
- android:layout_width="40dip"
- android:layout_height="40dip"
- android:layout_alignParentLeft="true"
- android:layout_centerVertical="true"
- android:layout_marginLeft="8dip"
- android:background="@drawable/chat_send_btn"
- android:src="@drawable/ib_face"/>
- <Button
- android:id="@+id/btn_send"
- android:layout_width="60dp"
- android:layout_height="40dp"
- android:layout_alignParentRight="true"
- android:layout_centerVertical="true"
- android:layout_marginRight="10dp"
- android:background="@drawable/chat_send_btn"
- android:text="发送"/>
- <EditText
- android:id="@+id/et_sendmessage"
- android:layout_width="fill_parent"
- android:layout_height="40dp"
- android:layout_centerVertical="true"
- android:layout_marginLeft="8dp"
- android:layout_marginRight="10dp"
- android:layout_toLeftOf="@id/btn_send"
- android:layout_toRightOf="@id/btn_face"
- android:background="@drawable/login_edit_normal"
- android:singleLine="true"
- android:textSize="18sp"/>
- </RelativeLayout>
- <RelativeLayout
- android:id="@+id/ll_facechoose"
- android:layout_width="fill_parent"
- android:layout_height="124dip"
- android:layout_below="@id/rl_input"
- android:background="#f6f5f5"
- android:visibility="gone">
- <android.support.v4.view.ViewPager
- android:id="@+id/vp_contains"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
- </android.support.v4.view.ViewPager>
- <LinearLayout
- android:id="@+id/iv_image"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_alignParentBottom="true"
- android:layout_marginBottom="6dip"
- android:gravity="center"
- android:orientation="horizontal">
- </LinearLayout>
- </RelativeLayout>
- </com.example.facedemo.FaceRelativeLayout>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Demo <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
更多相关文章
- 一款常用的 Squid 日志分析工具
- 分支和循环(二)(零基础学习C语言)
- GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
- RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
- Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
- android.content.res.Resources$NotFoundException: Resource is
- Android关于arm64-v8a、armeabi-v7a、armeabi、X86的so文件兼容
- 锦囊篇|一文摸懂ButterKnife
- Android(安卓)开发手记三