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

以下是工程目录结构:

接下来就是如何实现这个效果的代码:
main.xml,这个是主布局文件,显示listview和上下两部分内容。
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() {@Overridepublic 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); }@Overridepublic int getCount() {return chatList.size();}@Overridepublic Object getItem(int position) {return chatList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic int getItemViewType(int position) {// 区别两种view的类型,标注两个不同的变量来分别表示各自的类型 ChatEntity entity = chatList.get(position); if (entity.isComeMsg()) { return COME_MSG; }else{ return TO_MSG; }}@Overridepublic int getViewTypeCount() {// 这个方法默认返回1,如果希望listview的item都是一样的就返回1,我们这里有两种风格,返回2return 2;}@Overridepublic 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;} }}
欢迎关注我的新浪微博和我交流:@唐韧_Ryan
- 1楼yinlinqvan昨天 22:56
- “下一个微信的APK,然后把后缀名改成zip,直接解压,就可以得到微信里面的所有素材了。”