表情开发

线上效果,为了节省空间,把图片压缩了

第一个图的表情是打到工程的本地图片,第二图的表情,是动态下载的表情包,并做一些处理


代码:public class EmoticonsModeView extends LinearLayout implements OnPageChangeListener {


    private Context mContext;


    private LinearLayout mDotsLayout, mClassfyLayout;


    private LayoutInflater mInflater;


    private ViewPager mViewPager;


    private EmoticonsModeAdapter mModeAdapter;


    private EmoticonsLoadModeAdapter mLoadModeAdapter;


    private EmoticonsHelper mHelper;


    private List<View> dotsView;


    private ImageView mDeleteView;


    private EmoticonsModeListener mListener;


    private List<EmoticonsDetailInfo> mList;


    private int mPos = 0;;


    private boolean isLoad = false;


    private final static int EMOTICONS_MODE = 0;


    private final static int EMOTICOND_MODE_LOAD = 1;


    public EmoticonsModeView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        initViews();
    }


    public EmoticonsModeView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        initViews();
    }


    public interface EmoticonsModeListener {
        public void selectFace(int resId, String name);


        public void deleteFace();
    }


    public void setEmoticonsListener(EmoticonsModeListener listener) {
        this.mListener = listener;
    }


    public EmoticonsModeListener getEmoticonsListener() {
        return mListener;
    }


    public void destroy() {
        if (null != mList) {
            mList.clear();
        }
        if (null != dotsView) {
            dotsView.clear();
        }
        if (null != mModeAdapter) {
            List<EmoticonsSelectAdapter> listAdapters = mModeAdapter.getListAdapter();
            if (null != listAdapters && listAdapters.size() > 0) {
                listAdapters.clear();
                listAdapters = null;
            }
            mModeAdapter.clear();
        }
        if (null != mLoadModeAdapter) {
            List<EmoticonsLoadSelectAdapter> listLoadAdapters = mLoadModeAdapter
                    .getListLoadAdapter();
            if (null != listLoadAdapters && listLoadAdapters.size() > 0) {
                for (int i = 0; i < listLoadAdapters.size(); i++) {
                    listLoadAdapters.get(i).clear();
                }
                listLoadAdapters.clear();
                listLoadAdapters = null;
            }
            mLoadModeAdapter.clear();
        }
        if (null != mHelper) {
            mHelper.releaseBitmap();
        }
    }


    private void initViews() {
        mContext = getContext();
        mInflater = LayoutInflater.from(mContext);
        View view = mInflater.inflate(R.layout.vw_emoticons_mode, this);
        mViewPager = (ViewPager) view.findViewById(R.id.vp_emoticons);
        mViewPager.setOnPageChangeListener(this);
        mHelper = new EmoticonsHelper(mContext);
        iniData();
    }


    Handler mHandler = new Handler() {


        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            super.handleMessage(msg);
            switch (msg.what) {
                case EMOTICONS_MODE:
                    showToolBar(true);
                    ctrlDeleteViews();
                    initDots();
                    break;
                case EMOTICOND_MODE_LOAD:
                    showToolBar(false);
                    ctrlDeleteViews();
                    initDots();
                    break;
            }
        }
    };


    class MyThread extends Thread {


        @Override
        public void run() {
            // TODO Auto-generated method stub
            iniData();
        }
    }


    private void iniData() {
        mList = mHelper.getEmoticonsData();
        if (null == mList || mList.size() < 1) {
            mModeAdapter = new EmoticonsModeAdapter(mContext, EmoticonsModeView.this);
            mViewPager.setAdapter(mModeAdapter);
            isLoad = false;
            mHandler.sendEmptyMessage(EMOTICONS_MODE);
        } else {
            if (-1 == mList.get(0).getId()) {
                mModeAdapter = new EmoticonsModeAdapter(mContext, EmoticonsModeView.this);
                mViewPager.setAdapter(mModeAdapter);
                isLoad = false;
                mHandler.sendEmptyMessage(EMOTICOND_MODE_LOAD);
            } else {
                mLoadModeAdapter = new EmoticonsLoadModeAdapter(mContext, EmoticonsModeView.this);
                mLoadModeAdapter.setData(mList.get(0).getEmoticonsList());
                mViewPager.setAdapter(mLoadModeAdapter);
                isLoad = true;
                mHandler.sendEmptyMessage(EMOTICOND_MODE_LOAD);
            }
        }
        mViewPager.setOnTouchListener(new OnTouchListener() {


            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                return false;
            }
        });
    }


    private void ctrlDeleteViews() {
        if (null == mDeleteView) {
            mDeleteView = (ImageView) findViewById(R.id.iv_delete);
        }
        if (isLoad) {
            mDeleteView.setVisibility(View.VISIBLE);
        } else {
            mDeleteView.setVisibility(View.GONE);
        }
    }


    private void showToolBar(boolean single) {
        if (null == mClassfyLayout) {
            mClassfyLayout = (LinearLayout) findViewById(R.id.ll_classfy);
        }
        mClassfyLayout.removeAllViews();
        ImageView imageView = null;
        if (single) {
            imageView = (ImageView) mInflater.inflate(R.layout.vw_emoticons_tool, null);
            imageView.setBackgroundResource(R.drawable.emoticons_bg_sel);
            imageView.setImageResource(R.drawable.face_weixiao);
            mClassfyLayout.addView(imageView);
        } else {
            if (null == mList && mList.size() < 1) {
                return;
            }
            for (int i = 0; i < mList.size(); i++) {
                imageView = (ImageView) mInflater.inflate(R.layout.vw_emoticons_tool, null);
                if (i == mPos) {
                    imageView.setBackgroundResource(R.drawable.emoticons_bg_sel);
                } else {
                    imageView.setBackgroundResource(R.drawable.emoticons_bg);
                }
                if (null != mList.get(i) && !Utils.isEmpty(mList.get(i).getIcon())) {
                    mHelper.loadImage(imageView, mList.get(i).getIcon());
                    mClassfyLayout.addView(imageView);
                    ClickListener listener = new ClickListener(i);
                    imageView.setOnClickListener(listener);
                } else if (null != mList.get(i) && Utils.isEmpty(mList.get(i).getIcon())) {
                    imageView.setImageResource(R.drawable.face_weixiao);
                    mClassfyLayout.addView(imageView);
                    ClickListener listener = new ClickListener(i);
                    imageView.setOnClickListener(listener);
                }
            }
        }
    }


    private int getCount() {
        int count = 0;
        if (isLoad) {
            if (null != mLoadModeAdapter) {
                count = mLoadModeAdapter.getCount();
            }
        } else {
            if (null != mModeAdapter) {
                count = mModeAdapter.getCount();
            }
        }
        return count;
    }


    private void initDots() {
        if (null == mDotsLayout) {
            mDotsLayout = (LinearLayout) findViewById(R.id.ll_vp_point);
        }
        mDotsLayout.removeAllViews();
        dotsView = new ArrayList<View>();


        for (int i = 0; i < getCount(); i++) {
            View view = mInflater.inflate(R.layout.vw_viewpager_item_dots, null);
            ImageView imageView = (ImageView) view.findViewById(R.id.item_ic);
            if (i == 0) {
                imageView.setBackgroundResource(R.drawable.emoticons_point_sel);
            } else {
                imageView.setBackgroundResource(R.drawable.emoticons_point);
            }
            dotsView.add(view);
            mDotsLayout.addView(view);
        }
    }


    @Override
    public void onPageScrollStateChanged(int arg0) {
        // TODO Auto-generated method stub
    }


    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) {
        // TODO Auto-generated method stub
        if (null != mModeAdapter) {
            List<EmoticonsSelectAdapter> listAdapters = mModeAdapter.getListAdapter();
            if (null != listAdapters && listAdapters.size() > 0) {
                for (int i = 0; i < listAdapters.size(); i++) {
                     listAdapters.get(i).dissmissPop();
                }
            }
        }
    }


    @Override
    public void onPageSelected(int arg0) {
        // TODO Auto-generated method stub
        if (getCount() != dotsView.size()) {
            return;
        }
        for (int i = 0; i < getCount(); i++) {
            if (i == arg0) {
                dotsView.get(i).findViewById(R.id.item_ic)
                        .setBackgroundResource(R.drawable.emoticons_point_sel);
            } else {
                dotsView.get(i).findViewById(R.id.item_ic)
                        .setBackgroundResource(R.drawable.emoticons_point);
            }
        }
    }


    class ClickListener implements OnClickListener {


        private int mPostion;


        public ClickListener(int pos) {
            this.mPostion = pos;
        }


        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (null == v) {
                return;
            } else if (v.getId() == R.id.iv_emoticons_icon) {
                if (-1 == mList.get(mPostion).getId()) {
                    isLoad = false;
                    mHandler.sendEmptyMessage(EMOTICOND_MODE_LOAD);
                    mModeAdapter = new EmoticonsModeAdapter(mContext, EmoticonsModeView.this);
                    mViewPager.setAdapter(mModeAdapter);
                } else {
                    isLoad = true;
                    mHandler.sendEmptyMessage(EMOTICOND_MODE_LOAD);
                    mLoadModeAdapter = new EmoticonsLoadModeAdapter(mContext,
                            EmoticonsModeView.this);
                    mLoadModeAdapter.setData(mList.get(mPostion).getEmoticonsList());
                    mViewPager.setAdapter(mLoadModeAdapter);
                }
                mPos = mPostion;
            }
        }
    }


