QQ对话框、背景渐变色
2015-08-31 11:27
260 查看
在drawable中新建文件type的类型还有圆形扇形
聊天程序设计
主布局list_messagexml
单条左边Msg的布局send_receivexml
单条右边Msg的布局send_rightxml
Msg的适配器类
MyMsg类
主函数类
Image的布局teache_imagexml
ExpresionAdapter 的适配器
PopupWindow的布局popupwindowxml
聊天程序设计
主布局list_messagexml
单条左边Msg的布局send_receivexml
单条右边Msg的布局send_rightxml
Msg的适配器类
MyMsg类
主函数类
Image的布局teache_imagexml
ExpresionAdapter 的适配器
PopupWindow的布局popupwindowxml
在drawable中新建文件,type的类型还有圆形,扇形
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <gradient android:type="linear" android:startColor="#aee3d9" android:centerColor="#d5decd" android:endColor="#fff4de" android:angle="-90"/> </shape>
聊天程序设计
主布局(list_message.xml)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <LinearLayout android:id="@+id/grid_in_below" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#18b4ed" android:gravity="center" android:orientation="horizontal" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:padding="10dp" android:text="杜 Q" android:textSize="20sp" /> </LinearLayout> <ListView android:id="@+id/msg_list_view" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" android:background="@drawable/dialog_background" android:cacheColorHint="#ffffffff" android:divider="#55ff0000" > </ListView> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#ebecee" android:gravity="center" > <ImageView android:id="@+id/image_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="0.20" android:src="@drawable/eoj" /> <Button android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom" android:layout_marginBottom="5dp" android:layout_marginLeft="5dp" android:layout_marginTop="5dp" /> <Button android:id="@+id/left_send" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_gravity="bottom" android:layout_margin="5dp" android:background="@drawable/obtain_verification" android:padding="5dp" android:text="left" /> <EditText android:id="@+id/input_text" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="5dp" android:layout_weight="1" android:background="@drawable/edit_shape" android:ems="10" android:hint="请输入要发送的内容" android:inputType="textMultiLine" android:maxHeight="200dp" android:maxLines="8" android:minHeight="30dp" android:paddingBottom="5dp" android:paddingTop="5dp" > </EditText> <Button android:id="@+id/right_send" android:layout_width="wrap_content" android:layout_height="30dp" android:layout_gravity="bottom" android:layout_margin="5dp" android:background="@drawable/obtain_verification" android:padding="5dp" android:text="right" /> </LinearLayout> <GridView android:id="@+id/image_gridView" android:layout_width="match_parent" android:layout_height="200dp" android:background="#ffffff" android:numColumns="5" android:visibility="gone" > </GridView> </LinearLayout>
单条左边Msg的布局(send_receive.xml)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/time" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:padding="10dp" android:text="" android:textColor="#000000" /> <LinearLayout android:id="@+id/left_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="left" > <ImageView android:id="@+id/left_image_view_head" android:layout_width="70dp" android:layout_height="70dp" android:src="@drawable/ic_launcher" /> <LinearLayout android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/left_office_title_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/yingzhang_shape_background" android:text="营长" android:textColor="@color/white" android:textSize="15sp" /> <TextView android:id="@+id/left_nicheng" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="昵称" android:textColor="#000000" /> </LinearLayout> <TextView android:id="@+id/left_msg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="70dp" android:background="@drawable/eng" android:gravity="center" android:text="dddddddddddddddddddddddddddddddddddddddd" android:textColor="#000000" android:textSize="20sp" /> </LinearLayout> </LinearLayout> </LinearLayout>
单条右边Msg的布局(send_right.xml)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="right" android:orientation="vertical" > <TextView android:id="@+id/right_time" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:padding="10dp" android:text="" android:textColor="#000000" /> <LinearLayout android:id="@+id/right_layout" android:layout_width="wrap_content" android:layout_height="wrap_content" > <LinearLayout android:layout_width="0dip" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="right" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp" android:gravity="right" > <TextView android:id="@+id/right_nicheng" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="454" android:textColor="#000000" /> <TextView android:id="@+id/right_office_title_text" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/yingzhang_shape_background" android:text="营长" /> </LinearLayout> <TextView android:id="@+id/right_msg" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="70dp" android:background="@drawable/eog" android:gravity="center" android:text="kl" android:textColor="#000000" android:textSize="20sp" /> </LinearLayout> <ImageView android:id="@+id/right_image_view_head" android:layout_width="70dp" android:layout_height="70dp" android:src="@drawable/ic_launcher" /> </LinearLayout> </LinearLayout>
Msg的适配器类
package com.normal.mymsg; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import com.test.login.R; import com.test.message_send_receive.Msg; import android.graphics.drawable.Drawable; import android.text.Html; import android.text.Html.ImageGetter; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.SimpleAdapter; import android.widget.TextView; public class MyAdapter extends BaseAdapter { //给短信设置不同的类型,根据不同的类型选择不同的适配器 public static final int TYPE_RECEIVED = 0; public static final int TYPE_SEND = 1; //因为有两种类型,所以type的最多有两种 public static final int MAX_TYPE = 2; //得到LayoutInflater private LayoutInflater mInflater; //把主文件集合中的数据传递过来 private List<MyMsg> mData; //Spanned的一个参数 private Html.ImageGetter mImageGetter; //时间转换形式 private SimpleDateFormat mFormat = new SimpleDateFormat("EE HH:mm"); public MyAdapter(LayoutInflater mInflater, List<MyMsg> mData, Html.ImageGetter mImageGetter) { this.mInflater = mInflater; this.mData = mData; this.mImageGetter = mImageGetter; } @Override public int getItemViewType(int position) { // 得到布局的类型 return mData.get(position).getType(); } // 查看缓存类型的数量 @Override public int getViewTypeCount() { return MAX_TYPE; } @Override public int getCount() { //都是根据传入的集合进行设置 return mData.size(); } // @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { int type = getItemViewType(position); ViewHolderRight vRight = null; ViewHolder viewHolder = null; if (convertView == null) { //通过类型选择要填充的视图布局 switch (type) { case TYPE_RECEIVED: convertView = mInflater.inflate(R.layout.send_receive, null); viewHolder = new ViewHolder(); viewHolder.leftLayout = (LinearLayout) convertView.findViewById(R.id.left_layout); viewHolder.imageView_header = (ImageView) convertView.findViewById(R.id.left_image_view_head); viewHolder.textview_time = (TextView) convertView.findViewById(R.id.time); viewHolder.textview_message = (TextView) convertView.findViewById(R.id.left_msg); viewHolder.textview_nicheng = (TextView) convertView.findViewById(R.id.left_nicheng); viewHolder.textview_ofice_title = (TextView) convertView.findViewById(R.id.left_office_title_text); convertView.setTag(viewHolder); break; case TYPE_SEND: convertView = mInflater.inflate(R.layout.send_right, null); vRight = new ViewHolderRight(); vRight.rightLayout = (LinearLayout) convertView.findViewById(R.id.right_layout); vRight.imageView_header = (ImageView) convertView.findViewById(R.id.right_image_view_head); vRight.textview_time = (TextView) convertView.findViewById(R.id.right_time); vRight.textview_message = (TextView) convertView.findViewById(R.id.right_msg); vRight.textview_nicheng = (TextView) convertView.findViewById(R.id.right_nicheng); vRight.textview_ofice_title = (TextView) convertView.findViewById(R.id.right_office_title_text); convertView.setTag(vRight); break; default: break; } } MyMsg msg = mData.get(position); //通过类型赋给不同布局的参数值 switch (type) { case TYPE_RECEIVED: viewHolder = (ViewHolder) convertView.getTag(); viewHolder.imageView_header.setImageResource(R.drawable.ic_launcher); String time = mFormat.format(new Date(msg.getTime())); viewHolder.textview_time.setText(time); viewHolder.textview_message.setText(Html.fromHtml(msg.getMessage(), mImageGetter, null)); viewHolder.textview_nicheng.setText(msg.getNicheng()); viewHolder.textview_ofice_title.setText(msg.getOffice_title()); break; case TYPE_SEND: vRight = (ViewHolderRight) convertView.getTag(); vRight.imageView_header.setImageResource(R.drawable.ic_launcher); String time2 = mFormat.format(new Date(msg.getTime())); vRight.textview_time.setText(time2); vRight.textview_message.setText(Html.fromHtml(msg.getMessage(), mImageGetter, null)); vRight.textview_nicheng.setText(msg.getNicheng()); vRight.textview_ofice_title.setText(msg.getOffice_title()); break; default: break; } return convertView; } class ViewHolder { LinearLayout leftLayout; ImageView imageView_header; TextView textview_ofice_title; TextView textview_nicheng; TextView textview_time; TextView textview_message; } class ViewHolderRight { LinearLayout rightLayout; ImageView imageView_header; TextView textview_ofice_title; TextView textview_nicheng; TextView textview_time; TextView textview_message; } }
MyMsg类
package com.normal.mymsg; import android.text.Spanned; public class MyMsg { private int image; private String office_title; private String nicheng; private Long time; private String message; private int type; public static final int TYPE_RECEIVED=0; public static final int TYPE_SEND=1; public int getType() { return type; } public void setType(int type) { this.type = type; } public MyMsg(int image, String office_title, String nicheng, Long time, String message) { this.image = image; this.office_title = office_title; this.nicheng = nicheng; this.time = time; this.message = message; } public void setImage(int image) { this.image = image; } public void setOffice_title(String office_title) { this.office_title = office_title; } public void setNicheng(String nicheng) { this.nicheng = nicheng; } public void setTime(Long time) { this.time = time; } public void setMessage(String message) { this.message = message; } public MyMsg() { } public int getImage() { return image; } public String getOffice_title() { return office_title; } public String getNicheng() { return nicheng; } public Long getTime() { return time; } public String getMessage() { return message; } }
主函数类
package com.test.message_send_receive; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import com.normal.image.ExpresionAdapter; import com.normal.mymsg.MyAdapter; import com.normal.mymsg.MyMsg; import com.test.login.R; import com.test.login.R.layout; import com.test.message_image.ConcreteWatched; import com.test.message_image.ImageAdapter; import com.test.message_image.ImageDialog; import com.test.message_image.MsgImage; import com.test.message_image.Watched; import android.app.Activity; import android.content.DialogInterface; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v7.app.AlertDialog; import android.text.Html; import android.text.SpannableString; import android.text.SpannableStringBuilder; import android.text.Spanned; import android.text.SpannedString; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.PopupWindow; import android.widget.TextView; import android.widget.Toast; public class MainMessage extends Activity implements OnClickListener { private Html.ImageGetter mImageGeter; private ListView mListView; private EditText mEditText; private ImageView mImageView; private LayoutInflater mInflater; private Button mLeftSend; private Button mRightSend; private MyAdapter myAdapter; //把短信类放入到一个集合中 private List<MyMsg> myListImage = new ArrayList<>(); private Button mImage; private ExpresionAdapter mExpresionAdapter; private GridView mTeacheGridView; //为不同图片的名称,对应ImageAdapter中的文件顺序 private String[] mImageData = { "dra", "drb", "drc", "drd", "dre", "drf", "drg", "drh", "dri", "drj", "drk", "drl", "drm", "drn", "dro", "drp", "drq", "drr", "drs", "drt", "dru", "drv", "drw", "drx", "dry", "drz" }; //下面这几句主要是PopupWindow 用得到 private PopupWindow mPopupWindow; private LinearLayout gridBelow; private GridView mPopGridView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.list_message); //初始化PopupWindow mPopupWindow = new PopupWindow(this); //设置PopupWindow 的宽度 mPopupWindow.setWidth(ViewGroup.LayoutParams.MATCH_PARENT); //设置PopupWindow 的高度 mPopupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT); //把PopupWindow 设为焦点 mPopupWindow.setFocusable(true); //同时设置PopupWindow 外面是可以点击的 mPopupWindow.setOutsideTouchable(true); //得到PopupWindow 的视图布局 View popupWindow = getLayoutInflater().inflate(R.layout.popupview, null); //设置为填充布局 mPopupWindow.setContentView(popupWindow); //给PopupWindow 添加GridView布局 mPopGridView = (GridView) popupWindow.findViewById(R.id.pop_gridView); //设置popupWindow显示在哪个控件下面 gridBelow = (LinearLayout) findViewById(R.id.grid_in_below); //为最左边的图片 mImageView = (ImageView) findViewById(R.id.image_view); mListView = (ListView) findViewById(R.id.msg_list_view); //图片旁边那个键 mImage = (Button) findViewById(R.id.image); mImage.setOnClickListener(this); mLeftSend = (Button) findViewById(R.id.left_send); mLeftSend.setOnClickListener(this); mRightSend = (Button) findViewById(R.id.right_send); mRightSend.setOnClickListener(this); //得到图片单条的视图布局 mTeacheGridView = (GridView) findViewById(R.id.image_gridView); "****重点****" mInflater = getLayoutInflater(); mImageGeter = new Html.ImageGetter() { @Override public Drawable getDrawable(String source) { Drawable drawable = null; if (source != null) { //利用反射,查找对应的图片 Class clazz = R.drawable.class; try { Field field = clazz.getDeclaredField(source); //得到图片的id,为了设置图片的大小 int sourcedId = field.getInt(clazz); drawable = getResources().getDrawable(sourcedId); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); } catch (NoSuchFieldException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { //也是为了设置在富文本中要显示图片的大小 drawable = getResources().getDrawable(R.drawable.ic_launcher); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); } return drawable; } }; mImageView.setOnClickListener(this); //得到图片的适配器,初始化, mExpresionAdapter = new ExpresionAdapter(getLayoutInflater()); //给Expresion添加适配器 mTeacheGridView.setAdapter(mExpresionAdapter); //给PopupWindow添加适配器 mPopGridView.setAdapter(mExpresionAdapter); //为单条短信的适配器 myAdapter = new MyAdapter(mInflater, myListImage, mImageGeter); //给短信的集合添加适配器 mListView.setAdapter(myAdapter); //设置Expresion的点击事件,同时将对应的图片显示在EditText中 mTeacheGridView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Spanned span = Html.fromHtml("<img src='" + mImageData[position] + "'/>", mImageGeter, null); mEditText.getText().insert(mEditText.getSelectionStart(), span); } }); //设置PopupWindow的点击事件,同时将对应的图片显示在EditText中 mPopGridView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Spanned span = Html.fromHtml("<img src='" + mImageData[position] + "'/>", mImageGeter, null); mEditText.getText().insert(mEditText.getSelectionStart(), span); } }); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.left_send: //将不同的短信类型填入,为了适配器中便于区分 MyMsg msg = new MyMsg(); //设置头像 msg.setImage(R.drawable.ic_launcher); msg.setMessage(filterHtml(Html.toHtml(mEditText.getText()))); //设置昵称 msg.setNicheng("小康"); //设置等级 msg.setOffice_title("营长"); msg.setTime(System.currentTimeMillis()); msg.setType(MyAdapter.TYPE_RECEIVED); myListImage.add(msg); myAdapter.notifyDataSetChanged(); mListView.setSelection(myListImage.size() - 1); mEditText.setText(""); break; case R.id.right_send: MyMsg msg1 = new MyMsg(); msg1.setImage(R.drawable.ic_launcher); msg1.setMessage(filterHtml(Html.toHtml(mEditText.getText()))); msg1.setNicheng("小康"); msg1.setOffice_title("营长"); msg1.setTime(System.currentTimeMillis()); msg1.setType(MyAdapter.TYPE_SEND); myListImage.add(msg1); myAdapter.notifyDataSetChanged(); mListView.setSelection(myListImage.size() - 1); mEditText.setText(""); break; case R.id.image: if (mPopGridView.getVisibility() == View.VISIBLE) { mPopGridView.setVisibility(View.GONE); } else { mPopGridView.setVisibility(View.VISIBLE); } mPopupWindow.showAsDropDown(gridBelow); break; case R.id.image_view: if (mTeacheGridView.getVisibility() == View.VISIBLE) { mTeacheGridView.setVisibility(View.GONE); } else { mTeacheGridView.setVisibility(View.VISIBLE); } break; } } //因为在EditText中已经为Spanned形式,所以用此方法转换成一般形式,最后在适配器中在转化成Spanned形式 private String filterHtml(String str) { str = str.replaceAll("<(?!br|img)[^>]+>", "").trim(); return str; } }
Image的布局(teache_image.xml)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageView android:id="@+id/teache_image" android:padding="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/> </LinearLayout>
ExpresionAdapter 的适配器
package com.normal.image; import com.test.login.R; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; public class ExpresionAdapter extends BaseAdapter { private int[] mData = { R.drawable.dra, R.drawable.drb, R.drawable.drc, R.drawable.drd, R.drawable.dre, R.drawable.drf, R.drawable.drg, R.drawable.drh, R.drawable.dri, R.drawable.drj, R.drawable.drk, R.drawable.drl, R.drawable.drm, R.drawable.drn, R.drawable.dro, R.drawable.dro, R.drawable.drq, R.drawable.drr, R.drawable.drs, R.drawable.drt, R.drawable.dru, R.drawable.drv, R.drawable.drw, R.drawable.drx, R.drawable.dry, R.drawable.drz }; private LayoutInflater mInflater; public ExpresionAdapter(LayoutInflater mInflater) { this.mInflater = mInflater; } @Override public int getCount() { // TODO Auto-generated method stub return mData.length; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return position; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder = null; if (convertView == null) { viewHolder = new ViewHolder(); convertView = mInflater.inflate(R.layout.teache_image, null); viewHolder.imageView = (ImageView) convertView.findViewById(R.id.teache_image); convertView.setTag(viewHolder); } viewHolder = (ViewHolder) convertView.getTag(); viewHolder.imageView.setImageResource(mData[position]); return convertView; } class ViewHolder { ImageView imageView; } }
PopupWindow的布局(popupwindow.xml)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <GridView android:id="@+id/pop_gridView" android:layout_height="wrap_content" android:layout_width="wrap_content" android:numColumns="5"></GridView> </LinearLayout>
相关文章推荐
- 浅析C++中sizeof操作符的用法
- Minimum Depth of Binary Tree
- svn在IDEA报错CreateProcess error=2
- java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/JsonProcessingException
- !!!!bootstrap3兼容ie6配置
- 屏幕密度掺入BitmapFactory里decodeFile与decodeResource的差异
- 微信 redirect_uri 参数错误
- bzoj刷题(shui)记录
- Android AsyncTask实现异步任务的执行
- MyBatis使用(一)
- python __add__和__radd__ 和 __iadd__
- Ubuntu安装软件包报错-doesn't match the expected hash xxx
- 高质量编程的金玉良言——单一职责原则
- cocos2d-x 百分比动作1 Progress半径模式
- 使用C#选择文件夹、打开文件夹、选择文件
- 高质量编程的金玉良言——单一职责原则
- 工程规范
- html5 本地存储----localstorage初体验
- 关于哈希code
- ARM9(S3C2440)时钟与定时器