android 仿微信聊天气泡效果实现思路

微信聊天窗口的信息效果类似iphone上的短信效果,以气泡的形式展现,在Android上,实现这种效果主要用到ListView和BaseAdapter,配合布局以及相关素材,就可以自己做出这个效果,素材可以下一个微信的APK,然后把后缀名改成zip,直接解压,就可以得到微信里面的所有素材了。首先看一下我实现的效果:

以下是工程目录结构:

接下来就是如何实现这个效果的代码:

main.xml,这个是主布局文件,显示listview和上下两部分内容。

复制代码 代码如下:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="#f0f0e0" >

<RelativeLayout

android:id="@+id/rl_top"

android:layout_width="fill_parent"

android:layout_alignParentTop="true"

android:layout_height="wrap_content">

<TextView

android:layout_width="fill_parent"

android:layout_height="44dp"

android:gravity="center"

android:textSize="18sp"

android:background="#486a9a"

android:textColor="@android:color/white"

android:text="Chat"/>

</RelativeLayout>

<RelativeLayout

android:id="@+id/rl_bottom"

android:layout_alignParentBottom="true"

android:layout_width="fill_parent"

android:background="#486a9a"

android:paddingTop="5dp"

android:layout_height="wrap_content">

<Button

android:id="@+id/btn_send"

android:layout_width="70dp"

android:layout_height="50dp"

android:layout_alignParentRight="true"

android:layout_centerVertical="true"

android:layout_marginRight="10dp"

android:text="Send" />

<EditText

android:id="@+id/et_content"

android:layout_width="fill_parent"

android:layout_height="50dp"

android:layout_centerVertical="true"

android:layout_marginLeft="10dp"

android:layout_marginRight="10dp"

android:layout_toLeftOf="@id/btn_send"

android:textSize="16sp"/>

</RelativeLayout>

<ListView

android:id="@+id/listview"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:layout_above="@id/rl_bottom"

android:layout_below="@id/rl_top"

android:layout_marginLeft="10dp"

android:layout_marginRight="10dp"

android:layout_marginTop="10dp"

android:cacheColorHint="#00000000"

android:divider="@null"

android:listSelector="#00000000"

android:dividerHeight="3dp"

android:scrollbars="none"/>

</RelativeLayout>

然后就是listview中两种类型item的布局文件,分别是接收信息的item效果和发送信息的item效果

chat_from_item.xml是接收信息的item布局:

复制代码 代码如下:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:orientation="vertical"

android:paddingBottom="5dp"

android:layout_height="wrap_content" >

<TextView

android:id="@+id/tv_time"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_gravity="center_horizontal"

android:background="#bfbfbf"

android:paddingTop="2dp"

android:paddingBottom="2dp"

android:paddingLeft="4dp"

android:paddingRight="4dp"

android:textColor="#ffffff"

android:textSize="12sp" />

<RelativeLayout

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_marginTop="5dp" >

<ImageView

android:id="@+id/iv_user_image"

android:layout_width="50dp"

android:layout_height="50dp"

android:layout_alignParentLeft="true"

android:layout_alignParentTop="true"

android:background="@drawable/mypic"

android:focusable="false" />

<TextView

android:id="@+id/tv_content"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginLeft="5dp"

android:layout_toRightOf="@+id/iv_user_image"

android:background="@drawable/chatfrom_bg"

android:gravity="left|center"

android:clickable="true"

android:focusable="true"

android:lineSpacingExtra="2dp"

android:minHeight="50dp"

android:textColor="#ff000000"

android:textSize="14sp" />

</RelativeLayout>

</LinearLayout>

chat_to_item.xml是发送信息item的布局:

复制代码 代码如下:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:orientation="vertical"

android:paddingBottom="5dp"

android:layout_height="wrap_content" >

<TextView

android:id="@+id/tv_time"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="#bfbfbf"

android:layout_gravity="center_horizontal"

android:paddingTop="2dp"

android:paddingBottom="2dp"

android:paddingLeft="4dp"

android:paddingRight="4dp"

android:textColor="#ffffff"

android:textSize="12sp" />

<RelativeLayout

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_marginTop="5dp" >

<ImageView

android:id="@+id/iv_user_image"

android:layout_width="50dp"

android:layout_height="50dp"

android:layout_alignParentRight="true"

android:layout_alignParentTop="true"

android:background="@drawable/mypic"

android:focusable="false" />

<TextView

android:id="@+id/tv_content"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginRight="5dp"

android:layout_toLeftOf="@+id/iv_user_image"

