仿微信 发起群聊 类似样式

Posted Yingshirun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了仿微信 发起群聊 类似样式相关的知识,希望对你有一定的参考价值。

前段时间项目中有用到类似像微信发起群聊的功能,现在整理了出来 分享给大家

效果图如下:



选中后 添加到下面的选择栏中 ,点击选择栏中已选择的 就取消选择


简单说下思路:

自定义HorizontalScrollView 

每次在ListView中选中一个item   就加入到咱们的horizontalScrollView中去

已经选中的 再次中就移除

不多说,直接贴代码:


public class MyHorizontalScroll extends HorizontalScrollView 


    private LinearLayout mLinearLayout;

    private Map<String,UserBean> map;   
    private List<UserBean> list;      //用来顺序存储加入的信息

    /**
     * 默认文字
     */
    private TextView defaultTv;

    private boolean isFirst;

    /**
     * 内容控件的宽高
     */
    private int contentWidthPx;
    private int contentHeightPx;
    public MyHorizontalScroll(Context context, AttributeSet attrs, int defStyle) 
        super(context, attrs, defStyle);
        init();
    
    public MyHorizontalScroll(Context context) 
        super(context);
        init();
    

    public MyHorizontalScroll(Context context, AttributeSet attrs) 
        super(context, attrs);
        init();
    

    private void init() 
        if(map == null)
            map = new HashMap<String,UserBean>();
        

        contentWidthPx = DensityUtil.dip2px(getContext(), 60);
        contentHeightPx = DensityUtil.dip2px(getContext(), 80);
        //设置默认提示文字样式
        defaultTv = new TextView(getContext());
        defaultTv.setText("请添加群聊成员");
        defaultTv.setPadding(DensityUtil.dip2px(getContext(), 3), 0, 0, 0);
        android.view.ViewGroup.LayoutParams vl = new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
        defaultTv.setLayoutParams(vl);
        defaultTv.setGravity(Gravity.CENTER_VERTICAL);
        defaultTv.setTextColor(Color.parseColor("#ffffff"));

        defaultTv.setTextSize(15);

        list = new ArrayList<UserBean>();
        mLinearLayout = new LinearLayout(getContext());
        mLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
        mLinearLayout.setGravity(Gravity.CENTER_VERTICAL);
        android.widget.LinearLayout.LayoutParams lp = new android.widget.LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT);
        mLinearLayout.setLayoutParams(lp);
        mLinearLayout.setPadding(DensityUtil.dip2px(getContext(), 11), 0, DensityUtil.dip2px(getContext(), 35), 0);

        //将容器添加到Scroll中
        addView(mLinearLayout);

        mLinearLayout.addView(defaultTv);
        isFirst = true;
    

    /**
     * 加入一个用户
     * @param uid	id
     * @param headpath	头像地址
     */
    public void add(String uid,String headpath,String nick)
        UserBean ub = new UserBean();
        ub.uid = uid;
        ub.headpath = headpath;
        ub.nick = nick;
        add(ub);
    

    /**
     * 加入一个用户头像
     * @param ub
     */
    public void add(final UserBean ub)
        if(isFirst)
            //第一次添加的时候讲提示文字取出
            mLinearLayout.removeView(defaultTv);
            isFirst = false;
        

        list.add(ub);
        map.put(ub.uid, ub);
        if(changeListener!=null)
            changeListener.changeAction(list.size(),ChangeListener.PUSH,ub.uid);
        
        View v = View.inflate(getContext(), R.layout.scrol_item_layout,null);

        final ImageView rv = (ImageView) v.findViewById(R.id.scrol_item_iv);
        TextView tv = (TextView) v.findViewById(R.id.scrol_item_tv);
        tv.setText(ub.nick);

        //
        LinearLayout.LayoutParams vl = new LinearLayout.LayoutParams(contentWidthPx, contentHeightPx);
        vl.setMargins(DensityUtil.dip2px(getContext(), 5),0,0,0);
        v.setLayoutParams(vl);


        addClickListener(v, ub.uid);

        mLinearLayout.addView(v);

        scrollTo(mLinearLayout.getWidth(), 0);
        //将该控件设置上图片
        setUserAvatar(ub.headpath, rv);
    

    /**
     * 设置头像
     * @param headpath
     * @param rv
     */
    private void setUserAvatar(String headpath, ImageView rv) 
        Picasso.with(getContext()).load(headpath).into(rv);
    

    /**
     * 每添加一个头像进去  就给该头像添加一个点击事件
     * 用户点击头像 取消动作
     * @param rv
     * @param id
     */
    private void addClickListener(final View rv,final String id)
        OnClickListener click = new OnClickListener() 

            @Override
            public void onClick(View v) 
                remove(id);
            
        ;
        rv.setOnClickListener(click);
    

    /**
     * 移除一个用户头像
     * @param uid	用户的uid
     */
    public void remove(String uid)
        UserBean ub = map.remove(uid);
        int in = list.indexOf(ub); <span style="white-space:pre">	</span>//得到该头像在控件中的位置
        mLinearLayout.removeViewAt(in);
        list.remove(in);


        if(changeListener!=null)
            changeListener.changeAction(list.size(),ChangeListener.POP,uid);
        
        if(list.size()==0)
            //当控件中没有内容时  将提示文字加上
            mLinearLayout.addView(defaultTv);
            isFirst = true;
        
    

    /**
     * 移除一个用户头像
     * @param ub
     */
    public void remove(UserBean ub)
        remove(ub.uid);
    

    /**
     * 得到选择的id
     * @return
     */
    public String[] getUsers()
        Set<String> set = map.keySet();
        if(set==null)
            return null;
        
        String[] str = new String[set.size()];
        set.toArray(str);
        return str;
    

    /**
     * 得到选择好友的nick
     * @return
     */
    public String[] getUsersNick()
        int size = list.size();
        String[] str = new String[size];
        for(int i=0; i<size; i++)
            String nick = list.get(i).nick;
            if(nick !=null)
                str[i] = nick;
            else
                str[i] = list.get(i).uid;
            
        
        return str;
    



    /**
     * 添加监听  当往该控件中添加头像时 会调用该监听 并把当前的总个数传出去
     * @author Administrator
     *
     */
    public interface ChangeListener
        /**
         * 添加一个
         */
        public static final int PUSH = 1;
        /**
         * 减少一个
         */
        public static final int POP = 2;
        /**
         * 传出当前控件中的总个数
         * @param count
<span style="white-space:pre">	</span> * @param action 当前的操作  PUSH或者POP
         * @param uid    当前被操作的对象id
         */
        public void changeAction(int count,int action,String uid);
    

    public void setChangeListener(ChangeListener changeListener)
        this.changeListener = changeListener;
    
    private ChangeListener changeListener;