public class EmoticonsModeAdapter extends PagerAdapter {


    private Context mContext;


    private LayoutInflater mInflater;


    private EmoticonsModeView mView;


    private List<EmoticonsSelectAdapter> mAdapterList = new ArrayList<EmoticonsSelectAdapter>();


    public EmoticonsModeAdapter(Context context, EmoticonsModeView view) {
        this.mContext = context;
        this.mView = view;
        mInflater = LayoutInflater.from(context);
        initData(mContext);
        initListData();
    }


    public List<EmoticonsSelectAdapter> getListAdapter() {
        return mAdapterList;
    }


    public void clear() {
        if (null != faceIdArrayList) {
            faceIdArrayList.clear();
        }
        if (null != faceStrArrayList) {
            faceStrArrayList.clear();
        }
        if (null != faceIdList) {
            faceIdList.clear();
        }
        if (null != faceStrList) {
            faceStrList.clear();
        }
    }


    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 2;
    }


    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        // TODO Auto-generated method stub
        ((ViewPager) container).removeView((View) object);
    }


    @Override
    public boolean isViewFromObject(View arg0, Object arg1) {
        // TODO Auto-generated method stub
        return arg0.equals(arg1);
    }


    @Override
    public Object instantiateItem(View container, int position) {
        // TODO Auto-generated method stub
        View view = mInflater.inflate(R.layout.vw_emoticons_mode_item, null);
        GridView gridView = (GridView) view.findViewById(R.id.gv_emoticons);
        final EmoticonsSelectAdapter adapter = new EmoticonsSelectAdapter(mContext, mView,
                faceIdArrayList.get(position), faceStrArrayList.get(position));
        gridView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
        mAdapterList.add(adapter);
        gridView.setOnTouchListener(new OnTouchListener() {


            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                if (event.getAction() == MotionEvent.ACTION_UP) {
                    adapter.dissmissPop();
                }
                return false;
            }
        });
        OnItemListener listener = new OnItemListener(position);
        gridView.setOnItemClickListener(listener);
        ((ViewPager) container).addView(view);
        return view;
    }


    class OnItemListener implements OnItemClickListener {


        private int mPosition;


        public OnItemListener(int pos) {
            this.mPosition = pos;
        }


        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
            // TODO Auto-generated method stub
            if (null == mView) {
                return;
            }
            EmoticonsModeListener listener = mView.getEmoticonsListener();
            if (null != listener) {
                if (null == faceIdArrayList.get(mPosition)
                        || null == faceStrArrayList.get(mPosition)) {
                    return;
                }
                if (arg2 < faceIdArrayList.get(mPosition).size()
                        && arg2 < faceIdArrayList.get(mPosition).size()) {
                    listener.selectFace(faceIdArrayList.get(mPosition).get(arg2), faceStrArrayList
                            .get(mPosition).get(arg2));
                }
            }
        }


    }


    @Override
    public void destroyItem(View container, int position, Object object) {
        // TODO Auto-generated method stub
        ((ViewPager) container).removeView((View) object);
    }


    private ArrayList<List<Integer>> faceIdArrayList = new ArrayList<List<Integer>>();


    private ArrayList<List<String>> faceStrArrayList = new ArrayList<List<String>>();


    private ArrayList<Integer> faceIdList = new ArrayList<Integer>();


    private ArrayList<String> faceStrList = new ArrayList<String>();


    private void initData(Context context) {
        if (faceIdList.size() == 0) {
            String[] strings = context.getResources().getStringArray(R.array.face_string);
            faceStrList.addAll(Arrays.asList(strings));


            faceIdList.add(R.drawable.face_baiyan);
            faceIdList.add(R.drawable.face_bishi);
            faceIdList.add(R.drawable.face_bizui);
            faceIdList.add(R.drawable.face_daku);
            faceIdList.add(R.drawable.face_fadai);
            faceIdList.add(R.drawable.face_fanu);
            faceIdList.add(R.drawable.face_fendou);
            faceIdList.add(R.drawable.face_guzhang);
            faceIdList.add(R.drawable.face_haixiu);
            faceIdList.add(R.drawable.face_hanxiao);
            faceIdList.add(R.drawable.face_sahan);
            faceIdList.add(R.drawable.face_huaixiao);
            faceIdList.add(R.drawable.face_jingkong);
            faceIdList.add(R.drawable.face_jiong);
            faceIdList.add(R.drawable.face_kelian);
            faceIdList.add(R.drawable.face_koubi);
            faceIdList.add(R.drawable.face_ku);
            faceIdList.add(R.drawable.face_kuaikule);
            faceIdList.add(R.drawable.face_kun);
            faceIdList.add(R.drawable.face_liuhan);
            faceIdList.add(R.drawable.face_liulei);
            faceIdList.add(R.drawable.face_qinqin);
            faceIdList.add(R.drawable.face_shuai);
            faceIdList.add(R.drawable.face_se);
            faceIdList.add(R.drawable.face_qiexiao);
            faceIdList.add(R.drawable.face_weixiao);
            faceIdList.add(R.drawable.face_yiwen);
            faceIdList.add(R.drawable.face_yun);
            faceIdList.add(R.drawable.face_zaijian);
            faceIdList.add(R.drawable.face_zhuakuang);
        }
    }


    private void initListData() {
        faceIdArrayList.add(faceIdList.subList(0, 20));
        faceIdArrayList.add(faceIdList.subList(20, faceIdList.size()));
        faceStrArrayList.add(faceStrList.subList(0, 20));
        faceStrArrayList.add(faceStrList.subList(20, faceStrList.size()));
    }