android:background="@drawable/chatto_bg"

android:gravity="left|center"

android:clickable="true"

android:focusable="true"

android:lineSpacingExtra="2dp"

android:textColor="#ff000000"

android:textSize="14sp" />

</RelativeLayout>

</LinearLayout>

布局完成后新建一个实体类ChatEntity.java:

复制代码 代码如下:

public class ChatEntity {

private int userImage;

private String content;

private String chatTime;

private boolean isComeMsg;

public int getUserImage() {

return userImage;

}

public void setUserImage(int userImage) {

this.userImage = userImage;

}

public String getContent() {

return content;

}

public void setContent(String content) {

this.content = content;

}

public String getChatTime() {

return chatTime;

}

public void setChatTime(String chatTime) {

this.chatTime = chatTime;

}

public boolean isComeMsg() {

return isComeMsg;

}

public void setComeMsg(boolean isComeMsg) {

this.isComeMsg = isComeMsg;

}

}

最后就是主Activity,这里面包括了自己写的BaseAdapter:

复制代码 代码如下:

public class ChatDemoActivity extends Activity {

private Button sendButton = null;

private EditText contentEditText = null;

private ListView chatListView = null;

private List<ChatEntity> chatList = null;

private ChatAdapter chatAdapter = null;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);

setContentView(R.layout.main);

contentEditText = (EditText) this.findViewById(R.id.et_content);

sendButton = (Button) this.findViewById(R.id.btn_send);

chatListView = (ListView) this.findViewById(R.id.listview);

chatList = new ArrayList<ChatEntity>();

ChatEntity chatEntity = null;

for (int i = 0; i < 2; i++) {

chatEntity = new ChatEntity();

if (i % 2 == 0) {

chatEntity.setComeMsg(false);

chatEntity.setContent("Hello");

chatEntity.setChatTime("2012-09-20 15:12:32");

}else {

chatEntity.setComeMsg(true);

chatEntity.setContent("Hello,nice to meet you!");

chatEntity.setChatTime("2012-09-20 15:13:32");

}

chatList.add(chatEntity);

}

chatAdapter = new ChatAdapter(this,chatList);

chatListView.setAdapter(chatAdapter);

sendButton.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

if (!contentEditText.getText().toString().equals("")) {

//发送消息

send();

}else {

Toast.makeText(ChatDemoActivity.this, "Content is empty", Toast.LENGTH_SHORT).show();

}

}

});

}

private void send(){

ChatEntity chatEntity = new ChatEntity();

chatEntity.setChatTime("2012-09-20 15:16:34");

chatEntity.setContent(contentEditText.getText().toString());

chatEntity.setComeMsg(false);

chatList.add(chatEntity);

chatAdapter.notifyDataSetChanged();

chatListView.setSelection(chatList.size() - 1);

contentEditText.setText("");

}

private class ChatAdapter extends BaseAdapter{

private Context context = null;

private List<ChatEntity> chatList = null;

private LayoutInflater inflater = null;

private int COME_MSG = 0;

private int TO_MSG = 1;

public ChatAdapter(Context context,List<ChatEntity> chatList){

this.context = context;

this.chatList = chatList;

inflater = LayoutInflater.from(this.context);

}

@Override

public int getCount() {

return chatList.size();

}

@Override

public Object getItem(int position) {

return chatList.get(position);

}

@Override

public long getItemId(int position) {

return position;

}

@Override

public int getItemViewType(int position) {

// 区别两种view的类型,标注两个不同的变量来分别表示各自的类型

ChatEntity entity = chatList.get(position);

if (entity.isComeMsg())

{

return COME_MSG;

}else{

return TO_MSG;

}

}

@Override

public int getViewTypeCount() {

// 这个方法默认返回1,如果希望listview的item都是一样的就返回1,我们这里有两种风格,返回2

return 2;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

ChatHolder chatHolder = null;

if (convertView == null) {

chatHolder = new ChatHolder();

if (chatList.get(position).isComeMsg()) {

convertView = inflater.inflate(R.layout.chat_from_item, null);

}else {

convertView = inflater.inflate(R.layout.chat_to_item, null);

}

chatHolder.timeTextView = (TextView) convertView.findViewById(R.id.tv_time);

chatHolder.contentTextView = (TextView) convertView.findViewById(R.id.tv_content);

chatHolder.userImageView = (ImageView) convertView.findViewById(R.id.iv_user_image);

convertView.setTag(chatHolder);

}else {

chatHolder = (ChatHolder)convertView.getTag();

}

chatHolder.timeTextView.setText(chatList.get(position).getChatTime());

chatHolder.contentTextView.setText(chatList.get(position).getContent());

chatHolder.userImageView.setImageResource(chatList.get(position).getUserImage());

return convertView;

}

private class ChatHolder{

private TextView timeTextView;

private ImageView userImageView;

private TextView contentTextView;

}

}

}

 

