package com.wisedu.scc.love.widget.emoji; import android.content.Context; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.support.v4.view.ViewPager; import android.text.TextUtils; import android.util.AttributeSet; import android.view.Gravity; 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.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.wisedu.scc.love.R; import java.util.ArrayList; import java.util.List; public class EmojiLayout extends RelativeLayout implements OnItemClickListener, OnClickListener { private static final int EMOJI_COLUMN = 8; private Context context; /** 显示表情页的viewpager */ private ViewPager vpContainer; /** * 显示颜表情的viewpager */ private ViewPager textVpContainer; /** 表情页界面集合 */ private ArrayList<View> pageViews; /** * 颜表情界面集合 */ private ArrayList<View> textPageViews; /** 游标显示布局 */ private LinearLayout llDots; /** 游标点集合 */ private ArrayList<ImageView> pointViews; /** 表情集合 */ private List<List<Emoji>> emojis; /** 表情数据填充器 */ private List<EmojiAdapter> emojiAdapters; //added by lmyu for 颜表情 private List<List<String>> textEmojis; private List<TextEmojiAdapter> textEmojiAdapters; /** 当前表情页 */ private int current = 0; /** 表情页的监听事件 */ private OnCorpusSelectedListener mListener; private ViewPagerAdapter adapter; private ViewPagerAdapter textAdapter; private TextView btnDefault, btnTextEmoji; enum EmojiType{ /** * 图片表情 */ EMOJI, /** * 文字颜表情 */ TEXT_EMOJI } EmojiType emojiType = EmojiType.EMOJI; public EmojiLayout(Context context) { this(context, null); } public EmojiLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } public EmojiLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initLayout(context, attrs); } private void initLayout(Context context, AttributeSet attrs) { this.context = context; emojis = EmojiConversionUtil.getInstace(context).emojiLists; textEmojis = EmojiConversionUtil.getInstace(context).textEmojiLists; LayoutInflater factory = LayoutInflater.from(context); factory.inflate(R.layout.widget_emoji_container, this); initView(); initViewPager(); initPoint(); initData(); } /** * 初始化控件 */ private void initView() { btnDefault = (TextView)findViewById(R.id.btn_default); btnTextEmoji = (TextView)findViewById(R.id.btn_text_emoji); vpContainer = (ViewPager) findViewById(R.id.vp_contains); textVpContainer = (ViewPager)findViewById(R.id.text_vp_contains); llDots = (LinearLayout) findViewById(R.id.ll_dots); btnDefault.setOnClickListener(this); btnTextEmoji.setOnClickListener(this); } /** * 初始化显示表情的viewpager */ private void initViewPager() { pageViews = new ArrayList<View>(); textPageViews = new ArrayList<View>(); // 左侧添加空页 View nullView1 = new View(context); // 设置透明背景 nullView1.setBackgroundColor(Color.TRANSPARENT); pageViews.add(nullView1); textPageViews.add(nullView1); // 中间添加表情页 emojiAdapters = new ArrayList<EmojiAdapter>(); textEmojiAdapters = new ArrayList<TextEmojiAdapter>(); for (int i = 0; i < emojis.size(); i++) { GridView view = new GridView(context); EmojiAdapter adapter = new EmojiAdapter(context, emojis.get(i)); view.setAdapter(adapter); emojiAdapters.add(adapter); view.setOnItemClickListener(this); view.setNumColumns(EMOJI_COLUMN); view.setBackgroundColor(Color.TRANSPARENT); view.setHorizontalSpacing(1); view.setVerticalSpacing(1); view.setStretchMode(GridView.STRETCH_COLUMN_WIDTH); view.setCacheColorHint(0); view.setHorizontalSpacing(2); view.setVerticalSpacing(11); view.setSelector(new ColorDrawable(Color.TRANSPARENT)); view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); view.setGravity(Gravity.CENTER); pageViews.add(view); } for (int i = 0; i < textEmojis.size(); i++) { GridView view = new GridView(context); TextEmojiAdapter adapter = new TextEmojiAdapter(context, textEmojis.get(i)); view.setAdapter(adapter); textEmojiAdapters.add(adapter); view.setOnItemClickListener(textEmojiOnitemClick); view.setNumColumns(3); view.setBackgroundColor(Color.TRANSPARENT); view.setHorizontalSpacing(1); view.setVerticalSpacing(1); view.setStretchMode(GridView.STRETCH_COLUMN_WIDTH); view.setCacheColorHint(0); view.setHorizontalSpacing(2); view.setVerticalSpacing(11); view.setSelector(new ColorDrawable(Color.TRANSPARENT)); view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); view.setGravity(Gravity.CENTER); textPageViews.add(view); } // 右侧添加空页面 View nullView2 = new View(context); // 设置透明背景 nullView2.setBackgroundColor(Color.TRANSPARENT); pageViews.add(nullView2); textPageViews.add(nullView2); } /** * 初始化游标 */ private void initPoint() { pointViews = new ArrayList<ImageView>(); ImageView imageView; for (int i = 0; i < pageViews.size(); i++) { imageView = new ImageView(context); imageView.setBackgroundResource(R.drawable.expression_page_normal); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); layoutParams.leftMargin = 10; layoutParams.rightMargin = 10; layoutParams.width = LayoutParams.WRAP_CONTENT; layoutParams.height = LayoutParams.WRAP_CONTENT; llDots.addView(imageView, layoutParams); if (i == 0 || i == pageViews.size() - 1) { imageView.setVisibility(View.GONE); } if (i == 1) { imageView.setBackgroundResource(R.drawable.expression_page_selected); } pointViews.add(imageView); } } /** * 填充数据 */ private void initData() { adapter = new ViewPagerAdapter(pageViews); textAdapter = new ViewPagerAdapter(textPageViews); vpContainer.setAdapter(adapter); textVpContainer.setAdapter(textAdapter); vpContainer.setCurrentItem(1); textVpContainer.setCurrentItem(1); current = 0; vpContainer.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int arg0) { current = arg0 - 1; // 描绘分页点 drawPoint(arg0); // 如果是第一屏或者是最后一屏禁止滑动,其实这里实现的是如果滑动的是第一屏则跳转至第二屏,如果是最后一屏则跳转到倒数第二屏. if (arg0 == pointViews.size() - 1 || arg0 == 0) { if (arg0 == 0) { vpContainer.setCurrentItem(arg0 + 1);// 第二屏 // 会再次实现该回调方法实现跳转. pointViews.get(1).setBackgroundResource( R.drawable.expression_page_normal); } else { vpContainer.setCurrentItem(arg0 - 1);// 倒数第二屏 pointViews.get(arg0 - 1).setBackgroundResource( R.drawable.expression_page_selected); } } } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } }); textVpContainer.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int arg0) { current = arg0 - 1; // 描绘分页点 drawPoint(arg0); // 如果是第一屏或者是最后一屏禁止滑动,其实这里实现的是如果滑动的是第一屏则跳转至第二屏,如果是最后一屏则跳转到倒数第二屏. if (arg0 == pointViews.size() - 1 || arg0 == 0) { if (arg0 == 0) { textVpContainer.setCurrentItem(arg0 + 1);// 第二屏 // 会再次实现该回调方法实现跳转. pointViews.get(1).setBackgroundResource( R.drawable.expression_page_normal); } else { textVpContainer.setCurrentItem(arg0 - 1);// 倒数第二屏 pointViews.get(arg0 - 1).setBackgroundResource( R.drawable.expression_page_selected); } } } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } }); } /** * 绘制游标背景 */ public void drawPoint(int index) { for (int i = 1; i < pointViews.size(); i++) { if (index == i) { pointViews.get(i).setBackgroundResource( R.drawable.expression_page_selected); } else { pointViews.get(i).setBackgroundResource( R.drawable.expression_page_normal); } } } @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { Emoji emoji = (Emoji) emojiAdapters.get(current).getItem(arg2); if (!TextUtils.isEmpty(emoji.getCharacter())) { if (mListener != null) mListener.onCorpusSelected(emoji); } } private OnItemClickListener textEmojiOnitemClick = new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String emoji = (String) textEmojiAdapters.get(current).getItem(position); if (mListener != null) { mListener.onTextEmojiSelected(emoji); } } }; public void setOnCorpusSelectedListener(OnCorpusSelectedListener listener) { mListener = listener; } /** * 表情选择监听 * * @author naibo-liao * @时间: 2013-1-15下午04:32:54 */ public interface OnCorpusSelectedListener { void onCorpusSelected(Emoji emoji); void onCorpusDeleted(); void onTextEmojiSelected(String emoji); } @Override public void onClick(View v) { if (v.getId() == R.id.btn_default) { if (emojiType == EmojiType.EMOJI) { return; } emojiType = EmojiType.EMOJI; vpContainer.setVisibility(View.VISIBLE); textVpContainer.setVisibility(View.GONE); vpContainer.setCurrentItem(1); drawPoint(1); btnDefault.setBackgroundColor(getResources().getColor(R.color.emoji_tab_selected)); btnTextEmoji.setBackgroundColor(getResources().getColor(R.color.emoji_tab_unselected)); }else if (v.getId() == R.id.btn_text_emoji) { if (emojiType == EmojiType.TEXT_EMOJI) { return; } emojiType = EmojiType.TEXT_EMOJI; vpContainer.setVisibility(View.GONE); textVpContainer.setVisibility(View.VISIBLE); textVpContainer.setCurrentItem(1); drawPoint(1); btnDefault.setBackgroundColor(getResources().getColor(R.color.emoji_tab_unselected)); btnTextEmoji.setBackgroundColor(getResources().getColor(R.color.emoji_tab_selected)); } } }