package com.wise.sharesdk; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import com.wise.wawc.R; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Build; import android.os.Handler.Callback; import android.os.Message; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.util.AttributeSet; import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ImageView.ScaleType; import android.widget.LinearLayout; import android.widget.TextView; import cn.sharesdk.framework.Platform; import cn.sharesdk.framework.ShareSDK; import cn.sharesdk.framework.utils.UIHandler; /** * 平台宫格列表显示工具。 * <p> * PlatformGridView对“android.support”包有依赖,因此请注意检查您项目中是 *否已经集成了相应的jar包 */ public class PlatformGridView extends LinearLayout implements OnPageChangeListener, OnClickListener, Callback { private static final int MSG_PLATFORM_LIST_GOT = 1; // 每行显示的格数 private int LINE_PER_PAGE; // 每页显示的行数 private int COLUMN_PER_LINE; // 每页显示的格数 private int PAGE_SIZE; // 宫格容器 private ViewPager pager; // 页面指示器 private ImageView[] points; private Bitmap grayPoint; private Bitmap whitePoint; // 是否不跳转EditPage而直接分享 private boolean silent; // 平台数据 private Platform[] platformList; // 从外部传进来的分享数据(含初始化数据) private HashMap<String, Object> reqData; private OnekeyShare parent; private ArrayList<CustomerLogo> customers; public PlatformGridView(Context context) { super(context); init(context); } public PlatformGridView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } private void init(final Context context) { calPageSize(); setOrientation(VERTICAL); pager = new ViewPager(context); disableOverScrollMode(pager); pager.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); pager.setOnPageChangeListener(this); addView(pager); // 为了更好的ui效果,开启子线程获取平台列表 new Thread(){ public void run() { platformList = ShareSDK.getPlatformList(context); UIHandler.sendEmptyMessage(MSG_PLATFORM_LIST_GOT, PlatformGridView.this); } }.start(); } private void calPageSize() { float scrW = cn.sharesdk.framework.utils.R.getScreenWidth(getContext()); float scrH = cn.sharesdk.framework.utils.R.getScreenHeight(getContext()); float whR = scrW / scrH; if (whR < 0.6) { COLUMN_PER_LINE = 3; LINE_PER_PAGE = 3; } else if (whR < 0.75) { COLUMN_PER_LINE = 3; LINE_PER_PAGE = 2; } else { LINE_PER_PAGE = 1; if (whR >= 1.75) { COLUMN_PER_LINE = 6; } else if (whR >= 1.5) { COLUMN_PER_LINE = 5; } else if (whR >= 1.3) { COLUMN_PER_LINE = 4; } else { COLUMN_PER_LINE = 3; } } PAGE_SIZE = COLUMN_PER_LINE * LINE_PER_PAGE; } public boolean handleMessage(Message msg) { switch (msg.what) { case MSG_PLATFORM_LIST_GOT: { afterPlatformListGot(); } break; } return false; } /** 初始化宫格列表ui */ public void afterPlatformListGot() { PlatformAdapter adapter = new PlatformAdapter(this); pager.setAdapter(adapter); int pageCount = 0; if (platformList != null) { int cusSize = customers == null ? 0 : customers.size(); int platSize = platformList == null ? 0 : platformList.length; int size = platSize + cusSize; pageCount = size / PAGE_SIZE; if (size % PAGE_SIZE > 0) { pageCount++; } } points = new ImageView[pageCount]; if (points.length <= 0) { return; } Context context = getContext(); LinearLayout llPoints = new LinearLayout(context); // 如果页面总是超过1,则设置页面指示器 llPoints.setVisibility(pageCount > 1 ? View.VISIBLE: View.GONE); LayoutParams lpLl = new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); lpLl.gravity = Gravity.CENTER_HORIZONTAL; llPoints.setLayoutParams(lpLl); addView(llPoints); int dp_5 = cn.sharesdk.framework.utils.R.dipToPx(context, 5); grayPoint = BitmapFactory.decodeResource(getResources(), R.drawable.gray_point); whitePoint = BitmapFactory.decodeResource(getResources(), R.drawable.white_point); for (int i = 0; i < pageCount; i++) { points[i] = new ImageView(context); points[i].setScaleType(ScaleType.CENTER_INSIDE); points[i].setImageBitmap(grayPoint); LayoutParams lpIv = new LayoutParams(dp_5, dp_5); lpIv.setMargins(dp_5, dp_5, dp_5, 0); points[i].setLayoutParams(lpIv); llPoints.addView(points[i]); } int curPage = pager.getCurrentItem(); points[curPage].setImageBitmap(whitePoint); } /** 屏幕旋转后,此方法会被调用,以刷新宫格列表的布局 */ public void onConfigurationChanged() { int curFirst = pager.getCurrentItem() * PAGE_SIZE; calPageSize(); int newPage = curFirst / PAGE_SIZE; removeViewAt(1); afterPlatformListGot(); ViewGroup.LayoutParams lp = pager.getLayoutParams(); View v = pager.getChildAt(0); v.measure(0, 0); lp.height = v.getMeasuredHeight(); pager.setLayoutParams(lp); pager.setCurrentItem(newPage); } public void onPageScrollStateChanged(int state) { if (ViewPager.SCROLL_STATE_IDLE == state) { for (int i = 0; i < points.length; i++) { points[i].setImageBitmap(grayPoint); } int curPage = pager.getCurrentItem(); points[curPage].setImageBitmap(whitePoint); } } public void onPageScrolled(int arg0, float arg1, int arg2) { } public void onPageSelected(int position) { } /** * 设置页面初始化和分享操作需要的数据 * <p> * 此方法在{@link OnekeyShare}的UI初始化中被调用 * * @param intent 携带初始化数据的Intent */ public void setData(HashMap<String, Object> data, boolean silent) { reqData = data; this.silent = silent; } /** 设置自己图标和点击事件 */ public void setCustomerLogos(ArrayList<CustomerLogo> customers) { this.customers = customers; } /** 设置分享操作的回调页面 */ public void setParent(OnekeyShare parent) { this.parent = parent; } public void onClick(View v) { Platform plat = (Platform) v.getTag(); if (plat != null) { if (silent) { HashMap<Platform, HashMap<String, Object>> shareData = new HashMap<Platform, HashMap<String,Object>>(); shareData.put(plat, reqData); parent.share(shareData); return; } String name = plat.getName(); parent.setPlatform(name); // EditPage不支持微信平台、Google+、QQ分享、Pinterest、信息和邮件,总是执行直接分享 if (ShareCore.isUseClientToShare(getContext(), name)) { HashMap<Platform, HashMap<String, Object>> shareData = new HashMap<Platform, HashMap<String,Object>>(); shareData.put(plat, reqData); parent.share(shareData); return; } // 跳转EditPage分享 EditPage page = new EditPage(); page.setShareData(reqData); page.setParent(parent); if ("true".equals(String.valueOf(reqData.get("dialogMode")))) { page.setDialogMode(); } page.show(parent.getContext(), null); parent.finish(); } } // 禁用ViewPage OverScroll的“发光”效果 private void disableOverScrollMode(View view) { if (Build.VERSION.SDK_INT < 9) { return; } try { Method m = View.class.getMethod("setOverScrollMode", new Class[] { Integer.TYPE }); m.setAccessible(true); m.invoke(view, new Object[] { Integer.valueOf(2) }); } catch (Throwable t) { t.printStackTrace(); } } /** 宫格列表数据适配器 */ private static class PlatformAdapter extends PagerAdapter { // 宫格列表元素 private GridView[] girds; private List<Object> logos; private OnClickListener callback; // 行数 private int lines; private PlatformGridView platformGridView; public PlatformAdapter(PlatformGridView platformGridView) { this.platformGridView = platformGridView; logos = new ArrayList<Object>(); Platform[] platforms = platformGridView.platformList; if (platforms != null) { logos.addAll(Arrays.asList(platforms)); } ArrayList<CustomerLogo> customers = platformGridView.customers; if (customers != null) { logos.addAll(customers); } this.callback = platformGridView; girds = null; if (logos != null) { int size = logos.size(); int PAGE_SIZE = platformGridView.PAGE_SIZE; int pageCount = size / PAGE_SIZE; if (size % PAGE_SIZE > 0) { pageCount++; } girds = new GridView[pageCount]; } } public int getCount() { return girds == null ? 0 : girds.length; } public boolean isViewFromObject(View view, Object obj) { return view == obj; } public Object instantiateItem(ViewGroup container, int position) { if (girds[position] == null) { int pageSize = platformGridView.PAGE_SIZE; int curSize = pageSize * position; int listSize = logos == null ? 0 : logos.size(); if (curSize + pageSize > listSize) { pageSize = listSize - curSize; } Object[] gridBean = new Object[pageSize]; for (int i = 0; i < pageSize; i++) { gridBean[i] = logos.get(curSize + i); } if (position == 0) { int COLUMN_PER_LINE = platformGridView.COLUMN_PER_LINE; lines = gridBean.length / COLUMN_PER_LINE; if (gridBean.length % COLUMN_PER_LINE > 0) { lines++; } } girds[position] = new GridView(this); girds[position].setData(lines, gridBean); } if (position == 0) { ViewGroup.LayoutParams lp = container.getLayoutParams(); if (lp.height <= 0) { girds[position].measure(0, 0); lp.height = girds[position].getMeasuredHeight(); container.setLayoutParams(lp); } } container.addView(girds[position]); return girds[position]; } public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } } /** 简易的宫格列表控件 */ private static class GridView extends LinearLayout { private Object[] beans; private OnClickListener callback; private int lines; private PlatformAdapter platformAdapter; public GridView(PlatformAdapter platformAdapter) { super(platformAdapter.platformGridView.getContext()); this.platformAdapter = platformAdapter; this.callback = platformAdapter.callback; } public void setData(int lines, Object[] beans) { this.lines = lines; this.beans = beans; init(); } private void init() { int dp_5 = cn.sharesdk.framework.utils.R.dipToPx(getContext(), 5); setPadding(0, dp_5, 0, dp_5); setOrientation(VERTICAL); int size = beans == null ? 0 : beans.length; int COLUMN_PER_LINE = platformAdapter.platformGridView.COLUMN_PER_LINE; int lineSize = size / COLUMN_PER_LINE; if (size % COLUMN_PER_LINE > 0) { lineSize++; } LayoutParams lp = new LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); lp.weight = 1; for (int i = 0; i < lines; i++) { LinearLayout llLine = new LinearLayout(getContext()); llLine.setLayoutParams(lp); llLine.setPadding(dp_5, 0, dp_5, 0); addView(llLine); if (i >= lineSize) { continue; } for (int j = 0; j < COLUMN_PER_LINE; j++) { final int index = i * COLUMN_PER_LINE + j; if (index >= size) { LinearLayout llItem = new LinearLayout(getContext()); llItem.setLayoutParams(lp); llLine.addView(llItem); continue; } final LinearLayout llItem = getView(index, callback, getContext()); llItem.setTag(beans[index]); llItem.setLayoutParams(lp); llLine.addView(llItem); } } } private LinearLayout getView(int position, OnClickListener ocL, Context context) { Bitmap logo; String label; OnClickListener listener; if (beans[position] instanceof Platform) { logo = getIcon((Platform) beans[position]); label = getName((Platform) beans[position]); listener = ocL; } else { logo = ((CustomerLogo) beans[position]).logo; label = ((CustomerLogo) beans[position]).label; listener = ((CustomerLogo) beans[position]).listener; } LinearLayout ll = new LinearLayout(context); ll.setOrientation(LinearLayout.VERTICAL); ImageView iv = new ImageView(context); int dp_5 = cn.sharesdk.framework.utils.R.dipToPx(context, 5); iv.setPadding(dp_5, dp_5, dp_5, dp_5); iv.setScaleType(ScaleType.CENTER_INSIDE); LinearLayout.LayoutParams lpIv = new LinearLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); lpIv.setMargins(dp_5, dp_5, dp_5, dp_5); lpIv.gravity = Gravity.CENTER_HORIZONTAL; iv.setLayoutParams(lpIv); iv.setImageBitmap(logo); ll.addView(iv); TextView tv = new TextView(context); tv.setTextColor(0xffffffff); tv.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14); tv.setSingleLine(); tv.setGravity(Gravity.CENTER_HORIZONTAL); tv.setIncludeFontPadding(false); LinearLayout.LayoutParams lpTv = new LinearLayout.LayoutParams( LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT); lpTv.weight = 1; lpTv.setMargins(dp_5, 0, dp_5, dp_5); tv.setLayoutParams(lpTv); tv.setText(label); ll.addView(tv); ll.setOnClickListener(listener); return ll; } private Bitmap getIcon(Platform plat) { if (plat == null) { return null; } String name = plat.getName(); if (name == null) { return null; } String resName = "logo_" + plat.getName(); int resId = cn.sharesdk.framework.utils.R.getResId(R.drawable.class, resName); return BitmapFactory.decodeResource(getResources(), resId); } private String getName(Platform plat) { if (plat == null) { return ""; } String name = plat.getName(); if (name == null) { return ""; } int resId = cn.sharesdk.framework.utils.R.getStringRes(getContext(), plat.getName()); return getContext().getString(resId); } } }