对Android&IOS感兴趣的朋友可以加入我们的讨论QQ群,在这里,我们只讨论干货:

iOS群:220223507

Android群:282552849

游戏开发论坛:http://jiushun8.com/forum.php?mod=viewthread&tid=4371&extra=page%3D1

时间: 2024-10-05 17:52:53

android 仿微信聊天气泡效果实现思路的相关文章

android 仿微信聊天气泡效果实现思路_Android

微信聊天窗口的信息效果类似iphone上的短信效果,以气泡的形式展现,在Android上,实现这种效果主要用到ListView和BaseAdapter,配合布局以及相关素材,就可以自己做出这个效果,素材可以下一个微信的APK,然后把后缀名改成zip,直接解压,就可以得到微信里面的所有素材了.首先看一下我实现的效果: 以下是工程目录结构: 接下来就是如何实现这个效果的代码: main.xml,这个是主布局文件,显示listview和上下两部分内容. 复制代码 代码如下: <?xml version

Android仿微信底部菜单栏效果

前言 在市面上,大多数的APP都需要通过底部菜单栏来将程序的功能进行分类整理,通常都是分为3-5个大模块,从而正确有效地引导用户去使用我们的APP.实现底部菜单栏的方法也有很多种. 1.仿微信底部菜单栏(ViewPager+ImagerView+TextView) ......(其他方式后续会补充) 效果预览 首先来个开胃菜,看看实现效果: 先贴出项目所需的资源文件,这些可随个人自由更改颜色和文字 colors.xml <color name="bg_line_light_gray&quo

Android 仿微信聊天时间格式化显示功能

本文给大家分享android仿微信聊天时间格式化显示功能. 在同一年的显示规则: 如果是当天显示格式为 HH:mm 例:14:45 如果是昨天,显示格式为 昨天 HH:mm 例:昨天 13:12 如果是在同一周 显示格式为 周一 HH:mm 例:周一14:05 如果不是同一周则显示格式为 M月d日 早上或者其它 HH:mm 例: 2月5日 早上10:10 不在同一年的显示规则: 显示格式为 yyyy年M月d日 晚上或者其它 HH:mm 例:2016年2月5日 晚上18:05 代码中如果有误,请留

Android仿微信雷达扫描效果的实现方法

本文主要给大家介绍的是关于Android实现微信雷达扫描效果的相关内容,分享出来供大家参考学习,下面来看看详细的介绍: 废话不多说 先上图(用AS录制的 转换工具不是很好 所以看得效果不是很好) 效果图 示例代码 Activity 代码 public class ShapeDrawableActivity extends AppCompatActivity { private ImageView ivLightbeam; private ObjectAnimator radarScanAnim;

android仿微信聊天界面 语音录制功能_Android

本例为模仿微信聊天界面UI设计,文字发送以及语言录制UI. 1先看效果图:       第一:chat.xml设计 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent"

android仿微信聊天界面 语音录制功能

本例为模仿微信聊天界面UI设计,文字发送以及语言录制UI. 1先看效果图: 第一:chat.xml设计 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" andro

android仿微信的开门效果

有人已经发过了,我掐头去尾精简了一下     这种效果跟图和布局有很大关系,并不难.  先看布局:  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:

Android仿微信发朋友圈浏览图片效果_Android

先看一下效果吧: 下面就来说一下具体怎么实现的: 实现思路 1.首先我们要获取数据源,数据源就是我们的每条说说(包括姓名.标题.图片数组) 2.自定义适配器(ListView嵌套着GridView) 3.图片点击浏览图片(Fragment+ViewPager) 具体实现 1.初始化数据源,设置适配器,看一下代码: public class MyActivity extends Activity { /*图片显示列表*/ private ListView listView; /*图片URL数组*/

Android仿微信语音聊天功能_Android

本文实例讲述了Android仿微信语音聊天功能代码.分享给大家供大家参考.具体如下: 项目效果如下: 具体代码如下: AudioManager.java package com.xuliugen.weichat; import java.io.File; import java.io.IOException; import java.util.UUID; import android.media.MediaRecorder; public class AudioManager { private