QQ对话框、背景渐变色
来源:互联网 发布:homebrew mysql 编辑:程序博客网 时间:2024/04/29 05:06
- 在drawable中新建文件type的类型还有圆形扇形
- 聊天程序设计
- 主布局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>
0 0
- QQ对话框、背景渐变色
- 对话框背景渐变色
- 对话框的背景颜色如何渐变
- 渐变色背景
- 渐变色背景框架
- 渐变色背景窗体
- android背景渐变色
- Android:背景渐变色
- 设置背景渐变色
- Android背景渐变色
- Android 渐变色背景
- 用渐变色填充背景
- android自定义背景渐变色
- 渐变色的背景实现
- C#窗体背景渐变色
- 背景渐变色,兼容IE
- 网页页面背景渐变色
- QSS 控件背景渐变色
- Java基础学习第一章练习三
- 浅析C++中sizeof操作符的用法
- [svn] 解决SVN冲突攻略(手册)
- 关于jQuery事件
- -1.#IND,1.#INF 的判断
- QQ对话框、背景渐变色
- [转]关于面试、简历之类的某人聊天的观点
- 如何查看别人网站的访问量
- 向Android studio 添加第三方库
- CAN总线基础知识(二)
- Palindrome Linked List 判断链表是否回文 栈实现
- 面试题17:合并两个排序的链表
- 解析AsyncTask<Params, Progress, Result>()
- 硬件十万个为什么——运放篇(九)实际运放的参数