线上效果,为了节省空间,把图片压缩了
第一个图的表情是打到工程的本地图片,第二图的表情,是动态下载的表情包,并做一些处理
代码: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;
}