亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

android 仿微信聊天氣泡效果實現思路

2020-04-11 12:30:05
字體:
來源:轉載
供稿:網友
微信聊天窗口的信息效果類似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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91九色视频导航| 成人免费激情视频| 亚洲精品自拍偷拍| 精品视频在线播放免| 成人一区二区电影| 在线看日韩av| 色噜噜狠狠狠综合曰曰曰| 国产欧美在线看| 热99久久精品| 亚洲www在线观看| 日韩欧美在线视频免费观看| 日韩欧美成人免费视频| 亚洲美女精品成人在线视频| 国产91精品黑色丝袜高跟鞋| 欧美大片va欧美在线播放| 91免费看片网站| 高清在线视频日韩欧美| 色综合伊人色综合网| 福利视频一区二区| 日韩成人在线免费观看| 精品无码久久久久久国产| 中文字幕亚洲综合| 欧洲成人性视频| 91香蕉嫩草神马影院在线观看| 亚洲午夜未满十八勿入免费观看全集| 国产精品人成电影在线观看| 日本一欧美一欧美一亚洲视频| 久久青草精品视频免费观看| 97**国产露脸精品国产| 成人免费网站在线观看| 国产女精品视频网站免费| 日韩网站免费观看| 91精品国产成人www| 国产精品老女人精品视频| 久久久久一本一区二区青青蜜月| 81精品国产乱码久久久久久| 精品国产老师黑色丝袜高跟鞋| 欧美性生交大片免费| 久久影视电视剧免费网站清宫辞电视| 777国产偷窥盗摄精品视频| 国产69精品久久久久9| 亚洲黄页网在线观看| 日韩大陆毛片av| 亚洲天堂av图片| 国产精品福利久久久| 一本色道久久综合亚洲精品小说| 国产欧美最新羞羞视频在线观看| 久久精品亚洲热| 亚洲丝袜av一区| 国产日韩中文字幕在线| 亚洲自拍av在线| 97在线视频免费播放| 亚洲毛茸茸少妇高潮呻吟| 中文字幕日韩有码| 成人网在线免费看| 懂色aⅴ精品一区二区三区蜜月| 久久久久久国产三级电影| 国产精品av电影| 欧美日韩精品中文字幕| 国产精品h在线观看| 欧日韩不卡在线视频| 精品国内亚洲在观看18黄| 国产精品久久久久久久久久久新郎| 亚洲精品ady| 欧美在线视频观看免费网站| 欧美精品激情视频| 国产日韩在线亚洲字幕中文| 97视频免费在线看| 久久青草精品视频免费观看| 成人h猎奇视频网站| 一本一本久久a久久精品牛牛影视| 全亚洲最色的网站在线观看| 久久久久久久久久久久久久久久久久av| 成人中心免费视频| 久久久国产精彩视频美女艺术照福利| 在线a欧美视频| 久久人91精品久久久久久不卡| 成人性生交大片免费观看嘿嘿视频| 91久热免费在线视频| 久久久久久久久久久91| 亚洲大胆美女视频| 亚洲黄色www网站| 久久福利视频网| 国产精品美女视频网站| 国产精彩精品视频| 亚洲人成自拍网站| 国产精品爽黄69天堂a| 91在线观看免费网站| 欧美日韩精品二区| 欧美亚洲国产日本| 亚洲欧洲国产一区| 亚洲一区二区三区四区视频| 日韩av网站电影| 国产精品亚洲аv天堂网| 国产香蕉精品视频一区二区三区| 亚洲成人激情在线| 国产精品中文字幕在线| 国产精品久久一区| 中国日韩欧美久久久久久久久| 亚洲欧美日韩中文在线制服| 性色av一区二区咪爱| 久热爱精品视频线路一| 97视频国产在线| 91日本视频在线| 久久亚洲精品成人| 激情久久av一区av二区av三区| 欧美精品电影在线| 92版电视剧仙鹤神针在线观看| 亚洲精品少妇网址| 久久久999国产| 亚洲娇小xxxx欧美娇小| 亚洲老板91色精品久久| 高清日韩电视剧大全免费播放在线观看| 亚洲已满18点击进入在线看片| 亚洲精品永久免费| 欧美成人h版在线观看| 亚洲高清福利视频| 亚洲无限av看| 国产精品第一视频| 成人在线小视频| 欧美视频国产精品| 久久久亚洲福利精品午夜| 日韩欧美中文免费| 国产成人一区二区三区电影| 国产视频福利一区| 日韩国产在线看| 国产精品视频地址| 色狠狠久久aa北条麻妃| 91探花福利精品国产自产在线| 成人97在线观看视频| 国产精品久久久久久久久| 亚洲午夜激情免费视频| 91中文精品字幕在线视频| 在线观看91久久久久久| 日韩电影大全免费观看2023年上| 亚洲国产私拍精品国模在线观看| 日韩有码在线视频| 日韩电影中文字幕在线观看| 欧美自拍视频在线观看| 欧美日韩国产色| 久久99视频精品| 日本韩国在线不卡| 91色视频在线导航| 国产精品久久久久一区二区| 91精品国产91久久久久久| 日韩**中文字幕毛片| 国产精品久久久久久久久久小说| 亚洲剧情一区二区| 中文字幕成人精品久久不卡| 亚洲精品自拍视频| 精品无人区太爽高潮在线播放| 欧美黑人xxx| 欧美日韩一区二区精品| 亚洲精品视频免费在线观看| 亚洲精品久久久久久久久| 成人中文字幕+乱码+中文字幕| 欧美激情精品在线| 成人做爽爽免费视频| 国产日韩欧美中文在线播放| 国产日本欧美视频| 欧美尺度大的性做爰视频| 国产成+人+综合+亚洲欧洲| 国产一区二区三区三区在线观看| 精品国产91久久久久久|