public class EmoticonsSelectAdapter extends BaseAdapter {


    private Context mContext;


    private EmoticonsModeView mView;


    private PopupWindow mPopupWindow;


    private TextView mHintView;


    private int mPopWidth = 0;


    private int mPopHeight = 0;
    
    private LayoutInflater mInflater;


    private List<Integer> faceIdList;


    private List<String> faceStrList;


    private int mCount = 7 * 3;


    public EmoticonsSelectAdapter(Context context, EmoticonsModeView view, List<Integer> idList,
            List<String> strList) {
        mContext = context;
        this.mView = view;
        mInflater = LayoutInflater.from(context);
        this.faceIdList = idList;
        this.faceStrList = strList;
        initPopWindow();
    }


    private void initPopWindow() {
        View view = mInflater.inflate(R.layout.vw_face_mode_hint, null);
        mHintView = (TextView) view.findViewById(R.id.tv_face_hint);
        mPopWidth = Utils.dip2px(mContext, 62.5f);
        mPopHeight = Utils.dip2px(mContext, 29.5f);
        mPopupWindow = new PopupWindow(view, mPopWidth, mPopHeight);
    }


    public void dissmissPop() {
        if (null != mHintView) {
            if (mHintView.isShown()) {
                mPopupWindow.dismiss();
            }
        }
    }
    
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return mCount;
    }


    @Override
    public Integer getItem(int position) {
        // TODO Auto-generated method stub
        if (position < faceIdList.size()) {
            return faceIdList.get(position);
        } else {
            return 0;
        }
    }


    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }


    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        ViewHolder holder;
        if (null == convertView) {
            holder = new ViewHolder();
            convertView = mInflater.inflate(R.layout.vw_emoticons_selec_item, null);
            holder.mImageView = (ImageView) convertView.findViewById(R.id.iv_emoticons);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        if (position == mCount - 1) {
            holder.mImageView.setImageResource(R.drawable.face_item_delete);
            convertView.setOnClickListener(new OnClickListener() {


                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    if (null == mView) {
                        return;
                    }
                    if (null != mView.getEmoticonsListener()) {
                        mView.getEmoticonsListener().deleteFace();
                    }
                }
            });
        } else if (position < faceIdList.size()) {
            holder.mImageView.setImageResource(faceIdList.get(position));
            convertView.setOnTouchListener(new OnTouchListener() {


                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    // TODO Auto-generated method stub
                    if (event.getAction() == MotionEvent.ACTION_DOWN) {
                        int[] location = new int[2];
                        v.getLocationOnScreen(location);
                        int delta = (mPopWidth - v.getWidth()) / 2;
                        mPopupWindow.showAtLocation(v, Gravity.TOP | Gravity.LEFT, location[0]
                                - delta, location[1] - mPopHeight);
                        mHintView.setText(faceStrList.get(position));
                    }
                    return false;
                }
            });
        } else {
            holder.mImageView.setVisibility(View.GONE);
        }
        return convertView;
    }


    class ViewHolder {


        ImageView mImageView;


    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值