package com.wise.extend; import java.util.ArrayList; import java.util.List; import com.wise.data.ChatEmoji; import com.wise.service.FaceAdapter; import com.wise.service.ViewPagerAdapter; import com.wise.wawc.R; import android.content.Context; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.text.SpannableString; import android.text.TextUtils; import android.util.AttributeSet; import android.util.Log; import android.view.Gravity; import android.view.MotionEvent; 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.EditText; import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; /** *自定义表情输入框 */ public class FaceRelativeLayout extends RelativeLayout implements OnItemClickListener, OnClickListener { private Context context; /** 表情页的监听事件 */ private OnCorpusSelectedListener mListener; /** 显示表情页的viewpager */ private ViewPager vp_face; /** 表情页界面集合 */ private ArrayList<View> pageViews; /** 游标显示布局 */ private LinearLayout layout_point; /** 游标点集合 */ private ArrayList<ImageView> pointViews; /** 表情集合 */ public static List<List<ChatEmoji>> emojis; /** 表情区域 */ private View view; /** 输入框 */ private EditText et_sendmessage; /** 表情数据填充器 */ private List<FaceAdapter> faceAdapters; /** 当前表情页 */ private int current = 0; public FaceRelativeLayout(Context context) { super(context); this.context = context; } public FaceRelativeLayout(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; } public FaceRelativeLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.context = context; } public void setOnCorpusSelectedListener(OnCorpusSelectedListener listener) { mListener = listener; } /** * 表情选择监听 */ public interface OnCorpusSelectedListener { void onCorpusSelected(ChatEmoji emoji); void onCorpusDeleted(); } protected void onFinishInflate() { super.onFinishInflate(); emojis = FaceConversionUtil.getInstace().emojiLists; onCreate(); } private void onCreate() { Init_View(); Init_viewPager(); Init_Point(); Init_Data(); } public void onClick(View v) { switch (v.getId()) { case R.id.btn_face: // 隐藏表情选择框 if (view.getVisibility() == View.VISIBLE) { view.setVisibility(View.GONE); } else { view.setVisibility(View.VISIBLE); } break; case R.id.et_sendmessage: // 隐藏表情选择框 if (view.getVisibility() == View.VISIBLE) { view.setVisibility(View.GONE); } break; } } /** * 隐藏表情选择框 */ public boolean hideFaceView() { // 隐藏表情选择框 if (view.getVisibility() == View.VISIBLE) { view.setVisibility(View.GONE); return true; } return false; } /** * 初始化控件 */ private void Init_View() { vp_face = (ViewPager) findViewById(R.id.vp_contains); et_sendmessage = (EditText) findViewById(R.id.et_sendmessage); layout_point = (LinearLayout) findViewById(R.id.iv_image); et_sendmessage.setOnClickListener(this); findViewById(R.id.btn_face).setOnClickListener(this); view = findViewById(R.id.ll_facechoose); } @Override public boolean onInterceptTouchEvent(MotionEvent event) { //屏蔽父控件 if(event.getAction() == MotionEvent.ACTION_DOWN){ getParent().requestDisallowInterceptTouchEvent(true); } return false; } /** * 初始化显示表情的viewpager */ private void Init_viewPager() { pageViews = new ArrayList<View>(); // 左侧添加空页 View nullView1 = new View(context); // 设置透明背景 nullView1.setBackgroundColor(Color.TRANSPARENT); pageViews.add(nullView1); // 中间添加表情页 faceAdapters = new ArrayList<FaceAdapter>(); for (int i = 0; i < emojis.size(); i++) { GridView view = new GridView(context); FaceAdapter adapter = new FaceAdapter(context, emojis.get(i)); view.setAdapter(adapter); faceAdapters.add(adapter); view.setOnItemClickListener(this); view.setNumColumns(7); view.setBackgroundColor(Color.TRANSPARENT); view.setHorizontalSpacing(1); view.setVerticalSpacing(1); view.setStretchMode(GridView.STRETCH_COLUMN_WIDTH); view.setCacheColorHint(0); view.setPadding(5, 0, 5, 0); view.setSelector(new ColorDrawable(Color.TRANSPARENT)); view.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); view.setGravity(Gravity.CENTER); pageViews.add(view); } // 右侧添加空页面 View nullView2 = new View(context); // 设置透明背景 nullView2.setBackgroundColor(Color.TRANSPARENT); pageViews.add(nullView2); } /** * 初始化游标 */ private void Init_Point() { pointViews = new ArrayList<ImageView>(); ImageView imageView; for (int i = 0; i < pageViews.size(); i++) { imageView = new ImageView(context); imageView.setBackgroundResource(R.drawable.d1); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); layoutParams.leftMargin = 10; layoutParams.rightMargin = 10; layoutParams.width = 8; layoutParams.height = 8; layout_point.addView(imageView, layoutParams); if (i == 0 || i == pageViews.size() - 1) { imageView.setVisibility(View.GONE); } if (i == 1) { imageView.setBackgroundResource(R.drawable.d2); } pointViews.add(imageView); } } private static final String TAG = "FaceRelativeLayout"; /** * 填充数据 */ private void Init_Data() { vp_face.setAdapter(new ViewPagerAdapter(pageViews)); vp_face.setCurrentItem(1); current = 0; vp_face.setOnPageChangeListener(new OnPageChangeListener() { public void onPageSelected(int arg0) { current = arg0 - 1; // 描绘分页点 draw_Point(arg0); // 如果是第一屏或者是最后一屏禁止滑动 if (arg0 == pointViews.size() - 1 || arg0 == 0) { if (arg0 == 0) { vp_face.setCurrentItem(arg0 + 1);// 第二屏 会再次实现该回调方法实现跳转. pointViews.get(1).setBackgroundResource(R.drawable.d2); } else { vp_face.setCurrentItem(arg0 - 1);// 倒数第二屏 pointViews.get(arg0 - 1).setBackgroundResource( R.drawable.d2); } } } public void onPageScrolled(int arg0, float arg1, int arg2) { //Log.e("onPageScrolled", "onPageScrolled"); } public void onPageScrollStateChanged(int arg0) { Log.d(TAG, "arg0 = " + arg0); if(arg0 == 1){ //屏蔽父控件的滑动事件 getParent().requestDisallowInterceptTouchEvent(true); }else if(arg0 == 0){ //释放对父控件的屏蔽 getParent().requestDisallowInterceptTouchEvent(false); } } }); } /** * 绘制游标背景 */ public void draw_Point(int index) { for (int i = 1; i < pointViews.size(); i++) { if (index == i) { pointViews.get(i).setBackgroundResource(R.drawable.d2); } else { pointViews.get(i).setBackgroundResource(R.drawable.d1); } } } public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { ChatEmoji emoji = (ChatEmoji) faceAdapters.get(current).getItem(arg2); if (emoji.getId() == R.drawable.face_del_icon) { int selection = et_sendmessage.getSelectionStart(); String text = et_sendmessage.getText().toString(); if (selection > 0) { String text2 = text.substring(selection - 1); if ("]".equals(text2)) { int start = text.lastIndexOf("["); int end = selection; et_sendmessage.getText().delete(start, end); return; } et_sendmessage.getText().delete(selection - 1, selection); } } if (!TextUtils.isEmpty(emoji.getCharacter())) { if (mListener != null) mListener.onCorpusSelected(emoji); SpannableString spannableString = FaceConversionUtil.getInstace() .addFace(getContext(), emoji.getId(), emoji.getCharacter()); et_sendmessage.append(spannableString); } } }