UserBean类:


public class UserBean 

  public  String uid;		//用户id
  public  String headpath;	//用户的头像路径
  public  String nick;		//用户昵称


XML  布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="80dp" android:layout_height="80dp"
    android:orientation="vertical">
    <ImageView
        android:id="@+id/scrol_item_iv"
        android:layout_width="60dp"
        android:src="@mipmap/ic_launcher"
        android:layout_gravity="center_horizontal"
        android:scaleType="centerCrop"
        android:layout_height="60dp" />
    <TextView
        android:id="@+id/scrol_item_tv"
        android:layout_width="match_parent"
        android:text="12321312"
        android:gravity="center_horizontal"
        android:textColor="#fff"
        android:ellipsize="end"
        android:maxWidth="60dp"
        android:singleLine="true"
        android:layout_height="wrap_content" />
</LinearLayout>

恩,大致就这么多


源码下载:

https://github.com/yingshirun/HorizontalScroll


以上是关于仿微信 发起群聊 类似样式的主要内容,如果未能解决你的问题,请参考以下文章

微信清空后找不到群聊怎么办?

Android 修改源码自定义SwipeRefreshLayout样式——高仿微信朋友圈下拉刷新

推荐一款精仿微信公众号样式的管理系统

Android 仿微信朋友圈列表右下角的二小圆点样式布局

高仿微信聊天界面长按弹框样式

微信小程序自定义弹窗wcPop插件|仿微信弹窗样式