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
原创粉丝点击