package com.jasonchen.microlang.smilepicker; import android.animation.LayoutTransition; import android.animation.ObjectAnimator; import android.app.Activity; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapFactory.Options; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.text.Editable; import android.text.Selection; import android.text.Spannable; import android.text.SpannableStringBuilder; import android.text.style.ImageSpan; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import android.widget.BaseAdapter; import android.widget.EditText; import android.widget.GridView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.jasonchen.microlang.R; import com.jasonchen.microlang.utils.GlobalContext; import com.jasonchen.microlang.utils.TimeLineUtility; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; /** * jasonchen * 2015/04/10 */ public class SmileyPicker extends LinearLayout { private int mPickerHeight; private EditText mEditText; private ViewPager viewPager; private ImageView centerPoint; private ImageView leftPoint; private ImageView rightPoint; private LayoutInflater mInflater; private Activity activity; private final LayoutTransition transitioner = new LayoutTransition(); public SmileyPicker(Context paramContext) { super(paramContext); } public SmileyPicker(Context paramContext, AttributeSet paramAttributeSet) { super(paramContext, paramAttributeSet); this.mInflater = LayoutInflater.from(paramContext); View view = this.mInflater.inflate( R.layout.writeweiboactivity_smileypicker, null); viewPager = (ViewPager) view.findViewById(R.id.viewpager); viewPager.setAdapter(new SmileyPagerAdapter()); leftPoint = (ImageView) view.findViewById(R.id.left_point); centerPoint = (ImageView) view.findViewById(R.id.center_point); leftPoint.getDrawable().setLevel(1); viewPager .setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { @Override public void onPageSelected(int position) { super.onPageSelected(position); switch (position) { case 0: leftPoint.getDrawable().setLevel(1); centerPoint.getDrawable().setLevel(0); break; case 1: leftPoint.getDrawable().setLevel(0); centerPoint.getDrawable().setLevel(1); break; } } }); addView(view); } public void setEditText(Activity activity, ViewGroup rootLayout, EditText paramEditText) { this.mEditText = paramEditText; this.activity = activity; rootLayout.setLayoutTransition(transitioner); setupAnimations(transitioner); } public void show(Activity paramActivity, boolean showAnimation) { if (showAnimation) { transitioner.setDuration(200); } else { transitioner.setDuration(0); } this.mPickerHeight = SmileyPickerUtility .getKeyboardHeight(paramActivity); SmileyPickerUtility.hideSoftInput(this.mEditText); getLayoutParams().height = this.mPickerHeight; setVisibility(View.VISIBLE); // open smilepicker, press home, press app switcher to return to write // weibo interface, // softkeyboard will be opened by android system when smilepicker is // showing, // this method is used to fix this issue paramActivity.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); } public void hide(Activity paramActivity) { setVisibility(View.GONE); paramActivity.getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); } private class SmileyPagerAdapter extends PagerAdapter { @Override public void destroyItem(ViewGroup container, int position, Object object) { View view = (View) object; container.removeView(view); } @Override public Object instantiateItem(ViewGroup container, int position) { View view = activity.getLayoutInflater().inflate( R.layout.smileypicker_gridview, container, false); GridView gridView = (GridView) view.findViewById(R.id.smiley_grid); gridView.setAdapter(new SmileyAdapter(activity, position)); container.addView(view, 0, new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); return view; } @Override public void setPrimaryItem(ViewGroup container, int position, Object object) { super.setPrimaryItem(container, position, object); } @Override public int getCount() { return 2; } @Override public boolean isViewFromObject(View view, Object object) { return view.equals(object); } } private final class SmileyAdapter extends BaseAdapter { private LayoutInflater mInflater; private List<String> keys; private List<String> pics; private Map<String, Bitmap> bitmapMap; private int emotionPosition; private int count; public SmileyAdapter(Context context, int emotionPosition) { this.emotionPosition = emotionPosition; this.mInflater = LayoutInflater.from(context); this.keys = new ArrayList<String>(); this.pics = new ArrayList<String>(); Set<String> keySet; switch (emotionPosition) { case SmileyMap.GENERAL_EMOTION_POSITION: keySet = GlobalContext.getInstance().getEmotionsPics().keySet(); keys.addAll(keySet); pics.addAll(SmileyMap.getInstance().getGeneral().values()); bitmapMap = GlobalContext.getInstance().getEmotionsPics(); count = bitmapMap.size(); break; case SmileyMap.EMOJI_EMOTION_POSITION: keySet = EmojiMap.getInstance().getMap().keySet(); keys.addAll(keySet); bitmapMap = null; count = keys.size(); break; case SmileyMap.HUAHUA_EMOTION_POSITION: keySet = GlobalContext.getInstance().getHuahuaPics().keySet(); keys.addAll(keySet); pics.addAll(SmileyMap.getInstance().getHuahua().values()); bitmapMap = GlobalContext.getInstance().getHuahuaPics(); count = bitmapMap.size(); break; default: throw new IllegalArgumentException( "emotion position is invalid"); } } private void bindView(final int position, View contentView) { ImageView imageView = ((ImageView) contentView .findViewById(R.id.smiley_item)); TextView textView = (TextView) contentView .findViewById(R.id.smiley_text_item); if (emotionPosition != SmileyMap.EMOJI_EMOTION_POSITION) { imageView.setVisibility(View.VISIBLE); textView.setVisibility(View.INVISIBLE); imageView.setImageBitmap(bitmapMap.get(keys.get(position))); } else { imageView.setVisibility(View.INVISIBLE); textView.setVisibility(View.VISIBLE); textView.setText(keys.get(position)); } contentView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { int index = mEditText.getSelectionStart(); String text = keys.get(position); Editable edit = mEditText.getEditableText();// 获取EditText的文字 if (index < 0 || index >= edit.length()) { edit.append(text); } else { edit.insert(index, text);// 光标所在位置插入文字 } String content = mEditText.getText().toString(); TimeLineUtility.addEmotions(mEditText, content); mEditText.setSelection(index + text.length()); } }); } public int getCount() { return count; } public Object getItem(int paramInt) { return null; } public long getItemId(int paramInt) { return 0L; } public View getView(int paramInt, View paramView, ViewGroup paramViewGroup) { if (paramView == null) { paramView = this.mInflater.inflate( R.layout.writeweiboactivity_smileypicker_item, null); } bindView(paramInt, paramView); return paramView; } } private void setupAnimations(LayoutTransition transition) { ObjectAnimator animIn = ObjectAnimator.ofFloat(null, "translationY", SmileyPickerUtility.getScreenHeight(this.activity), mPickerHeight).setDuration( transition.getDuration(LayoutTransition.APPEARING)); transition.setAnimator(LayoutTransition.APPEARING, animIn); ObjectAnimator animOut = ObjectAnimator.ofFloat(null, "translationY", mPickerHeight, SmileyPickerUtility.getScreenHeight(this.activity)) .setDuration( transition.getDuration(LayoutTransition.DISAPPEARING)); transition.setAnimator(LayoutTransition.DISAPPEARING, animOut); } }