Android模仿iphone气泡聊天讲解及源码

Android模仿iphone气泡聊天讲解及源码   [复制链接]

   
愤怒的小鸟

版主

  • TA的每日心情
    开心
    2013-9-3 11:05:05
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    • 串个门
    • 加好友
    • 打招呼
    • 发消息
    电梯直达
    楼主
      发表于 2012-5-23 10:34:17  | 只看该作者  | 倒序浏览
    分享到: 0

    这两天在做一个电子商城的商品评论功能,想到模仿微信或者iphone中的气泡聊天方式,气泡聊天是iphone内置的控件,不对开发者开放,android中更是没有提供类似的控件。于是先在百度google上搜了一下有没有类似的android实现方式,这样的帖子不多,也就局限于百度的第一页,以下面这个帖子为代表:http://blog.csdn.net/randyjiawenjie/article/details/6678738
    大致的实现方法是使用“ListView+自定义adapter+气泡背景图片”,其他的帖子也是类似,而自己想实现的效果要求气泡的大小能够“自适应聊天(短信)内容”,固定的背景图片显然不能实现这个要求。再次寻寻觅觅,找到下面这个英文帖子:http://mobiforge.com/developing/story/sms-bubble-ui-iphone-apps,大致讲解了在ios中模仿iphoe气泡的思路,其中关键是将气泡图片切割成9个栅格,如下图:
    Android模仿iphone气泡聊天讲解及源码_第1张图片

    假设将图片的9个栅格区域按逆时针方向编号,中间内容部分编号为9
    ,使用ReleativeLayout+ImageView将9张图片依次逐行排列,注意图片切割时水平方向高度和垂直方向高度要一致,布局文件如下:

    Xml代码  [url=][/url]
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:layout_width="fill_parent"  
    4.     android:layout_height="fill_parent"  
    5.     android:gravity="right"  
    6.      >  
    7.   
    8.     <RelativeLayout  
    9.         android:id="@+id/bubble_lay_1"  
    10.         android:layout_width="wrap_content"  
    11.         android:layout_height="wrap_content"  
    12.      >  
    13.          <ImageView  
    14.             android:id="@+id/right_1"  
    15.             android:background="@drawable/right_1"  
    16.             android:layout_width="wrap_content"  
    17.             android:layout_height="wrap_content"  
    18.              />  
    19.               
    20.           
    21.          <ImageView  
    22.             android:id="@+id/right_8"  
    23.             android:background="@drawable/right_8"  
    24.             android:layout_width="fill_parent"  
    25.             android:layout_height="wrap_content"  
    26.             android:layout_toRightOf="@id/right_1"  
    27.              />  
    28.           <ImageView  
    29.             android:id="@+id/right_7"  
    30.             android:background="@drawable/right_7"  
    31.             android:layout_width="wrap_content"  
    32.             android:layout_height="wrap_content"  
    33.             android:layout_toRightOf="@id/right_8"  
    34.              />  
    35.          
    36.      </RelativeLayout>  
    37.   
    38.      <RelativeLayout  
    39.         android:id="@+id/bubble_lay_2"  
    40.         android:layout_width="wrap_content"  
    41.         android:layout_height="wrap_content"  
    42.         android:layout_below="@id/bubble_lay_1"  
    43.      >  
    44.          <ImageView  
    45.             android:id="@+id/right_2"  
    46.             android:background="@drawable/right_2"  
    47.             android:layout_width="wrap_content"  
    48.             android:layout_height="100dp"  
    49.              />  
    50.               
    51.           
    52.          <TextView  
    53.             android:id="@+id/right_9"  
    54.             android:background="@drawable/right_9"  
    55.             android:textColor="#000000"  
    56.             android:layout_width="wrap_content"  
    57.             android:layout_height="wrap_content"  
    58.             android:layout_toRightOf="@id/right_2"  
    59.              />  
    60.           <ImageView  
    61.             android:id="@+id/right_6"  
    62.             android:background="@drawable/right_6"  
    63.             android:layout_width="wrap_content"  
    64.             android:layout_height="100dp"  
    65.             android:layout_toRightOf="@id/right_9"  
    66.              />  
    67.          
    68.      </RelativeLayout>  
    69.       
    70.      <RelativeLayout  
    71.         android:id="@+id/bubble_lay_3"  
    72.         android:layout_width="wrap_content"  
    73.         android:layout_height="wrap_content"  
    74.         android:layout_below="@id/bubble_lay_2"  
    75.      >  
    76.          <ImageView  
    77.             android:id="@+id/right_3"  
    78.             android:background="@drawable/right_3"  
    79.             android:layout_width="wrap_content"  
    80.             android:layout_height="wrap_content"  
    81.              />  
    82.               
    83.           
    84.          <ImageView  
    85.             android:id="@+id/right_4"  
    86.             android:background="@drawable/right_4"  
    87.              
    88.             android:layout_width="fill_parent"  
    89.             android:layout_height="wrap_content"  
    90.             android:layout_toRightOf="@id/right_3"  
    91.              />  
    92.           <ImageView  
    93.             android:id="@+id/right_5"  
    94.             android:background="@drawable/right_5"  
    95.             android:layout_width="wrap_content"  
    96.             android:layout_height="wrap_content"  
    97.             android:layout_toRightOf="@id/right_4"  
    98.              />  
    99.          
    100.      </RelativeLayout>  
    101. </RelativeLayout>
    复制代码



    中间的TextView表示聊天内容部分,截取气泡图片9号栅格中的图片作为其背景,接着在代码中根据聊天内容调整2/6号,4/8号,9号的长宽,代码如下:


    Java代码  [url=][/url]
    1.     public class TestActivity extends Activity {  
    2.          
    3.         private int textSize = 16;//聊天内容字体大小  
    4.         private String text ="heh你好呀he";//聊天内容  
    5.         private int bubbleMaxWidth = 100;//气泡的最大宽度  
    6.       
    7.         @Override  
    8.         public void onCreate(Bundle savedInstanceState) {  
    9.             super.onCreate(savedInstanceState);  
    10.             setContentView(R.layout.main);  
    11.              
    12.             this.right();  
    13.         }  
    14.          
    15.          
    16.         private void right(){  
    17.             TextView t = (TextView)findViewById(R.id.right_9);//聊天内容TextView  
    18.             ImageView img2 = (ImageView)findViewById(R.id.right_2);  
    19.             ImageView img6 = (ImageView)findViewById(R.id.right_6);  
    20.             ImageView img4 = (ImageView)findViewById(R.id.right_4);  
    21.             ImageView img8 = (ImageView)findViewById(R.id.right_8);  
    22.              
    23.             t.setTextSize(textSize);  
    24.             t.setText(text);  
    25.              
    26.            //获得聊天内容在屏幕上的宽度,4/8号的宽度等于聊天内容的宽度  
    27.             TextPaint paint = t.getPaint();  
    28.             int width = (int)(paint.measureText(text));  
    29.              
    30.             int height = textSize*2;//聊天内容只占一行的情况下,2/6/9号的宽度等于字号的两倍  
    31.          
    32.             //如果聊天内容的宽度大于气泡的最大宽度,则让它换行  
    33.             if(width>=bubbleMaxWidth){  
    34.                 height  = textSize*2*((int)(width/100)+1);//换行则调整2/6/9号的宽度  
    35.                 width = bubbleMaxWidth;  
    36.                 t.getLayoutParams().width=width;  
    37.             }  
    38.              
    39.             img2.getLayoutParams().height=height;  
    40.             img6.getLayoutParams().height=height;  
    41.             t.getLayoutParams().height=height;  
    42.       
    43.             img4.getLayoutParams().width=width;  
    44.             img8.getLayoutParams().width=width;  
    45.              
    46.             
    47.              
    48.         }  
    复制代码



    剩下的则是,自定义adapter了,代码如下:Java代码  [url=][/url]


    1.     public class ShareCommentAdapter extends BaseAdapter {  
    2.       
    3.         private Activity context;  
    4.         private List<ShareComment> commentList;  
    5.         private int textSize = 16;  
    6.         private int bubbleMaxWidth;  
    7.          
    8.         public ShareCommentAdapter (Activity context,List<ShareComment> commentList){  
    9.                 Display display = context.getWindowManager().getDefaultDisplay();  
    10.                 bubbleMaxWidth = (int)(display.getWidth()*0.6);  
    11.                 this.context = context;   
    12.                 this.commentList = commentList;   
    13.                 }   
    14.          
    15.         @Override  
    16.         public int getCount() {  
    17.             return commentList.size();  
    18.         }  
    19.       
    20.         @Override  
    21.         public Object getItem(int position) {  
    22.             return commentList.get(position);  
    23.         }  
    24.       
    25.         @Override  
    26.         public long getItemId(int position) {  
    27.             return position;  
    28.         }  
    29.       
    30.         @Override  
    31.         public View getView(int position, View convertView, ViewGroup parent) {  
    32.             // TODO Auto-generated method stub  
    33.              
    34.             LayoutInflater mInflater = LayoutInflater.from(context);  
    35.             View view = null;  
    36.             ShareComment  comment = commentList.get(position);  
    37.              
    38.             if(comment.getIsHost()==1){   
    39.                 view = mInflater.inflate(R.layout.share_comment_right_item, null);   
    40.                 this.setRightBubbleStyle(view, comment.getComment());  
    41.             }else{  
    42.                 view = mInflater.inflate(R.layout.share_comment_left_item, null);  
    43.                 this.setLeftBubbleStyle(view, comment.getComment());  
    44.             }  
    45.              
    46.             //ViewGroup.LayoutParams params = new LayoutParams(100,100);  
    47.             //view.setLayoutParams(params);  
    48.             return view;  
    49.         }  
    复制代码

    其中setLeftBubbleStyle(view, comment.getComment())就是上上面设置气泡样式的right()方法的内容,最终效果如下:


    你可能感兴趣的:(Android模仿iphone气泡聊天讲解及源码)