From fc5b6ae4e4b528f0e6966821cef910627d1bf3ca Mon Sep 17 00:00:00 2001 From: CsHeng Date: Sat, 17 Jun 2017 15:52:42 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=A4=84=E7=90=86viewpager=20fragmen?= =?UTF-8?q?t=202=E3=80=81=E5=B0=86MainActivity=E7=AE=A1=E7=90=86=E7=9A=84?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E7=A7=BB=E5=88=B0MainFragment=EF=BC=8CMessag?= =?UTF-8?q?eFragment=EF=BC=8CNewsFragment=E5=90=8C=E7=90=86=EF=BC=8C=203?= =?UTF-8?q?=E3=80=81=E5=A4=84=E7=90=86=E9=A6=96=E9=A1=B5ViewPager=E7=AD=89?= =?UTF-8?q?=E6=89=8B=E5=8A=A8=E8=AE=A1=E7=AE=97size=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=204=E3=80=81=E6=B7=BB=E5=8A=A0=E4=B8=80=E5=A0=86Scale?= =?UTF-8?q?XXXView=EF=BC=8C=E5=8F=AF=E4=BB=A5=E7=94=A8=E6=9D=A5=E8=AE=BE?= =?UTF-8?q?=E5=AE=9AView=E6=9C=AC=E8=BA=AB=E7=9A=84=E6=AF=94=E4=BE=8B?= =?UTF-8?q?=E5=A4=A7=E5=B0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit TODO 1、将DownloadManagerActivity也处理成Fragment 2、其他界面也慢慢处理成Fragment --- app/build.gradle | 1 + .../gh/base/BaseAppCompatToolBarActivity.java | 2 +- .../gh/base/{ => fragment}/BaseFragment.java | 21 +- .../base/fragment/BaseFragment_ViewPager.java | 109 ++++++ .../BaseFragment_ViewPager_Checkable.java | 105 +++++ .../java/com/gh/common/util/PackageUtils.java | 17 +- .../common/view/ScaleAutoScrollViewPager.java | 49 +++ .../gh/common/view/ScaleSimpleDraweeView.java | 63 +++ .../com/gh/gamecenter/GameDetailActivity.java | 2 +- .../java/com/gh/gamecenter/LibaoActivity.java | 2 +- .../java/com/gh/gamecenter/MainActivity.java | 351 +---------------- .../java/com/gh/gamecenter/SkipActivity.java | 2 +- .../gamecenter/adapter/ImagePagerAdapter.java | 1 + .../viewholder/GameViewPagerViewHolder.java | 12 +- .../gamecenter/download/FileSendFragment.java | 2 +- .../download/GameDownloadFragment.java | 2 +- .../download/GameUpdateFragment.java | 2 +- .../gh/gamecenter/fragment/GameFragment.java | 7 +- .../gh/gamecenter/fragment/MainFragment.java | 305 ++++++++++++++- .../gh/gamecenter/fragment/NewsFragment.java | 129 ++++++ ...agment.java => SearchToolbarFragment.java} | 120 +++--- .../gamecenter/game/GameFragmentAdapter.java | 67 +--- .../gamecenter/gamedetail/FuliFragment.java | 2 +- .../gamecenter/gamedetail/XinXiFragment.java | 2 +- .../gh/gamecenter/libao/Libao1Fragment.java | 2 +- .../gh/gamecenter/libao/Libao2Fragment.java | 2 +- .../gh/gamecenter/libao/Libao3Fragment.java | 2 +- .../gamecenter/message/CommentFragment.java | 2 +- .../gh/gamecenter/message/KeFuFragment.java | 2 +- .../gamecenter/message/MessageFragment.java | 158 +++----- .../gh/gamecenter/message/NoticeFragment.java | 2 +- .../com/gh/gamecenter/news/News1Fragment.java | 4 +- .../com/gh/gamecenter/news/News2Fragment.java | 4 +- .../com/gh/gamecenter/news/News3Fragment.java | 4 +- .../com/gh/gamecenter/news/News4Fragment.java | 4 +- .../com/gh/gamecenter/news/NewsFragment.java | 212 ---------- .../gamecenter/news/NewsWrapperFragment.java | 53 +++ .../gamecenter/personal/ConcernFragment.java | 2 +- .../gamecenter/personal/InstallFragment.java | 2 +- .../gamecenter/personal/PersonalFragment.java | 2 +- .../search/SearchGameDetailFragment.java | 2 +- .../search/SearchGameListFragment.java | 2 +- .../search/SearchHistoryFragment.java | 2 +- .../gamecenter/subject/SubjectFragment.java | 7 +- .../subject/SubjectTileFragment.java | 2 +- .../gh/gamecenter/wenda/WenDaFragment.java | 2 +- .../main/res/drawable/selector_ic_game.xml | 8 + .../main/res/drawable/selector_ic_message.xml | 8 + .../main/res/drawable/selector_ic_news.xml | 8 + .../main/res/drawable/selector_ic_user.xml | 8 + app/src/main/res/layout/activity_libao.xml | 2 +- app/src/main/res/layout/fragment_game.xml | 44 +-- .../{activity_main.xml => fragment_main.xml} | 59 ++- app/src/main/res/layout/fragment_message.xml | 20 +- app/src/main/res/layout/fragment_news.xml | 71 +++- .../res/layout/fragment_news_slidebar.xml | 65 ---- app/src/main/res/layout/fragment_page.xml | 17 - app/src/main/res/layout/fragment_toolbar.xml | 86 ++++ .../res/layout/fragment_wrapper_toolbar.xml | 18 + .../main/res/layout/game_viewpager_item.xml | 51 ++- app/src/main/res/layout/gamedetail_body.xml | 2 +- app/src/main/res/layout/home_actionbar.xml | 94 ----- app/src/main/res/values/dimens.xml | 2 +- libraries/EventBus/libs/EventBus-2.4.0.jar | Bin 45282 -> 0 bytes .../EventBus/src/main/AndroidManifest.xml | 6 - .../{EventBus => LGLibrary}/build.gradle | 3 + .../proguard-library.txt | 18 - .../LGLibrary/src/main/AndroidManifest.xml | 7 + .../adapter/BaseFragmentPagerAdapter.java | 53 +++ .../listeners/IllegalAttachException.java | 23 ++ .../listeners/OnBackPressedListener.java | 9 + .../listeners/OnBrowserActionListener.java | 13 + .../listeners/UpdateableFragment.java | 12 + .../lightgame/view/CheckableImageView.java | 42 ++ .../lightgame/view/CheckableLinearLayout.java | 57 +++ .../com/lightgame/view/DoubleTapTextView.java | 69 ++++ .../view/NoScrollableViewPager.java | 16 +- .../view/imageview/AspectRatioImageView.java | 73 ++++ .../view/imageview/RoundedDrawable.java | 366 ++++++++++++++++++ .../view/imageview/RoundedImageView.java | 323 ++++++++++++++++ .../RoundedTransformationBuilder.java | 121 ++++++ .../view/imageview/ScaleImageView.java | 47 +++ .../view/imageview/ScaleRoundedImageView.java | 47 +++ .../view/scale/ScaleFrameLayout.java | 50 +++ .../view/scale/ScaleLinearLayout.java | 51 +++ .../view/scale/ScaleRelativeLayout.java | 50 +++ .../lightgame/view/scale/ScaleViewPager.java | 51 +++ .../src/main/res/values/lightgame_attrs.xml | 21 + .../src/main/res/values/lightgame_ids.xml | 7 + settings.gradle | 1 + 90 files changed, 2803 insertions(+), 1145 deletions(-) rename app/src/main/java/com/gh/base/{ => fragment}/BaseFragment.java (85%) create mode 100755 app/src/main/java/com/gh/base/fragment/BaseFragment_ViewPager.java create mode 100755 app/src/main/java/com/gh/base/fragment/BaseFragment_ViewPager_Checkable.java create mode 100644 app/src/main/java/com/gh/common/view/ScaleAutoScrollViewPager.java create mode 100644 app/src/main/java/com/gh/common/view/ScaleSimpleDraweeView.java create mode 100644 app/src/main/java/com/gh/gamecenter/fragment/NewsFragment.java rename app/src/main/java/com/gh/gamecenter/fragment/{HomeFragment.java => SearchToolbarFragment.java} (64%) delete mode 100644 app/src/main/java/com/gh/gamecenter/news/NewsFragment.java create mode 100644 app/src/main/java/com/gh/gamecenter/news/NewsWrapperFragment.java create mode 100644 app/src/main/res/drawable/selector_ic_game.xml create mode 100644 app/src/main/res/drawable/selector_ic_message.xml create mode 100644 app/src/main/res/drawable/selector_ic_news.xml create mode 100644 app/src/main/res/drawable/selector_ic_user.xml rename app/src/main/res/layout/{activity_main.xml => fragment_main.xml} (76%) delete mode 100644 app/src/main/res/layout/fragment_news_slidebar.xml delete mode 100644 app/src/main/res/layout/fragment_page.xml create mode 100644 app/src/main/res/layout/fragment_toolbar.xml create mode 100644 app/src/main/res/layout/fragment_wrapper_toolbar.xml delete mode 100644 app/src/main/res/layout/home_actionbar.xml delete mode 100644 libraries/EventBus/libs/EventBus-2.4.0.jar delete mode 100644 libraries/EventBus/src/main/AndroidManifest.xml rename libraries/{EventBus => LGLibrary}/build.gradle (69%) rename libraries/{EventBus => LGLibrary}/proguard-library.txt (63%) create mode 100644 libraries/LGLibrary/src/main/AndroidManifest.xml create mode 100755 libraries/LGLibrary/src/main/java/com/lightgame/adapter/BaseFragmentPagerAdapter.java create mode 100644 libraries/LGLibrary/src/main/java/com/lightgame/listeners/IllegalAttachException.java create mode 100755 libraries/LGLibrary/src/main/java/com/lightgame/listeners/OnBackPressedListener.java create mode 100644 libraries/LGLibrary/src/main/java/com/lightgame/listeners/OnBrowserActionListener.java create mode 100755 libraries/LGLibrary/src/main/java/com/lightgame/listeners/UpdateableFragment.java create mode 100644 libraries/LGLibrary/src/main/java/com/lightgame/view/CheckableImageView.java create mode 100644 libraries/LGLibrary/src/main/java/com/lightgame/view/CheckableLinearLayout.java create mode 100644 libraries/LGLibrary/src/main/java/com/lightgame/view/DoubleTapTextView.java rename {app/src/main/java/com/gh/common => libraries/LGLibrary/src/main/java/com/lightgame}/view/NoScrollableViewPager.java (70%) create mode 100755 libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/AspectRatioImageView.java create mode 100755 libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/RoundedDrawable.java create mode 100755 libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/RoundedImageView.java create mode 100644 libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/RoundedTransformationBuilder.java create mode 100755 libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/ScaleImageView.java create mode 100755 libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/ScaleRoundedImageView.java create mode 100755 libraries/LGLibrary/src/main/java/com/lightgame/view/scale/ScaleFrameLayout.java create mode 100755 libraries/LGLibrary/src/main/java/com/lightgame/view/scale/ScaleLinearLayout.java create mode 100755 libraries/LGLibrary/src/main/java/com/lightgame/view/scale/ScaleRelativeLayout.java create mode 100644 libraries/LGLibrary/src/main/java/com/lightgame/view/scale/ScaleViewPager.java create mode 100644 libraries/LGLibrary/src/main/res/values/lightgame_attrs.xml create mode 100644 libraries/LGLibrary/src/main/res/values/lightgame_ids.xml diff --git a/app/build.gradle b/app/build.gradle index 3e1a0dff7f..38ebbd488a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -188,6 +188,7 @@ dependencies { compile libs.eventbus apt libs.eventbusApt + compile project(':libraries:LGLibrary') compile project(':libraries:MiPush') compile project(':libraries:MTA') compile project(':libraries:QQShare') diff --git a/app/src/main/java/com/gh/base/BaseAppCompatToolBarActivity.java b/app/src/main/java/com/gh/base/BaseAppCompatToolBarActivity.java index b9cc082191..7eafe7edbf 100644 --- a/app/src/main/java/com/gh/base/BaseAppCompatToolBarActivity.java +++ b/app/src/main/java/com/gh/base/BaseAppCompatToolBarActivity.java @@ -23,7 +23,7 @@ public abstract class BaseAppCompatToolBarActivity extends BaseAppCompatActivity private SystemBarTintManager mTintManager; // TODO 获取沉浸栏管理,要进行版本判断或者判断是否为空 - protected SystemBarTintManager getTintManager() { + public SystemBarTintManager getTintManager() { return mTintManager; } diff --git a/app/src/main/java/com/gh/base/BaseFragment.java b/app/src/main/java/com/gh/base/fragment/BaseFragment.java similarity index 85% rename from app/src/main/java/com/gh/base/BaseFragment.java rename to app/src/main/java/com/gh/base/fragment/BaseFragment.java index 99d1f5f07b..9002fff95a 100644 --- a/app/src/main/java/com/gh/base/BaseFragment.java +++ b/app/src/main/java/com/gh/base/fragment/BaseFragment.java @@ -1,6 +1,7 @@ -package com.gh.base; +package com.gh.base.fragment; import android.os.Bundle; +import android.support.annotation.LayoutRes; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; @@ -8,6 +9,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.Toast; +import com.gh.base.OnRequestCallBackListener; import com.gh.common.util.EntranceUtils; import com.gh.common.util.RuntimeUtils; import com.gh.gamecenter.eventbus.EBMiPush; @@ -22,7 +24,7 @@ import butterknife.ButterKnife; * Created by LGT on 2016/9/4. * Fragment 基类 */ -public abstract class BaseFragment extends Fragment implements OnRequestCallBackListener { +public abstract class BaseFragment extends Fragment implements OnRequestCallBackListener, View.OnClickListener { // TODO private view protected View view; @@ -31,8 +33,23 @@ public abstract class BaseFragment extends Fragment implements OnRequestCallBack protected String mEntrance; + @LayoutRes protected abstract int getLayoutId(); + /** + * 责任链,谁处理了就返回true,否则返回super.handleOnClick(View view) + * + * @return + */ + protected boolean handleOnClick(View view) { + return true; + } + + @Override + public void onClick(View v) { + handleOnClick(v); + } + protected void initView(View view) { } diff --git a/app/src/main/java/com/gh/base/fragment/BaseFragment_ViewPager.java b/app/src/main/java/com/gh/base/fragment/BaseFragment_ViewPager.java new file mode 100755 index 0000000000..3417aa45b3 --- /dev/null +++ b/app/src/main/java/com/gh/base/fragment/BaseFragment_ViewPager.java @@ -0,0 +1,109 @@ +/** + * project: OPlay + *

+ *

+ * ======================================================================== + * amend date amend user amend reason + * 2013-3-6 CsHeng + */ + +package com.gh.base.fragment; + +import android.os.Bundle; +import android.support.annotation.IdRes; +import android.support.annotation.LayoutRes; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.support.v4.view.PagerAdapter; +import android.support.v4.view.ViewPager; +import android.view.View; + +import com.lightgame.adapter.BaseFragmentPagerAdapter; +import com.lightgame.view.DoubleTapTextView; + +import java.util.ArrayList; +import java.util.List; + +/** + * ViewPager 配合RadioGroup实现双切换
+ * 记得自己控制onCreateView返回和radioGroup里面radiobutton个数,Viewpager的布局
+ * + * @author CsHeng + * @date 2013-3-6 + */ +public abstract class BaseFragment_ViewPager extends BaseFragment implements DoubleTapTextView.OnDoubleTapListener { + + private static final String ARGS_INDEX = "index"; + protected int mCheckedIndex = 0; + protected PagerAdapter mAdapter; + protected List mFragmentsList; + protected ViewPager mViewPager; + + @LayoutRes + protected abstract int getLayoutId(); + + @IdRes + protected abstract int getViewPagerId(); + + protected abstract void initFragmentList(List fragments); + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mFragmentsList = new ArrayList<>(); + initFragmentList(mFragmentsList); + mAdapter = BaseFragmentPagerAdapter.newInstance(getChildFragmentManager(), mFragmentsList); + final Bundle args = getArguments(); + if (args != null) { + mCheckedIndex = args.getInt(ARGS_INDEX); + } + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + mViewPager = (ViewPager) view.findViewById(getViewPagerId()); + mViewPager.setOffscreenPageLimit(mFragmentsList.size()); + mViewPager.setAdapter(mAdapter); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + if (mCheckedIndex < mFragmentsList.size()) { + mViewPager.setCurrentItem(mCheckedIndex, false); + } + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (getArguments() != null) { + getArguments().putInt(ARGS_INDEX, mCheckedIndex); + } + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + if (mViewPager != null) { + mViewPager.setAdapter(null); + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (mFragmentsList != null) { + mFragmentsList.clear(); + } + } + + @Override + public boolean onDoubleTap() { + final Fragment fragment = mFragmentsList.get(mViewPager.getCurrentItem()); + return fragment instanceof DoubleTapTextView.OnDoubleTapListener && ((DoubleTapTextView.OnDoubleTapListener) + fragment).onDoubleTap(); + } + +} diff --git a/app/src/main/java/com/gh/base/fragment/BaseFragment_ViewPager_Checkable.java b/app/src/main/java/com/gh/base/fragment/BaseFragment_ViewPager_Checkable.java new file mode 100755 index 0000000000..8e0be2c8b7 --- /dev/null +++ b/app/src/main/java/com/gh/base/fragment/BaseFragment_ViewPager_Checkable.java @@ -0,0 +1,105 @@ +/** + * project: OPlay + *

+ *

+ * ======================================================================== + * amend date amend user amend reason + * 2013-3-6 CsHeng + */ + +package com.gh.base.fragment; + +import android.os.Bundle; +import android.support.annotation.IdRes; +import android.support.annotation.Nullable; +import android.support.v4.view.ViewPager; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Checkable; + + +/** + * ViewPager 配合ViewGroup Checkable实现双切换
+ * 记得自己控制onCreateView返回和ViewGroup里面Checkable个数,ViewPager的布局
+ * + * @author CsHeng + * @date 2013-3-6 + * @update 2014-09-29 + */ +public abstract class BaseFragment_ViewPager_Checkable extends BaseFragment_ViewPager implements + ViewPager.OnPageChangeListener { + + protected ViewGroup mCheckableGroup; + + @IdRes + protected abstract int getCheckableGroupId(); + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + mCheckableGroup = (ViewGroup) view.findViewById(getCheckableGroupId()); + for (int i = 0, size = mCheckableGroup.getChildCount(); i < size; i++) { + mCheckableGroup.getChildAt(i).setOnClickListener(this); + } + mViewPager.addOnPageChangeListener(this); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + mViewPager.removeOnPageChangeListener(this); + } + + @Override + public void onActivityCreated(Bundle savedInstanceState) { + super.onActivityCreated(savedInstanceState); + checkIndex(mCheckedIndex); + } + + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + + } + + @Override + public void onPageSelected(int index) { + onPageChanged(index); + } + + @Override + public void onPageScrollStateChanged(int state) { + + } + + @Override + protected boolean handleOnClick(View view) { + final int toCheck = mCheckableGroup.indexOfChild(view); + if (toCheck != -1) { + mViewPager.setCurrentItem(toCheck, false); + return true; + } + return super.handleOnClick(view); + } + + protected void checkIndex(int index) { + final int childCount = mCheckableGroup.getChildCount(); + if (index < childCount && mCheckedIndex < childCount) { + final View toChecked = mCheckableGroup.getChildAt(index); + if (toChecked instanceof Checkable) { + ((Checkable) toChecked).setChecked(true); + } + if (index != mCheckedIndex) { + final View checkedChild = mCheckableGroup.getChildAt(mCheckedIndex); + if (checkedChild instanceof Checkable) { + ((Checkable) checkedChild).setChecked(false); + } + } + mCheckedIndex = index; + } + } + + protected void onPageChanged(int index) { + checkIndex(index); + } + +} diff --git a/app/src/main/java/com/gh/common/util/PackageUtils.java b/app/src/main/java/com/gh/common/util/PackageUtils.java index aca1629360..73dc01c5f5 100644 --- a/app/src/main/java/com/gh/common/util/PackageUtils.java +++ b/app/src/main/java/com/gh/common/util/PackageUtils.java @@ -91,12 +91,10 @@ public class PackageUtils { private static String[] parseSignature(byte[] signature) { String[] ret = null; try { - CertificateFactory certFactory = CertificateFactory - .getInstance("X.509"); - X509Certificate cert = (X509Certificate) certFactory - .generateCertificate(new ByteArrayInputStream(signature)); - ret = new String[]{cert.getPublicKey().toString(), - cert.getSerialNumber().toString()}; + CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); + X509Certificate cert = (X509Certificate) certFactory.generateCertificate( + new ByteArrayInputStream(signature)); + ret = new String[]{cert.getPublicKey().toString(), cert.getSerialNumber().toString()}; } catch (CertificateException e) { e.printStackTrace(); } @@ -159,8 +157,8 @@ public class PackageUtils { */ public static Intent getUninstallIntent(Context context, String path) { Intent uninstallIntent = new Intent(); - uninstallIntent.setAction("android.intent.action.DELETE"); - uninstallIntent.addCategory("android.intent.category.DEFAULT"); + uninstallIntent.setAction(Intent.ACTION_DELETE); + uninstallIntent.addCategory(Intent.CATEGORY_DEFAULT); String packageName = getPackageNameByPath(context, path); uninstallIntent.setData(Uri.parse("package:" + packageName)); InstallUtils.getInstance(context).addUninstall(packageName); @@ -172,8 +170,7 @@ public class PackageUtils { */ public static String getPackageNameByPath(Context context, String path) { PackageManager packageManager = context.getApplicationContext().getPackageManager(); - PackageInfo info = packageManager.getPackageArchiveInfo(path, - PackageManager.GET_ACTIVITIES); + PackageInfo info = packageManager.getPackageArchiveInfo(path, PackageManager.GET_ACTIVITIES); if (info != null) { ApplicationInfo appInfo = info.applicationInfo; return appInfo.packageName; diff --git a/app/src/main/java/com/gh/common/view/ScaleAutoScrollViewPager.java b/app/src/main/java/com/gh/common/view/ScaleAutoScrollViewPager.java new file mode 100644 index 0000000000..bb934f13d5 --- /dev/null +++ b/app/src/main/java/com/gh/common/view/ScaleAutoScrollViewPager.java @@ -0,0 +1,49 @@ +package com.gh.common.view; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; + +import com.gh.gamecenter.R; + +import cn.trinea.android.view.autoscrollviewpager.AutoScrollViewPager; + +/** + * @author CsHeng + * @Date 17/06/2017 + * @Time 12:24 PM + */ + +public class ScaleAutoScrollViewPager extends AutoScrollViewPager { + + private boolean mMeasureByHeight = false; // default width + private float mScale = 1f;// default square + + public ScaleAutoScrollViewPager(Context context) { + super(context); + } + + public ScaleAutoScrollViewPager(Context context, AttributeSet set) { + super(context, set); + TypedArray a = context.obtainStyledAttributes(set, R.styleable.ScaleView); + int enumV = a.getInt(R.styleable.ScaleView_measureBy, 0); + mScale = a.getFloat(R.styleable.ScaleView_fractionValue, mScale); + if (enumV != 0) { + mMeasureByHeight = true; + } + a.recycle(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + if (mMeasureByHeight) { + setMeasuredDimension((int) (height * mScale), height); + } else { + setMeasuredDimension(width, (int) (width * mScale)); + } + + } +} diff --git a/app/src/main/java/com/gh/common/view/ScaleSimpleDraweeView.java b/app/src/main/java/com/gh/common/view/ScaleSimpleDraweeView.java new file mode 100644 index 0000000000..569dfd766f --- /dev/null +++ b/app/src/main/java/com/gh/common/view/ScaleSimpleDraweeView.java @@ -0,0 +1,63 @@ +package com.gh.common.view; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; + +import com.facebook.drawee.view.SimpleDraweeView; +import com.gh.gamecenter.R; + +/** + * @author CsHeng + * @Date 17/06/2017 + * @Time 2:46 PM + */ + +public class ScaleSimpleDraweeView extends SimpleDraweeView { + + private boolean mMeasureByHeight = false; // default width + + private float mFraction = 1f;// default square + + public ScaleSimpleDraweeView(Context context) { + super(context); + } + + public ScaleSimpleDraweeView(Context context, AttributeSet attrs) { + super(context, attrs); + init(context, attrs); + } + + public ScaleSimpleDraweeView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(context, attrs); + } + + public ScaleSimpleDraweeView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + init(context, attrs); + } + + public void init(Context context, AttributeSet attrs) { + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ScaleView); + int enumV = a.getInt(R.styleable.ScaleView_measureBy, 0); + mFraction = a.getFloat(R.styleable.ScaleView_fractionValue, mFraction); + if (enumV != 0) { + mMeasureByHeight = true; + } + a.recycle(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + if (mMeasureByHeight) { + setMeasuredDimension((int) (height * mFraction), height); + } else { + setMeasuredDimension(width, (int) (width * mFraction)); + } + } + + +} diff --git a/app/src/main/java/com/gh/gamecenter/GameDetailActivity.java b/app/src/main/java/com/gh/gamecenter/GameDetailActivity.java index e975db4e0f..6a5b336dbe 100644 --- a/app/src/main/java/com/gh/gamecenter/GameDetailActivity.java +++ b/app/src/main/java/com/gh/gamecenter/GameDetailActivity.java @@ -37,7 +37,7 @@ import com.gh.common.util.PackageUtils; import com.gh.common.util.ShareUtils; import com.gh.common.util.Utils; import com.gh.common.view.DownloadDialog; -import com.gh.common.view.NoScrollableViewPager; +import com.lightgame.view.NoScrollableViewPager; import com.gh.download.DataWatcher; import com.gh.download.DownloadEntity; import com.gh.download.DownloadManager; diff --git a/app/src/main/java/com/gh/gamecenter/LibaoActivity.java b/app/src/main/java/com/gh/gamecenter/LibaoActivity.java index 8392e676ef..d62e3dc6c7 100644 --- a/app/src/main/java/com/gh/gamecenter/LibaoActivity.java +++ b/app/src/main/java/com/gh/gamecenter/LibaoActivity.java @@ -11,7 +11,7 @@ import android.widget.TextView; import com.gh.base.BaseActivity; import com.gh.common.util.DisplayUtils; -import com.gh.common.view.NoScrollableViewPager; +import com.lightgame.view.NoScrollableViewPager; import com.gh.base.adapter.FragmentAdapter; import com.gh.gamecenter.eventbus.EBReuse; import com.gh.gamecenter.eventbus.EBUISwitch; diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index b7e1c65fa8..b425eb8b44 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -5,29 +5,20 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; -import android.graphics.Color; import android.net.Uri; -import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.SystemClock; import android.provider.Settings; import android.support.annotation.NonNull; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentTransaction; import android.support.v4.util.ArrayMap; import android.text.Html; import android.text.Spanned; import android.text.TextUtils; import android.view.KeyEvent; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.CheckedTextView; -import android.widget.ImageView; import com.gh.base.AppController; import com.gh.base.BaseActivity; -import com.gh.base.SearchBarHint; import com.gh.common.constant.Config; import com.gh.common.util.ClassUtils; import com.gh.common.util.DataCollectionUtils; @@ -47,37 +38,27 @@ import com.gh.download.DataWatcher; import com.gh.download.DownloadEntity; import com.gh.download.DownloadManager; import com.gh.download.DownloadStatus; -import com.gh.gamecenter.db.KeFuMarkReadDao; -import com.gh.gamecenter.db.MessageMarkReadDao; import com.gh.gamecenter.db.info.ConcernInfo; import com.gh.gamecenter.db.info.GameInfo; -import com.gh.gamecenter.db.info.MessageMarkReadInfo; import com.gh.gamecenter.entity.ApkEntity; import com.gh.gamecenter.entity.GameDigestEntity; import com.gh.gamecenter.entity.GameEntity; import com.gh.gamecenter.entity.GameUpdateEntity; -import com.gh.gamecenter.entity.MessageUnreadEntity; import com.gh.gamecenter.eventbus.EBDownloadStatus; import com.gh.gamecenter.eventbus.EBPackage; -import com.gh.gamecenter.eventbus.EBReuse; import com.gh.gamecenter.eventbus.EBShowDialog; -import com.gh.gamecenter.eventbus.EBSkip; import com.gh.gamecenter.eventbus.EBUISwitch; -import com.gh.gamecenter.fragment.GameFragment; +import com.gh.gamecenter.fragment.MainFragment; import com.gh.gamecenter.manager.ConcernManager; import com.gh.gamecenter.manager.DataCollectionManager; import com.gh.gamecenter.manager.FilterManager; import com.gh.gamecenter.manager.GameManager; import com.gh.gamecenter.manager.PackageManager; import com.gh.gamecenter.manager.UpdateManager; -import com.gh.gamecenter.message.MessageFragment; -import com.gh.gamecenter.news.NewsFragment; -import com.gh.gamecenter.personal.PersonalFragment; import com.gh.gamecenter.retrofit.JSONObjectResponse; import com.gh.gamecenter.retrofit.ObservableUtil; import com.gh.gamecenter.retrofit.Response; import com.gh.gamecenter.retrofit.RetrofitManager; -import com.readystatesoftware.systembartint.SystemBarTintManager; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -95,7 +76,6 @@ import java.util.concurrent.CountDownLatch; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import butterknife.BindView; import okhttp3.MediaType; import okhttp3.RequestBody; import okhttp3.ResponseBody; @@ -109,40 +89,13 @@ import rx.schedulers.Schedulers; /** * 项目的主Activity,3个Fragment都嵌入在这里。 */ -public class MainActivity extends BaseActivity implements OnClickListener { +public class MainActivity extends BaseActivity { - public static final int INDEX_GAME = 0; - public static final int INDEX_NEWS = 1; - public static final int INDEX_MESSAGE = 2; - public static final int INDEX_PERSONAL = 3; public final static String EB_MAINACTIVITY_TAG = "MainActivity"; public final static String EB_SKIP_GAMEFRAGMENT = "GameFragment"; - @BindView(R.id.main_iv_game) - ImageView ivGame; - @BindView(R.id.main_iv_news) - ImageView ivNews; - @BindView(R.id.main_iv_message) - ImageView ivMessage; - @BindView(R.id.main_iv_personal) - ImageView ivPersonal; - @BindView(R.id.main_tv_game) - CheckedTextView tvGame; - @BindView(R.id.main_tv_news) - CheckedTextView tvNews; - @BindView(R.id.main_tv_message) - CheckedTextView tvMessage; - @BindView(R.id.main_tv_personal) - CheckedTextView tvPersonal; - @BindView(R.id.main_iv_message_hint) - View mMessageHint; - private NewsFragment newsFragment; - private MessageFragment messageFragment; - private PersonalFragment personalFragment; - private GameFragment gameFragment; private SharedPreferences sp; private ConcernManager concernManager; - private ArrayList mSearchHintLint; - private int currentTab; + private boolean isSkipped; Runnable skipRun = new Runnable() { @Override @@ -374,13 +327,12 @@ public class MainActivity extends BaseActivity implements OnClickListener { @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - outState.putInt("currentTab", currentTab); outState.putBoolean("isSkipped", isSkipped); } @Override protected int getLayoutId() { - return R.layout.activity_main; + return R.layout.layout_wrapper_activity; } @Override @@ -681,19 +633,18 @@ public class MainActivity extends BaseActivity implements OnClickListener { isSkipped = false; - initViews(); +// initViews(); if (savedInstanceState != null) { - currentTab = savedInstanceState.getInt("currentTab"); +// currentTab = savedInstanceState.getInt("currentTab"); isSkipped = savedInstanceState.getBoolean("isSkipped"); - } else { - currentTab = 0; +// } else { +// currentTab = 0; } - setTabSelection(currentTab); + + replaceFragment(new MainFragment()); concernManager = new ConcernManager(getApplicationContext()); - getSearchHints(); - if (!isNewFirstLaunch && sp.getBoolean("autoupdate", true)) { // 检查助手更新 UpdateManager.getInstance(this).checkUpdate(true, null); @@ -745,9 +696,6 @@ public class MainActivity extends BaseActivity implements OnClickListener { getSuggestionType(); - checkMarkRead(); // 检查是否有记录已读消息 - - checkMessageUnread(true); // 检查是否有未读消息 } @Override @@ -762,123 +710,6 @@ public class MainActivity extends BaseActivity implements OnClickListener { handler.removeCallbacksAndMessages(null); } - private void checkMessageUnread(boolean isCheck) { - TokenUtils.getToken(this, isCheck) - .flatMap(new Func1>() { - @Override - public Observable call(String token) { - return RetrofitManager.getMessage().getMessageUnread(token); - } - }) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Response() { - @Override - public void onResponse(MessageUnreadEntity response) { - super.onResponse(response); - if (response != null && response.getKefuList() != null && response.getKefuList().size() > 0) { - KeFuMarkReadDao dao = new KeFuMarkReadDao(MainActivity.this); - for (int i = 0; i < response.getKefuList().size(); i++) { - if (dao.isMarkRead(response.getKefuList().get(i))) { - response.getKefuList().remove(i); - i--; - } - } - - if (response.getKefuList() != null && response.getKefuList().size() > 0) { - mMessageHint.setVisibility(View.VISIBLE); - } - - } - - if (response != null && response.getComment() > 0) { - mMessageHint.setVisibility(View.VISIBLE); - } - } - - @Override - public void onFailure(HttpException e) { - if (e != null && e.code() == 401) { - checkMessageUnread(false); - } - } - }); - } - - private void checkMarkRead() { - MessageMarkReadDao readDao = new MessageMarkReadDao(MainActivity.this); - List readInfos = readDao.getAll(); - if (readInfos == null || readInfos.size() == 0) { - return; - } - - MessageMarkReadInfo readInfo = readInfos.get(0); - HashMap kefuIds = readInfo.getKefuIds(); - HashMap noticeIds = readInfo.getNoticeIds(); - - if (kefuIds != null && kefuIds.size() > 0) { - Utils.log("======提交已读客服消息"); - JSONArray array = new JSONArray(); - for (String s : kefuIds.keySet()) { - array.put(s); - } - Utils.log("======客服id::" + array.toString()); - RequestBody body = RequestBody.create(MediaType.parse("application/json"), array.toString()); - postMarkRead("kefu", true, body, readDao); - } - - if (noticeIds != null && noticeIds.size() > 0) { - Utils.log("======提交已读公告消息"); - JSONArray array = new JSONArray(); - for (String s : noticeIds.keySet()) { - array.put(s); - } - Utils.log("======客服id::" + array.toString()); - RequestBody body = RequestBody.create(MediaType.parse("application/json"), array.toString()); - postMarkRead("notice", true, body, readDao); - } - - } - - private void postMarkRead(final String type, boolean isCkeck, final RequestBody body, final MessageMarkReadDao readDao) { - TokenUtils - .getToken(MainActivity.this, isCkeck) - .flatMap(new Func1>() { - @Override - public Observable call(String token) { - if ("kefu".equals(type)) { - return RetrofitManager.getMessage().postMarkKeFuRead(body, token); - } else { - return RetrofitManager.getMessage().postMarkNoticeRead(body, token); - } - } - }) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Response() { - @Override - public void onResponse(ResponseBody response) { - super.onResponse(response); - Utils.log("=========postMarkRead::" + type); - if ("kefu".equals(type)) { - readDao.cleanKeFu(); - } else { - readDao.cleanNotice(); - } - - } - - @Override - public void onFailure(HttpException e) { - super.onFailure(e); - if (e != null && e.code() == 401) { - postMarkRead(type, false, body, readDao); - } - } - }); - - } - private void getSuggestionType() { RetrofitManager .getApi() @@ -996,7 +827,7 @@ public class MainActivity extends BaseActivity implements OnClickListener { final ArrayList concernDigest = new ArrayList<>(); if (arrGameId.size() == 0) { - EventBus.getDefault().post(new EBUISwitch("NewsFragment", -2)); // 没有关注 + EventBus.getDefault().post(new EBUISwitch("NewsWrapperFragment", -2)); // 没有关注 } List> list = new ArrayList<>(); @@ -1019,13 +850,6 @@ public class MainActivity extends BaseActivity implements OnClickListener { }); } - private void initViews() { - findViewById(R.id.main_ll_game).setOnClickListener(this); - findViewById(R.id.main_ll_news).setOnClickListener(this); - findViewById(R.id.main_ll_message).setOnClickListener(this); - findViewById(R.id.main_ll_personal).setOnClickListener(this); - } - private void checkPermission() { List installedList = getPackageManager().getInstalledPackages(0); if (installedList.isEmpty()) { @@ -1049,32 +873,6 @@ public class MainActivity extends BaseActivity implements OnClickListener { } } - private void getSearchHints() { - RetrofitManager.getApi().getSearchHints() - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Response>() { - @Override - public void onResponse(ArrayList response) { - if (response.size() != 0) { -// if (response.size() == 1) { -// mSearchHintLint = response.get(0); -// } else { -// mSearchHintLint = response.get(RandomUtils.nextInt(response.size())); -// } - - mSearchHintLint = response; - if (gameFragment != null) { - gameFragment.setHint(mSearchHintLint); - } - if (newsFragment != null) { - newsFragment.setHint(mSearchHintLint); - } - } - } - }); - } - // 获取META-INF中的plugin_update 文件,判断是否从游戏插件中下载的app,是则获取游戏id,启动游戏更新,下载该游戏 private void getPluginUpdate() { ApplicationInfo appinfo = getApplicationInfo(); @@ -1109,133 +907,6 @@ public class MainActivity extends BaseActivity implements OnClickListener { } } - @Override - public void onClick(View v) { - final int id = v.getId(); - switch (v.getId()) { - case R.id.main_ll_game: - EventBus.getDefault().post(new EBUISwitch(EB_MAINACTIVITY_TAG, INDEX_GAME)); - setTabSelection(INDEX_GAME); - break; - case R.id.main_ll_news: - EventBus.getDefault().post(new EBUISwitch(EB_MAINACTIVITY_TAG, INDEX_NEWS)); - setTabSelection(INDEX_NEWS); - break; - case R.id.main_ll_message: - EventBus.getDefault().post(new EBUISwitch(EB_MAINACTIVITY_TAG, INDEX_MESSAGE)); - setTabSelection(INDEX_MESSAGE); - break; - case R.id.main_ll_personal: - EventBus.getDefault().post(new EBUISwitch(EB_MAINACTIVITY_TAG, INDEX_PERSONAL)); - setTabSelection(INDEX_PERSONAL); - break; - default: - break; - } - - SystemBarTintManager tintManager = getTintManager(); - if (tintManager != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - if (id == R.id.main_ll_personal) { - tintManager.setStatusBarTintResource(R.color.theme); - } else if (Build.MANUFACTURER.equals("Meizu") || Build.MANUFACTURER.equals("Xiaomi")) { - tintManager.setStatusBarTintColor(Color.WHITE); - } else { - tintManager.setStatusBarTintColor(Color.BLACK); - } - } - } - - private void setTabSelection(int index) { - clearSelection(); - FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); - hideFragments(transaction); - switch (index) { - case INDEX_GAME: - ivGame.setImageResource(R.drawable.ic_game_select); - tvGame.setChecked(true); - gameFragment = alterFragment(transaction, GameFragment.class); - break; - case INDEX_NEWS: - ivNews.setImageResource(R.drawable.ic_news_select); - tvNews.setChecked(true); - newsFragment = alterFragment(transaction, NewsFragment.class); - break; - case INDEX_MESSAGE: - ivMessage.setImageResource(R.drawable.ic_message_select); - tvMessage.setChecked(true); - messageFragment = alterFragment(transaction, MessageFragment.class); - break; - case INDEX_PERSONAL: - ivPersonal.setImageResource(R.drawable.ic_user_select); - tvPersonal.setChecked(true); - personalFragment = alterFragment(transaction, PersonalFragment.class); - break; - default: - break; - } - currentTab = index; - transaction.commit(); - } - - // 清除掉所有的选中状态。 - private void clearSelection() { - ivGame.setImageResource(R.drawable.ic_game_unselect); - ivNews.setImageResource(R.drawable.ic_news_unselect); - ivMessage.setImageResource(R.drawable.ic_message_unselect); - ivPersonal.setImageResource(R.drawable.ic_user_unselect); - - tvGame.setChecked(false); - tvNews.setChecked(false); - tvMessage.setChecked(false); - tvPersonal.setChecked(false); - } - - // 将所有的Fragment都置为隐藏状态。 - private void hideFragments(FragmentTransaction transaction) { - List list = getSupportFragmentManager().getFragments(); - if (list != null) { - for (Fragment fragment : list) { - transaction.hide(fragment); - } - } - } - - // private T alterFragment(Class cls) { - private T alterFragment(FragmentTransaction transaction, Class cls) { - T fragmentByTag = (T) getSupportFragmentManager().findFragmentByTag(cls.getSimpleName()); - try { - if (fragmentByTag != null) { - transaction.show(fragmentByTag); - } else { - fragmentByTag = cls.newInstance(); - transaction.add(R.id.main_content, fragmentByTag, cls.getSimpleName()); - if (fragmentByTag instanceof SearchBarHint && mSearchHintLint != null && mSearchHintLint.size() > 0) { - ((SearchBarHint) fragmentByTag).setHint(mSearchHintLint); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - return fragmentByTag; - } - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEventMainThread(EBSkip skip) { - if (EB_SKIP_GAMEFRAGMENT.equals(skip.getType())) { - EventBus.getDefault().post(new EBUISwitch(EB_MAINACTIVITY_TAG, INDEX_GAME)); - setTabSelection(INDEX_GAME); - EventBus.getDefault().post(new EBSkip(EB_MAINACTIVITY_TAG, skip.getCurrentItem())); - } - } - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEventMainThread(EBReuse reuse) { - if (MessageFragment.MESSAGE_READ_OVER.equals(reuse.getType())) { - Utils.log("======= over??"); - mMessageHint.setVisibility(View.GONE); - } - } - @Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(EBPackage busFour) { final String packageName = busFour.getPackageName(); diff --git a/app/src/main/java/com/gh/gamecenter/SkipActivity.java b/app/src/main/java/com/gh/gamecenter/SkipActivity.java index 2974e5fd42..cc97b12c43 100644 --- a/app/src/main/java/com/gh/gamecenter/SkipActivity.java +++ b/app/src/main/java/com/gh/gamecenter/SkipActivity.java @@ -38,7 +38,7 @@ public class SkipActivity extends BaseActivity { @Override protected int getLayoutId() { //TODO 暂时无意义设置,避免崩溃罢了,修改完主题和Toolbar相关内容会干掉这个 - return R.layout.activity_main; + return R.layout.fragment_main; } @Override diff --git a/app/src/main/java/com/gh/gamecenter/adapter/ImagePagerAdapter.java b/app/src/main/java/com/gh/gamecenter/adapter/ImagePagerAdapter.java index 9a10c42c60..e75347b229 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/ImagePagerAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/ImagePagerAdapter.java @@ -70,6 +70,7 @@ public class ImagePagerAdapter extends RecyclingPagerAdapter { ImageUtils.getInstance().display(mContext.getResources(), (SimpleDraweeView) view, slideEntity.getImage(), R.drawable.preload); + // indicator.setPosition(mSlideEntityList.mSize(), getPosition(position)); view.setOnClickListener(new View.OnClickListener() { diff --git a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/GameViewPagerViewHolder.java b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/GameViewPagerViewHolder.java index 027209efb0..e4f5b76ff6 100644 --- a/app/src/main/java/com/gh/gamecenter/adapter/viewholder/GameViewPagerViewHolder.java +++ b/app/src/main/java/com/gh/gamecenter/adapter/viewholder/GameViewPagerViewHolder.java @@ -1,8 +1,9 @@ package com.gh.gamecenter.adapter.viewholder; import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; import android.widget.LinearLayout; -import android.widget.RelativeLayout; import android.widget.TextView; import com.gh.base.BaseRecyclerViewHolder; @@ -23,15 +24,18 @@ public class GameViewPagerViewHolder extends BaseRecyclerViewHolder { public LinearLayout viewpager_ll_hint; @BindView(R.id.viewpager_tv_failure) public TextView viewpager_tv_failure; - @BindView(R.id.home_subject_rl) - public RelativeLayout subjectRl; @BindView(R.id.home_subject_failure) public TextView subjectFailure; @BindView(R.id.home_subject_ll) public LinearLayout subjectLl; - public GameViewPagerViewHolder(View itemView) { + public GameViewPagerViewHolder(View itemView, int width) { super(itemView); + // 傻逼viewpager拿不到高度,一定要自己算下,妈的,先不管了 + FrameLayout.LayoutParams params = new FrameLayout.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, (int) (width / 16f * 7f)); + viewPager.setLayoutParams(params); + } } diff --git a/app/src/main/java/com/gh/gamecenter/download/FileSendFragment.java b/app/src/main/java/com/gh/gamecenter/download/FileSendFragment.java index db930a33d1..a5724f9943 100644 --- a/app/src/main/java/com/gh/gamecenter/download/FileSendFragment.java +++ b/app/src/main/java/com/gh/gamecenter/download/FileSendFragment.java @@ -6,7 +6,7 @@ import android.text.Html; import android.view.View; import android.widget.TextView; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment; import com.gh.common.util.DialogUtils; import com.gh.common.util.StringUtils; import com.gh.gamecenter.CleanApkActivity; diff --git a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java index 0639feb55a..52a438c1ac 100644 --- a/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java +++ b/app/src/main/java/com/gh/gamecenter/download/GameDownloadFragment.java @@ -15,7 +15,7 @@ import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment; import com.gh.common.constant.Constants; import com.gh.common.util.DialogUtils; import com.gh.common.util.NetworkUtils; diff --git a/app/src/main/java/com/gh/gamecenter/download/GameUpdateFragment.java b/app/src/main/java/com/gh/gamecenter/download/GameUpdateFragment.java index ff40f55e54..f36aa86354 100644 --- a/app/src/main/java/com/gh/gamecenter/download/GameUpdateFragment.java +++ b/app/src/main/java/com/gh/gamecenter/download/GameUpdateFragment.java @@ -7,7 +7,7 @@ import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment; import com.gh.common.util.EntranceUtils; import com.gh.gamecenter.MainActivity; import com.gh.gamecenter.R; diff --git a/app/src/main/java/com/gh/gamecenter/fragment/GameFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/GameFragment.java index 5ce40754a5..9eeeef4aff 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/GameFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/GameFragment.java @@ -37,7 +37,7 @@ import java.util.List; * Created by khy on 2016/12/6. * 新主界面 */ -public class GameFragment extends HomeFragment implements SwipeRefreshLayout.OnRefreshListener, OnRequestCallBackListener { +public class GameFragment extends SearchToolbarFragment implements SwipeRefreshLayout.OnRefreshListener, OnRequestCallBackListener { private SwipeRefreshLayout fm_game_swipe_refresh; private RecyclerView fm_game_rv_list; @@ -91,8 +91,7 @@ public class GameFragment extends HomeFragment implements SwipeRefreshLayout.OnR @Override protected void initView(final View view) { super.initView(view); - View inflate = View.inflate(getActivity(), R.layout.fragment_game, null); - ((LinearLayout) view).addView(inflate); + reuse_no_connection = (LinearLayout) view.findViewById(R.id.reuse_no_connection); fm_game_swipe_refresh = (SwipeRefreshLayout) view.findViewById(R.id.fm_game_swipe_refresh); fm_game_rv_list = (RecyclerView) view.findViewById(R.id.fm_game_rv_list); @@ -115,7 +114,7 @@ public class GameFragment extends HomeFragment implements SwipeRefreshLayout.OnR ((DefaultItemAnimator) fm_game_rv_list.getItemAnimator()).setSupportsChangeAnimations(false); fm_game_rv_list.setHasFixedSize(true); fm_game_rv_list.setLayoutManager(new LinearLayoutManager(getActivity())); - adapter = new GameFragmentAdapter(GameFragment.this, fm_game_swipe_refresh); + adapter = new GameFragmentAdapter(this, fm_game_swipe_refresh); fm_game_rv_list.setAdapter(adapter); fm_game_rv_list.addOnScrollListener(new RecyclerView.OnScrollListener() { diff --git a/app/src/main/java/com/gh/gamecenter/fragment/MainFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/MainFragment.java index ba241ecb20..1af3438a05 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/MainFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/MainFragment.java @@ -1,10 +1,295 @@ -//package com.gh.gamecenter.fragment; -// -///** -// * @author CsHeng -// * @Date 05/05/2017 -// * @Time 3:26 PM -// */ -// -//public class MainFragment { -//} +package com.gh.gamecenter.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.os.Build; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.View; + +import com.gh.base.SearchBarHint; +import com.gh.base.fragment.BaseFragment_ViewPager_Checkable; +import com.gh.common.util.TokenUtils; +import com.gh.common.util.Utils; +import com.gh.gamecenter.MainActivity; +import com.gh.gamecenter.R; +import com.gh.gamecenter.db.KeFuMarkReadDao; +import com.gh.gamecenter.db.MessageMarkReadDao; +import com.gh.gamecenter.db.info.MessageMarkReadInfo; +import com.gh.gamecenter.entity.MessageUnreadEntity; +import com.gh.gamecenter.eventbus.EBReuse; +import com.gh.gamecenter.eventbus.EBSkip; +import com.gh.gamecenter.eventbus.EBUISwitch; +import com.gh.gamecenter.message.MessageFragment; +import com.gh.gamecenter.news.NewsWrapperFragment; +import com.gh.gamecenter.personal.PersonalFragment; +import com.gh.gamecenter.retrofit.Response; +import com.gh.gamecenter.retrofit.RetrofitManager; +import com.lightgame.view.NoScrollableViewPager; +import com.readystatesoftware.systembartint.SystemBarTintManager; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; +import org.json.JSONArray; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import butterknife.BindView; +import okhttp3.MediaType; +import okhttp3.RequestBody; +import okhttp3.ResponseBody; +import retrofit2.HttpException; +import rx.Observable; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Func1; +import rx.schedulers.Schedulers; + +import static com.gh.gamecenter.MainActivity.EB_MAINACTIVITY_TAG; +import static com.gh.gamecenter.MainActivity.EB_SKIP_GAMEFRAGMENT; + +/** + * @author CsHeng + * @Date 05/05/2017 + * @Time 3:26 PM + */ + +public class MainFragment extends BaseFragment_ViewPager_Checkable { + + public static final int INDEX_GAME = 0; + public static final int INDEX_NEWS = 1; + public static final int INDEX_MESSAGE = 2; + public static final int INDEX_PERSONAL = 3; + private ArrayList mSearchHintLint; + @BindView(R.id.main_iv_message_hint) + View mMessageHint; + + @Override + protected int getLayoutId() { + return R.layout.fragment_main; + } + + @Override + protected int getCheckableGroupId() { + return R.id.lightgame_tab_container; + } + + @Override + protected int getViewPagerId() { + return R.id.lightgame_tab_viewpager; + } + + @Override + protected void initFragmentList(List fragments) { + fragments.add(new GameFragment()); + fragments.add(new NewsWrapperFragment()); + fragments.add(new MessageFragment()); + fragments.add(new PersonalFragment()); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + checkMarkRead(getContext()); // 检查是否有记录已读消息 + checkMessageUnread(getContext(), true); // 检查是否有未读消息 + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + if (mViewPager instanceof NoScrollableViewPager) { + ((NoScrollableViewPager) mViewPager).setScrollable(false); + } + getSearchHints(); + } + + @Override + protected boolean handleOnClick(View view) { + boolean res = super.handleOnClick(view); + EventBus.getDefault().post(new EBUISwitch(EB_MAINACTIVITY_TAG, mCheckedIndex)); + return res; + } + + @Override + protected void onPageChanged(int index) { + super.onPageChanged(index); + + Fragment fragment = mFragmentsList.get(index); + if (fragment instanceof SearchBarHint && mSearchHintLint != null && !mSearchHintLint.isEmpty()) { + ((SearchBarHint) fragment).setHint(mSearchHintLint); + } + + if (getActivity() instanceof MainActivity) { + SystemBarTintManager tintManager = ((MainActivity) getActivity()).getTintManager(); + if (tintManager != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + if (index == INDEX_PERSONAL) { + tintManager.setStatusBarTintResource(R.color.theme); + } else if (Build.MANUFACTURER.equals("Meizu") || Build.MANUFACTURER.equals("Xiaomi")) { + tintManager.setStatusBarTintColor(Color.WHITE); + } else { + tintManager.setStatusBarTintColor(Color.BLACK); + } + } + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onEventMainThread(EBSkip skip) { + if (EB_SKIP_GAMEFRAGMENT.equals(skip.getType())) { + EventBus.getDefault().post(new EBUISwitch(EB_MAINACTIVITY_TAG, INDEX_GAME)); + checkIndex(INDEX_GAME); + EventBus.getDefault().post(new EBSkip(EB_MAINACTIVITY_TAG, skip.getCurrentItem())); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onEventMainThread(EBReuse reuse) { + if (MessageFragment.MESSAGE_READ_OVER.equals(reuse.getType())) { + if (mMessageHint != null) { + mMessageHint.setVisibility(View.GONE); + } + } + } + + private void getSearchHints() { + RetrofitManager.getApi().getSearchHints() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response>() { + @Override + public void onResponse(ArrayList response) { + if (response.size() != 0) { + mSearchHintLint = response; + + for (Fragment fragment : mFragmentsList) { + if (fragment instanceof SearchBarHint) { + ((SearchBarHint) fragment).setHint(mSearchHintLint); + } + } + } + } + }); + } + + private void checkMessageUnread(final Context context, boolean isCheck) { + TokenUtils.getToken(context, isCheck) + .flatMap(new Func1>() { + @Override + public Observable call(String token) { + return RetrofitManager.getMessage().getMessageUnread(token); + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { + @Override + public void onResponse(MessageUnreadEntity response) { + super.onResponse(response); + if (response != null && response.getKefuList() != null && response.getKefuList().size() > 0) { + KeFuMarkReadDao dao = new KeFuMarkReadDao(context); + for (int i = 0; i < response.getKefuList().size(); i++) { + if (dao.isMarkRead(response.getKefuList().get(i))) { + response.getKefuList().remove(i); + i--; + } + } + + if (response.getKefuList() != null && response.getKefuList().size() > 0) { + mMessageHint.setVisibility(View.VISIBLE); + } + + } + + if (response != null && response.getComment() > 0) { + mMessageHint.setVisibility(View.VISIBLE); + } + } + + @Override + public void onFailure(HttpException e) { + if (e != null && e.code() == 401) { + checkMessageUnread(getContext(), false); + } + } + }); + } + + private void checkMarkRead(Context context) { + MessageMarkReadDao readDao = new MessageMarkReadDao(context); + List readInfos = readDao.getAll(); + if (readInfos == null || readInfos.size() == 0) { + return; + } + + MessageMarkReadInfo readInfo = readInfos.get(0); + HashMap kefuIds = readInfo.getKefuIds(); + HashMap noticeIds = readInfo.getNoticeIds(); + + if (kefuIds != null && kefuIds.size() > 0) { + Utils.log("======提交已读客服消息"); + JSONArray array = new JSONArray(); + for (String s : kefuIds.keySet()) { + array.put(s); + } + Utils.log("======客服id::" + array.toString()); + RequestBody body = RequestBody.create(MediaType.parse("application/json"), array.toString()); + postMarkRead(context, "kefu", true, body, readDao); + } + + if (noticeIds != null && noticeIds.size() > 0) { + Utils.log("======提交已读公告消息"); + JSONArray array = new JSONArray(); + for (String s : noticeIds.keySet()) { + array.put(s); + } + Utils.log("======客服id::" + array.toString()); + RequestBody body = RequestBody.create(MediaType.parse("application/json"), array.toString()); + postMarkRead(context, "notice", true, body, readDao); + } + + } + + private void postMarkRead(final Context context, final String type, boolean isCkeck, final RequestBody body, + final MessageMarkReadDao readDao) { + TokenUtils.getToken(context, isCkeck) + .flatMap(new Func1>() { + @Override + public Observable call(String token) { + if ("kefu".equals(type)) { + return RetrofitManager.getMessage().postMarkKeFuRead(body, token); + } else { + return RetrofitManager.getMessage().postMarkNoticeRead(body, token); + } + } + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Response() { + @Override + public void onResponse(ResponseBody response) { + super.onResponse(response); + Utils.log("=========postMarkRead::" + type); + if ("kefu".equals(type)) { + readDao.cleanKeFu(); + } else { + readDao.cleanNotice(); + } + + } + + @Override + public void onFailure(HttpException e) { + super.onFailure(e); + if (e != null && e.code() == 401) { + postMarkRead(context, type, false, body, readDao); + } + } + }); + + } + +} diff --git a/app/src/main/java/com/gh/gamecenter/fragment/NewsFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/NewsFragment.java new file mode 100644 index 0000000000..636ff5a57d --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/fragment/NewsFragment.java @@ -0,0 +1,129 @@ +package com.gh.gamecenter.fragment; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.util.DisplayMetrics; +import android.view.View; +import android.widget.LinearLayout; + +import com.gh.base.fragment.BaseFragment_ViewPager_Checkable; +import com.gh.common.util.DataCollectionUtils; +import com.gh.common.util.DisplayUtils; +import com.gh.gamecenter.MainActivity; +import com.gh.gamecenter.R; +import com.gh.gamecenter.eventbus.EBUISwitch; +import com.gh.gamecenter.news.News1Fragment; +import com.gh.gamecenter.news.News2Fragment; +import com.gh.gamecenter.news.News3Fragment; +import com.gh.gamecenter.news.News4Fragment; + +import org.greenrobot.eventbus.EventBus; +import org.greenrobot.eventbus.Subscribe; +import org.greenrobot.eventbus.ThreadMode; + +import java.util.List; + +import butterknife.BindView; + +import static com.gh.gamecenter.news.NewsWrapperFragment.EB_NEWSFRAGMENT_TAG; + +/** + * @author CsHeng + * @Date 17/06/2017 + * @Time 10:30 AM + */ + +public class NewsFragment extends BaseFragment_ViewPager_Checkable { + + @BindView(R.id.slidebar_line) + View mNewsSlidebarLine; + private LinearLayout.LayoutParams mLayoutParams; + private int mWidth; + + @Override + protected int getLayoutId() { + return R.layout.fragment_news; + } + + @Override + protected int getCheckableGroupId() { + return R.id.lightgame_tab_container; + } + + @Override + protected int getViewPagerId() { + return R.id.lightgame_tab_viewpager; + } + + @Override + protected void initFragmentList(List fragments) { + fragments.add(new News1Fragment()); + fragments.add(new News2Fragment()); + fragments.add(new News3Fragment()); + fragments.add(new News4Fragment()); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + DisplayMetrics outMetrics = new DisplayMetrics(); + getActivity().getWindowManager().getDefaultDisplay().getMetrics(outMetrics); + mWidth = outMetrics.widthPixels / 4; + mLayoutParams = new LinearLayout.LayoutParams(mWidth / 2, DisplayUtils.dip2px(getActivity(), 2)); + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + + mLayoutParams.leftMargin = (int) (mWidth * (mCheckedIndex + 0.25f)); + mNewsSlidebarLine.setLayoutParams(mLayoutParams); + + view.postDelayed(new Runnable() { + @Override + public void run() { + EventBus.getDefault().post(new EBUISwitch(EB_NEWSFRAGMENT_TAG, mCheckedIndex)); + } + }, 100); + } + + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + super.onPageScrolled(position, positionOffset, positionOffsetPixels); + if (positionOffset != 0) { + mLayoutParams.leftMargin = (int) (mWidth * (position + positionOffset + 0.25f)); + mNewsSlidebarLine.setLayoutParams(mLayoutParams); +// } else { +// if (currentItem != mNewsVP.getCurrentItem()) { +// currentItem = mNewsVP.getCurrentItem(); +// EventBus.getDefault().post(new EBUISwitch(EB_NEWSFRAGMENT_TAG, currentItem)); +// } + } + } + + @Override + protected void onPageChanged(int index) { + super.onPageChanged(index); + if (index == 0) { + DataCollectionUtils.uploadPosition(getActivity(), "资讯", "1", "资讯"); + } else if (index == 1) { + DataCollectionUtils.uploadPosition(getActivity(), "资讯", "2", "攻略"); + } else if (index == 2) { + DataCollectionUtils.uploadPosition(getActivity(), "资讯", "3", "原创"); + } else if (index == 3) { + DataCollectionUtils.uploadPosition(getActivity(), "资讯", "4", "关注"); + } + } + + @Subscribe(threadMode = ThreadMode.MAIN) + public void onEventMainThread(EBUISwitch busNine) { + if (MainActivity.EB_MAINACTIVITY_TAG.equals(busNine.getFrom())) { + if (busNine.getPosition() == 1) { + EventBus.getDefault().post(new EBUISwitch(EB_NEWSFRAGMENT_TAG, mCheckedIndex)); + } + } + } + + +} diff --git a/app/src/main/java/com/gh/gamecenter/fragment/HomeFragment.java b/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java similarity index 64% rename from app/src/main/java/com/gh/gamecenter/fragment/HomeFragment.java rename to app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java index 5c9404e453..b27fe10d93 100644 --- a/app/src/main/java/com/gh/gamecenter/fragment/HomeFragment.java +++ b/app/src/main/java/com/gh/gamecenter/fragment/SearchToolbarFragment.java @@ -7,15 +7,13 @@ import android.view.View; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.ScaleAnimation; -import android.widget.LinearLayout; import android.widget.TextView; -import com.gh.base.BaseFragment; import com.gh.base.SearchBarHint; +import com.gh.base.fragment.BaseFragment; import com.gh.common.constant.Config; import com.gh.common.util.DataCollectionUtils; import com.gh.common.util.DataUtils; -import com.gh.common.util.DisplayUtils; import com.gh.common.util.EntranceUtils; import com.gh.download.DownloadManager; import com.gh.gamecenter.ConcernActivity; @@ -38,39 +36,35 @@ import butterknife.BindView; * Created by LGT on 2016/9/9. * 工具栏 搜索控制 */ -public abstract class HomeFragment extends BaseFragment implements View.OnClickListener, SearchBarHint { +public class SearchToolbarFragment extends BaseFragment implements View.OnClickListener, SearchBarHint { - private TextView downloadHint; - private TextView searchHint; + @BindView(R.id.action_tip) + TextView mDownloadHintTv; + + @BindView(R.id.actionbar_search_input) + TextView mSearchHintTv; + + @BindView(R.id.actionbar_rl_download) + View mDownloadView; private AlphaAnimation mAlphaAnimation; - private ArrayList hintList; - private int hintIndex; + private ArrayList mHintList; + private int mHintIndex; - @BindView(R.id.actionbar_rl_download) - View mActionBarDownloadView; + @Override + protected int getLayoutId() { + return R.layout.fragment_toolbar; + } @Override protected void initView(View view) { super.initView(view); -// SharedPreferences sp = getActivity().getSharedPreferences( -// Config.PREFERENCE, Context.MODE_PRIVATE); - LinearLayout home_actionbar = (LinearLayout) view.findViewById(R.id.home_actionbar); - LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, DisplayUtils.dip2px(getActivity(), 55)); - -// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { -// int top = DisplayUtils.getStatusBarHeight(getResources()); -// home_actionbar.setPadding(0, top, 0, 0); -// lparams.height += top; -// } - home_actionbar.setLayoutParams(lparams); initActionBar(view); - final ScaleAnimation scaleAnimation = new ScaleAnimation(0.4f, 1.0f, 0.4f, 1.0f - , Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); + final ScaleAnimation scaleAnimation = new ScaleAnimation(0.4f, 1.0f, 0.4f, 1.0f, + Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); scaleAnimation.setDuration(500); mAlphaAnimation = new AlphaAnimation(1f, 0.2f); @@ -86,7 +80,7 @@ public abstract class HomeFragment extends BaseFragment implements View.OnClickL @Override public void onAnimationEnd(Animation animation) { if (mAlphaAnimation != null) { - searchHint.setAnimation(mAlphaAnimation); + mSearchHintTv.setAnimation(mAlphaAnimation); mAlphaAnimation.start(); } } @@ -106,14 +100,14 @@ public abstract class HomeFragment extends BaseFragment implements View.OnClickL @Override public void onAnimationEnd(Animation animation) { // 切换数据 - if (hintIndex > hintList.size() - 1) { - hintIndex = 0; + if (mHintIndex > mHintList.size() - 1) { + mHintIndex = 0; } - searchHint.setHint(hintList.get(hintIndex)); - hintIndex++; + mSearchHintTv.setHint(mHintList.get(mHintIndex)); + mHintIndex++; if (scaleAnimation != null) { - searchHint.setAnimation(scaleAnimation); + mSearchHintTv.setAnimation(scaleAnimation); scaleAnimation.start(); } } @@ -124,12 +118,12 @@ public abstract class HomeFragment extends BaseFragment implements View.OnClickL } }); - if (hintList != null && hintList.size() > 0) { - if (hintList.size() > 1) { - searchHint.setAnimation(mAlphaAnimation); + if (mHintList != null && mHintList.size() > 0) { + if (mHintList.size() > 1) { + mSearchHintTv.setAnimation(mAlphaAnimation); } else { - String hint = hintList.get(0); - searchHint.setHint(hint); + String hint = mHintList.get(0); + mSearchHintTv.setHint(hint); } } @@ -140,49 +134,47 @@ public abstract class HomeFragment extends BaseFragment implements View.OnClickL super.onCreate(savedInstanceState); if (savedInstanceState != null) { - hintList = savedInstanceState.getStringArrayList("hint"); + mHintList = savedInstanceState.getStringArrayList("hint"); } - hintIndex = 0; + mHintIndex = 0; } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - if (hintList != null && !hintList.isEmpty()) { - outState.putStringArrayList("hint", hintList); + if (mHintList != null && !mHintList.isEmpty()) { + outState.putStringArrayList("hint", mHintList); } } private void initActionBar(View view) { - mActionBarDownloadView.setOnClickListener(this); + mDownloadView.setOnClickListener(this); view.findViewById(R.id.actionbar_iv_search).setOnClickListener(this); view.findViewById(R.id.actionbar_notification).setOnClickListener(this); view.findViewById(R.id.actionbar_search_rl).setOnClickListener(this); if (Config.isShow(getActivity())) { - mActionBarDownloadView.setVisibility(View.VISIBLE); + mDownloadView.setVisibility(View.VISIBLE); } else { - mActionBarDownloadView.setVisibility(View.GONE); + mDownloadView.setVisibility(View.GONE); } - downloadHint = (TextView) view.findViewById(R.id.action_tip); int updateSize = PackageManager.getUpdateListSize(); int downloadSize = DownloadManager.getInstance(getActivity()).getAll().size(); if (downloadSize != 0) { - downloadHint.setVisibility(View.VISIBLE); - downloadHint.setText(String.valueOf(downloadSize)); + mDownloadHintTv.setVisibility(View.VISIBLE); + mDownloadHintTv.setText(String.valueOf(downloadSize)); } else if (updateSize != 0) { - downloadHint.setVisibility(View.VISIBLE); - downloadHint.setText(String.valueOf(updateSize)); + mDownloadHintTv.setVisibility(View.VISIBLE); + mDownloadHintTv.setText(String.valueOf(updateSize)); } else { - downloadHint.setVisibility(View.GONE); + mDownloadHintTv.setVisibility(View.GONE); } - searchHint = (TextView) view.findViewById(R.id.actionbar_search_input); - searchHint.setOnClickListener(this); + mSearchHintTv.setOnClickListener(this); } @Override @@ -199,7 +191,7 @@ public abstract class HomeFragment extends BaseFragment implements View.OnClickL Intent intent = new Intent(getActivity(), SearchActivity.class); intent.putExtra("clicked", true); - intent.putExtra("hint", searchHint.getHint().toString()); + intent.putExtra("hint", mSearchHintTv.getHint().toString()); intent.putExtra(EntranceUtils.KEY_ENTRANCE, "(工具栏)"); startActivity(intent); } else if (id == R.id.actionbar_search_input || id == R.id.actionbar_search_rl) { @@ -208,7 +200,7 @@ public abstract class HomeFragment extends BaseFragment implements View.OnClickL Intent intent = new Intent(getActivity(), SearchActivity.class); intent.putExtra("clicked", false); - intent.putExtra("hint", searchHint.getHint().toString()); + intent.putExtra("hint", mSearchHintTv.getHint().toString()); intent.putExtra(EntranceUtils.KEY_ENTRANCE, "(工具栏)"); startActivity(intent); } else if (id == R.id.actionbar_notification) { @@ -226,9 +218,9 @@ public abstract class HomeFragment extends BaseFragment implements View.OnClickL public void onEventMainThread(EBReuse reuse) { if ("Refresh".equals(reuse.getType())) { if (Config.isShow(getActivity())) { - mActionBarDownloadView.setVisibility(View.VISIBLE); + mDownloadView.setVisibility(View.VISIBLE); } else { - mActionBarDownloadView.setVisibility(View.GONE); + mDownloadView.setVisibility(View.GONE); } } } @@ -238,24 +230,24 @@ public abstract class HomeFragment extends BaseFragment implements View.OnClickL int updateSize = PackageManager.getUpdateListSize(); int downloadSize = DownloadManager.getInstance(getActivity()).getAll().size(); if (downloadSize != 0) { - downloadHint.setVisibility(View.VISIBLE); - downloadHint.setText(String.valueOf(downloadSize)); + mDownloadHintTv.setVisibility(View.VISIBLE); + mDownloadHintTv.setText(String.valueOf(downloadSize)); } else if (updateSize != 0) { - downloadHint.setVisibility(View.VISIBLE); - downloadHint.setText(String.valueOf(updateSize)); + mDownloadHintTv.setVisibility(View.VISIBLE); + mDownloadHintTv.setText(String.valueOf(updateSize)); } else { - downloadHint.setVisibility(View.GONE); + mDownloadHintTv.setVisibility(View.GONE); } } @Override public void setHint(ArrayList hint) { if (hint != null && hint.size() > 0) { - hintList = hint; - if (hint.size() == 1 && searchHint != null) { - searchHint.setHint(hintList.get(0)); - } else if (mAlphaAnimation != null && searchHint != null) { - searchHint.setAnimation(mAlphaAnimation); + mHintList = hint; + if (hint.size() == 1 && mSearchHintTv != null) { + mSearchHintTv.setHint(mHintList.get(0)); + } else if (mAlphaAnimation != null && mSearchHintTv != null) { + mSearchHintTv.setAnimation(mAlphaAnimation); } } } diff --git a/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.java b/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.java index 3e2472a771..a01fa78a0c 100644 --- a/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.java +++ b/app/src/main/java/com/gh/gamecenter/game/GameFragmentAdapter.java @@ -11,18 +11,18 @@ import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.ViewHolder; import android.text.TextUtils; import android.util.DisplayMetrics; -import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; -import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.facebook.drawee.view.SimpleDraweeView; +import com.gh.base.OnRequestCallBackListener; +import com.gh.base.adapter.BaseRecyclerAdapter; import com.gh.common.constant.ItemViewType; import com.gh.common.util.ApkActiveUtils; import com.gh.common.util.DataCollectionUtils; @@ -46,7 +46,6 @@ import com.gh.gamecenter.PluginActivity; import com.gh.gamecenter.R; import com.gh.gamecenter.SubjectActivity; import com.gh.gamecenter.ToolBoxActivity; -import com.gh.base.adapter.BaseRecyclerAdapter; import com.gh.gamecenter.adapter.ImagePagerAdapter; import com.gh.gamecenter.adapter.viewholder.FooterViewHolder; import com.gh.gamecenter.adapter.viewholder.GameHeadViewHolder; @@ -62,7 +61,6 @@ import com.gh.gamecenter.entity.SlideEntity; import com.gh.gamecenter.entity.SubjectDigestEntity; import com.gh.gamecenter.entity.SubjectEntity; import com.gh.gamecenter.fragment.GameFragment; -import com.gh.base.OnRequestCallBackListener; import com.gh.gamecenter.manager.GameManager; import com.gh.gamecenter.manager.PackageManager; import com.gh.gamecenter.retrofit.Response; @@ -74,7 +72,6 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import cn.trinea.android.view.autoscrollviewpager.AutoScrollViewPager; import retrofit2.HttpException; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Func1; @@ -108,7 +105,6 @@ public class GameFragmentAdapter extends BaseRecyclerAdapter { private boolean mIsOver; private boolean mIsInitPlugin; private boolean mIsAutoScroll; - private int mTopHeight; public GameFragmentAdapter(GameFragment gameFragment, SwipeRefreshLayout refreshLayout) { super(gameFragment.getContext()); @@ -137,11 +133,6 @@ public class GameFragmentAdapter extends BaseRecyclerAdapter { mIsInitPlugin = false; mIsAutoScroll = false; - DisplayMetrics outMetrics = new DisplayMetrics(); - gameFragment.getActivity().getWindowManager().getDefaultDisplay().getMetrics(outMetrics); - - mTopHeight = (int) (outMetrics.widthPixels / 16f * 10.5f); - initSubjectDigest(true); } @@ -461,52 +452,20 @@ public class GameFragmentAdapter extends BaseRecyclerAdapter { @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == ItemViewType.GAME_SLIDE) { - View view = mLayoutInflater.inflate(R.layout.game_viewpager_item, parent, false); DisplayMetrics outMetrics = new DisplayMetrics(); mGameFragment.getActivity().getWindowManager().getDefaultDisplay().getMetrics(outMetrics); - LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, mTopHeight); //整个头部大小16:10 viewpager大小16:7 - view.setLayoutParams(params); - - AutoScrollViewPager viewPager = (AutoScrollViewPager) view.findViewById(R.id.view_pager); - RelativeLayout.LayoutParams vpParams = new RelativeLayout.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, (int) (outMetrics.widthPixels / 16f * 7f)); - viewPager.setLayoutParams(vpParams); - - RelativeLayout subjectRl = (RelativeLayout) view.findViewById(R.id.home_subject_rl); - RelativeLayout.LayoutParams subjectParams = new RelativeLayout.LayoutParams( - ViewGroup.LayoutParams.MATCH_PARENT, (int) (outMetrics.widthPixels / 16f * 3.5f)); - subjectParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); - subjectRl.setLayoutParams(subjectParams); - - LinearLayout hint = (LinearLayout) view.findViewById(R.id.viewpager_ll_hint); - RelativeLayout.LayoutParams hintParams = new RelativeLayout.LayoutParams( - ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); - hintParams.setMargins(0, (int) (outMetrics.widthPixels / 16f * 6.5f), DisplayUtils.dip2px(mContext, 10), 0); - hintParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); - hint.setLayoutParams(hintParams); - - return new GameViewPagerViewHolder(view); + return new GameViewPagerViewHolder(mLayoutInflater.inflate(R.layout.game_viewpager_item, parent, false), + outMetrics.widthPixels); } else if (viewType == ItemViewType.COLUMN_HEADER) { - View view = LayoutInflater.from(parent.getContext()).inflate( - R.layout.game_head_item, parent, false); - return new GameHeadViewHolder(view); + return new GameHeadViewHolder(mLayoutInflater.inflate(R.layout.game_head_item, parent, false)); } else if (viewType == ItemViewType.GAME_NORMAL) { - View view = LayoutInflater.from(parent.getContext()).inflate( - R.layout.game_normal_item, parent, false); - return new GameNormalViewHolder(view); + return new GameNormalViewHolder(mLayoutInflater.inflate(R.layout.game_normal_item, parent, false)); } else if (viewType == ItemViewType.GAME_TEST) { - View view = LayoutInflater.from(parent.getContext()).inflate( - R.layout.game_test_item, parent, false); - return new GameTestViewHolder(view); + return new GameTestViewHolder(mLayoutInflater.inflate(R.layout.game_test_item, parent, false)); } else if (viewType == ItemViewType.GAME_IMAGE) { - View view = LayoutInflater.from(parent.getContext()).inflate( - R.layout.game_image_item, parent, false); - return new GameImageViewHolder(view); + return new GameImageViewHolder(mLayoutInflater.inflate(R.layout.game_image_item, parent, false)); } else if (viewType == ItemViewType.LOADING) { - View view = LayoutInflater.from(parent.getContext()).inflate( - R.layout.refresh_footerview, parent, false); - return new FooterViewHolder(view); + return new FooterViewHolder(mLayoutInflater.inflate(R.layout.refresh_footerview, parent, false)); } return null; } @@ -604,18 +563,18 @@ public class GameFragmentAdapter extends BaseRecyclerAdapter { if (mSlideList.size() != 0 && viewHolder.viewPager.getAdapter() == null) { viewHolder.viewpager_ll_hint.removeAllViews(); + int margin = DisplayUtils.dip2px(mContext, 6); for (int i = 0, size = mSlideList.size(); i < size; i++) { ImageView imageView = new ImageView(mContext); - LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams( - DisplayUtils.dip2px(mContext, 6), DisplayUtils.dip2px(mContext, 6)); - lparams.bottomMargin = DisplayUtils.dip2px(mContext, 6); + LinearLayout.LayoutParams lparams = new LinearLayout.LayoutParams(margin, margin); +// lparams.bottomMargin = DisplayUtils.dip2px(mContext, 6); if (i == 0) { imageView.setImageResource(R.drawable.oval_hint_up); } else { imageView.setImageResource(R.drawable.oval_hint_dn); } if (i != 0) { - lparams.leftMargin = DisplayUtils.dip2px(mContext, 6); + lparams.leftMargin = margin; } imageView.setLayoutParams(lparams); viewHolder.viewpager_ll_hint.addView(imageView); diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/FuliFragment.java b/app/src/main/java/com/gh/gamecenter/gamedetail/FuliFragment.java index e40be171e5..0729d73060 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/FuliFragment.java +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/FuliFragment.java @@ -5,7 +5,7 @@ import android.support.annotation.Nullable; import android.support.v7.widget.RecyclerView; import android.view.View; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment; import com.gh.common.view.MeasureLinearLayoutManager; import com.gh.common.view.VerticalItemDecoration; import com.gh.gamecenter.GameDetailActivity; diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/XinXiFragment.java b/app/src/main/java/com/gh/gamecenter/gamedetail/XinXiFragment.java index b3a76e3c4b..b84e1eed6e 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/XinXiFragment.java +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/XinXiFragment.java @@ -5,7 +5,7 @@ import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment; import com.gh.common.util.DownloadItemUtils; import com.gh.download.DataWatcher; import com.gh.download.DownloadEntity; diff --git a/app/src/main/java/com/gh/gamecenter/libao/Libao1Fragment.java b/app/src/main/java/com/gh/gamecenter/libao/Libao1Fragment.java index 2339f6d070..d840ff36ee 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/Libao1Fragment.java +++ b/app/src/main/java/com/gh/gamecenter/libao/Libao1Fragment.java @@ -11,7 +11,7 @@ import android.widget.LinearLayout; import android.widget.TextView; import com.gc.materialdesign.views.ProgressBarCircularIndeterminate; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment; import com.gh.common.util.EntranceUtils; import com.gh.common.view.SwipeLayout; import com.gh.common.view.VerticalItemDecoration; diff --git a/app/src/main/java/com/gh/gamecenter/libao/Libao2Fragment.java b/app/src/main/java/com/gh/gamecenter/libao/Libao2Fragment.java index 232b53ee31..50a9fe81f0 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/Libao2Fragment.java +++ b/app/src/main/java/com/gh/gamecenter/libao/Libao2Fragment.java @@ -10,7 +10,7 @@ import android.view.View; import android.widget.LinearLayout; import com.gc.materialdesign.views.ProgressBarCircularIndeterminate; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment; import com.gh.common.view.VerticalItemDecoration; import com.gh.gamecenter.LibaoActivity; import com.gh.gamecenter.R; diff --git a/app/src/main/java/com/gh/gamecenter/libao/Libao3Fragment.java b/app/src/main/java/com/gh/gamecenter/libao/Libao3Fragment.java index cf1e8802a4..71af321214 100644 --- a/app/src/main/java/com/gh/gamecenter/libao/Libao3Fragment.java +++ b/app/src/main/java/com/gh/gamecenter/libao/Libao3Fragment.java @@ -9,7 +9,7 @@ import android.view.View; import android.widget.LinearLayout; import com.gc.materialdesign.views.ProgressBarCircularIndeterminate; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment; import com.gh.common.view.VerticalItemDecoration; import com.gh.gamecenter.R; import com.gh.gamecenter.eventbus.EBReuse; diff --git a/app/src/main/java/com/gh/gamecenter/message/CommentFragment.java b/app/src/main/java/com/gh/gamecenter/message/CommentFragment.java index eeb1191701..2808189945 100644 --- a/app/src/main/java/com/gh/gamecenter/message/CommentFragment.java +++ b/app/src/main/java/com/gh/gamecenter/message/CommentFragment.java @@ -11,7 +11,7 @@ import android.widget.LinearLayout; import android.widget.TextView; import com.gc.materialdesign.views.ProgressBarCircularIndeterminate; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment; import com.gh.common.view.VerticalItemDecoration; import com.gh.gamecenter.R; import com.gh.gamecenter.eventbus.EBUISwitch; diff --git a/app/src/main/java/com/gh/gamecenter/message/KeFuFragment.java b/app/src/main/java/com/gh/gamecenter/message/KeFuFragment.java index c83fbfdfc2..5d326a1584 100644 --- a/app/src/main/java/com/gh/gamecenter/message/KeFuFragment.java +++ b/app/src/main/java/com/gh/gamecenter/message/KeFuFragment.java @@ -10,7 +10,7 @@ import android.widget.LinearLayout; import android.widget.TextView; import com.gc.materialdesign.views.ProgressBarCircularIndeterminate; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment; import com.gh.common.view.VerticalItemDecoration; import com.gh.gamecenter.R; import com.gh.gamecenter.eventbus.EBUISwitch; diff --git a/app/src/main/java/com/gh/gamecenter/message/MessageFragment.java b/app/src/main/java/com/gh/gamecenter/message/MessageFragment.java index 5ff6c3a6bc..9c3e4f25ad 100644 --- a/app/src/main/java/com/gh/gamecenter/message/MessageFragment.java +++ b/app/src/main/java/com/gh/gamecenter/message/MessageFragment.java @@ -1,21 +1,19 @@ package com.gh.gamecenter.message; import android.content.Context; +import android.os.Bundle; +import android.support.annotation.Nullable; import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentTransaction; -import android.support.v4.view.ViewPager; import android.util.DisplayMetrics; import android.view.View; import android.widget.LinearLayout; -import android.widget.RelativeLayout; import android.widget.TextView; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment_ViewPager_Checkable; import com.gh.common.util.DisplayUtils; import com.gh.common.util.TokenUtils; import com.gh.common.util.Utils; import com.gh.gamecenter.R; -import com.gh.base.adapter.FragmentAdapter; import com.gh.gamecenter.db.KeFuMarkReadDao; import com.gh.gamecenter.entity.MessageUnreadEntity; import com.gh.gamecenter.eventbus.EBReuse; @@ -27,11 +25,9 @@ import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; -import java.util.ArrayList; import java.util.List; import butterknife.BindView; -import butterknife.OnClick; import okhttp3.ResponseBody; import retrofit2.HttpException; import rx.Observable; @@ -43,28 +39,22 @@ import rx.schedulers.Schedulers; * Created by khy on 2017/4/5. * 首页-消息 */ -public class MessageFragment extends BaseFragment implements ViewPager.OnPageChangeListener { +public class MessageFragment extends BaseFragment_ViewPager_Checkable { public static final String MESSAGE_READ_OVER = "messageReadOver"; public static final String EB_MESSAGEFRAGMENT_TAG = "MessageFragment"; - @BindView(R.id.message_comment_tv) - TextView mMessageCommentTv; + @BindView(R.id.message_comment_hint) TextView mMessageCommentHint; - @BindView(R.id.message_comment_ll) - LinearLayout mMessageCommentLl; - @BindView(R.id.message_kefu_tv) - TextView mMessageKefuTv; + @BindView(R.id.message_kefu_hint) View mMessageKefuHint; - @BindView(R.id.message_kefu_rl) - RelativeLayout mMessageKefuRl; + @BindView(R.id.message_slide_line) View mMessageSlideLine; - @BindView(R.id.meaasge_viewPager) - ViewPager mMeaasgeViewPager; - private LinearLayout.LayoutParams lparams; - private int width; + + private LinearLayout.LayoutParams mLayoutParams; + private int mWidth; private int mKeFuUnreadCount; @Override @@ -72,45 +62,49 @@ public class MessageFragment extends BaseFragment implements ViewPager.OnPageCha return R.layout.fragment_message; } + @Override + protected int getCheckableGroupId() { + return R.id.lightgame_tab_container; + } + + @Override + protected int getViewPagerId() { + return R.id.lightgame_tab_viewpager; + } + + @Override + protected void initFragmentList(List fragments) { + fragments.add(new CommentFragment()); + fragments.add(new KeFuFragment()); + } + @Override protected void initView(View view) { super.initView(view); - LinearLayout title = (LinearLayout) view.findViewById(R.id.actionbar_title_ll); - LinearLayout.LayoutParams tparams = new LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, DisplayUtils.dip2px(getActivity(), 55)); - - title.setLayoutParams(tparams); - DisplayMetrics outMetrics = new DisplayMetrics(); getActivity().getWindowManager().getDefaultDisplay().getMetrics(outMetrics); - width = outMetrics.widthPixels / 2; - lparams = new LinearLayout.LayoutParams((int) (width * 0.6), - DisplayUtils.dip2px(getContext(), 2)); - lparams.leftMargin = (int) (width * (0 + 0.2f)); - mMessageSlideLine.setLayoutParams(lparams); + mWidth = outMetrics.widthPixels / 2; + mLayoutParams = new LinearLayout.LayoutParams((int) (mWidth * 0.6), DisplayUtils.dip2px(getContext(), 2)); + mLayoutParams.leftMargin = (int) (mWidth * (0 + 0.2f)); + mMessageSlideLine.setLayoutParams(mLayoutParams); - mMessageCommentTv.setSelected(true); + initMessageUnread(getContext(), true); - List list = new ArrayList<>(); - list.add(new CommentFragment()); - list.add(new KeFuFragment()); - mMeaasgeViewPager.setAdapter(new FragmentAdapter(getChildFragmentManager(), list)); - mMeaasgeViewPager.addOnPageChangeListener(this); - mMeaasgeViewPager.setCurrentItem(0); + } - initMessageUnread(true); + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); view.postDelayed(new Runnable() { @Override public void run() { - EventBus.getDefault().post(new EBUISwitch(EB_MESSAGEFRAGMENT_TAG, mMeaasgeViewPager.getCurrentItem())); + EventBus.getDefault().post(new EBUISwitch(EB_MESSAGEFRAGMENT_TAG, mCheckedIndex)); } }, 100); } - private void initMessageUnread(boolean isCheck) { - Context context = getContext(); - if (context == null) return; + private void initMessageUnread(final Context context, boolean isCheck) { TokenUtils.getToken(context, isCheck) .flatMap(new Func1>() { @Override @@ -130,7 +124,7 @@ public class MessageFragment extends BaseFragment implements ViewPager.OnPageCha } if (response.getKefuList() != null && response.getKefuList().size() > 0) { - KeFuMarkReadDao dao = new KeFuMarkReadDao(getContext()); + KeFuMarkReadDao dao = new KeFuMarkReadDao(context); for (int i = 0; i < response.getKefuList().size(); i++) { if (dao.isMarkRead(response.getKefuList().get(i))) { response.getKefuList().remove(i); @@ -148,7 +142,7 @@ public class MessageFragment extends BaseFragment implements ViewPager.OnPageCha @Override public void onFailure(HttpException e) { if (e != null && e.code() == 401) { - initMessageUnread(false); + initMessageUnread(context, false); } } }); @@ -157,27 +151,23 @@ public class MessageFragment extends BaseFragment implements ViewPager.OnPageCha // 隐藏未读提示 @Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(EBUISwitch reuse) { - if ("kefuMarkReadCount".equals(reuse.getFrom()) - && reuse.getPosition() == mKeFuUnreadCount) { + if ("kefuMarkReadCount".equals(reuse.getFrom()) && reuse.getPosition() == mKeFuUnreadCount) { mMessageKefuHint.setVisibility(View.GONE); - if (mMessageKefuHint.getVisibility() == View.GONE - && mMessageCommentHint.getVisibility() == View.GONE) { + if (mMessageKefuHint.getVisibility() == View.GONE && mMessageCommentHint.getVisibility() == View.GONE) { EventBus.getDefault().post(new EBReuse(MESSAGE_READ_OVER)); } - } else if ("commentMarkRead".equals(reuse.getFrom()) - && mMessageCommentHint.getVisibility() == View.VISIBLE) { + } else if ("commentMarkRead".equals(reuse.getFrom()) && mMessageCommentHint.getVisibility() == View.VISIBLE) { mMessageCommentHint.setVisibility(View.GONE); - postMarkCommentRead(true); - if (mMessageKefuHint.getVisibility() == View.GONE - && mMessageCommentHint.getVisibility() == View.GONE) { + postMarkCommentRead(getContext(), true); + if (mMessageKefuHint.getVisibility() == View.GONE && mMessageCommentHint.getVisibility() == View.GONE) { EventBus.getDefault().post(new EBReuse(MESSAGE_READ_OVER)); } } } - private void postMarkCommentRead(boolean isCheck) { + private void postMarkCommentRead(final Context context, boolean isCheck) { TokenUtils - .getToken(getContext(), isCheck) + .getToken(context, isCheck) .flatMap(new Func1>() { @Override public Observable call(String token) { @@ -197,67 +187,25 @@ public class MessageFragment extends BaseFragment implements ViewPager.OnPageCha public void onFailure(HttpException e) { super.onFailure(e); if (e != null && e.code() == 401) { - postMarkCommentRead(false); + postMarkCommentRead(context, false); } } }); } - - @OnClick({R.id.message_comment_ll, R.id.message_kefu_rl}) - public void onViewClicked(View view) { - switch (view.getId()) { - case R.id.message_comment_ll: - mMeaasgeViewPager.setCurrentItem(0); - break; - case R.id.message_kefu_rl: - mMeaasgeViewPager.setCurrentItem(1); - break; - } - } - @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + super.onPageScrolled(position, positionOffset, positionOffsetPixels); if (positionOffset != 0) { - lparams.leftMargin = (int) (width * (position + positionOffset + 0.2f)); - mMessageSlideLine.setLayoutParams(lparams); + mLayoutParams.leftMargin = (int) (mWidth * (position + positionOffset + 0.2f)); + mMessageSlideLine.setLayoutParams(mLayoutParams); } } @Override - public void onPageSelected(int position) { - if (position == 0) { - EventBus.getDefault().post(new EBUISwitch(EB_MESSAGEFRAGMENT_TAG, 0)); - mMessageCommentTv.setSelected(true); - mMessageKefuTv.setSelected(false); - } else if (position == 1) { - EventBus.getDefault().post(new EBUISwitch(EB_MESSAGEFRAGMENT_TAG, 1)); - mMessageCommentTv.setSelected(false); - mMessageKefuTv.setSelected(true); - } + protected void onPageChanged(int index) { + super.onPageChanged(index); + EventBus.getDefault().post(new EBUISwitch(EB_MESSAGEFRAGMENT_TAG, index)); } - @Override - public void onPageScrollStateChanged(int state) { - - } - - @Override - public void onHiddenChanged(boolean hidden) { - super.onHiddenChanged(hidden); - FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); - List list = getChildFragmentManager().getFragments(); - if (list != null) { - if (hidden) { - for (Fragment fragment : getChildFragmentManager().getFragments()) { - transaction.hide(fragment); - } - } else { - for (Fragment fragment : getChildFragmentManager().getFragments()) { - transaction.show(fragment); - } - } - } - transaction.commit(); - } } diff --git a/app/src/main/java/com/gh/gamecenter/message/NoticeFragment.java b/app/src/main/java/com/gh/gamecenter/message/NoticeFragment.java index dc633ea79a..0737b98149 100644 --- a/app/src/main/java/com/gh/gamecenter/message/NoticeFragment.java +++ b/app/src/main/java/com/gh/gamecenter/message/NoticeFragment.java @@ -10,7 +10,7 @@ import android.widget.LinearLayout; import android.widget.TextView; import com.gc.materialdesign.views.ProgressBarCircularIndeterminate; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment; import com.gh.common.view.VerticalItemDecoration; import com.gh.gamecenter.R; import com.gh.gamecenter.eventbus.EBUISwitch; diff --git a/app/src/main/java/com/gh/gamecenter/news/News1Fragment.java b/app/src/main/java/com/gh/gamecenter/news/News1Fragment.java index c11d07cec7..99d49b8249 100644 --- a/app/src/main/java/com/gh/gamecenter/news/News1Fragment.java +++ b/app/src/main/java/com/gh/gamecenter/news/News1Fragment.java @@ -9,7 +9,7 @@ import android.view.View; import android.widget.LinearLayout; import com.gc.materialdesign.views.ProgressBarCircularIndeterminate; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment; import com.gh.common.view.VerticalItemDecoration; import com.gh.gamecenter.R; import com.gh.gamecenter.eventbus.EBNetworkState; @@ -119,7 +119,7 @@ public class News1Fragment extends BaseFragment implements SwipeRefreshLayout.On // 资讯Fragment界面切换事件 @Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(EBUISwitch busNine) { - if (NewsFragment.EB_NEWSFRAGMENT_TAG.equals(busNine.getFrom())) { + if (NewsWrapperFragment.EB_NEWSFRAGMENT_TAG.equals(busNine.getFrom())) { if (busNine.getPosition() == 0) { if (loadingLayout.getVisibility() == View.VISIBLE) { adapter.addList(0); diff --git a/app/src/main/java/com/gh/gamecenter/news/News2Fragment.java b/app/src/main/java/com/gh/gamecenter/news/News2Fragment.java index c86766ab03..0c1dc9f714 100644 --- a/app/src/main/java/com/gh/gamecenter/news/News2Fragment.java +++ b/app/src/main/java/com/gh/gamecenter/news/News2Fragment.java @@ -16,7 +16,7 @@ import android.widget.TextView; import com.facebook.drawee.view.SimpleDraweeView; import com.gc.materialdesign.views.ProgressBarCircularIndeterminate; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment; import com.gh.common.util.ApkActiveUtils; import com.gh.common.util.ImageUtils; import com.gh.common.util.PackageUtils; @@ -436,7 +436,7 @@ public class News2Fragment extends BaseFragment implements SwipeRefreshLayout.On // Fragment界面切换事件 @Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(EBUISwitch swith) { - if (NewsFragment.EB_NEWSFRAGMENT_TAG.equals(swith.getFrom())) { + if (NewsWrapperFragment.EB_NEWSFRAGMENT_TAG.equals(swith.getFrom())) { if (swith.getPosition() == 1) { if (loadingLayout.getVisibility() == View.VISIBLE) { adapter.addList(0); diff --git a/app/src/main/java/com/gh/gamecenter/news/News3Fragment.java b/app/src/main/java/com/gh/gamecenter/news/News3Fragment.java index f6cc71edd1..fe33d9f7b4 100644 --- a/app/src/main/java/com/gh/gamecenter/news/News3Fragment.java +++ b/app/src/main/java/com/gh/gamecenter/news/News3Fragment.java @@ -13,7 +13,7 @@ import android.widget.RelativeLayout; import android.widget.TextView; import com.gc.materialdesign.views.ProgressBarCircularIndeterminate; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment; import com.gh.common.util.DisplayUtils; import com.gh.common.util.EntranceUtils; import com.gh.gamecenter.ConcernActivity; @@ -220,7 +220,7 @@ public class News3Fragment extends BaseFragment implements SwipeRefreshLayout.On // 资讯Fragment界面切换事件 @Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(EBUISwitch busNine) { - if (NewsFragment.EB_NEWSFRAGMENT_TAG.equals(busNine.getFrom())) { + if (NewsWrapperFragment.EB_NEWSFRAGMENT_TAG.equals(busNine.getFrom())) { if (busNine.getPosition() == 2 && mLoading.getVisibility() == View.VISIBLE) { mStrategyAdapter.addList(0); } diff --git a/app/src/main/java/com/gh/gamecenter/news/News4Fragment.java b/app/src/main/java/com/gh/gamecenter/news/News4Fragment.java index fa8a828059..37e95a3645 100644 --- a/app/src/main/java/com/gh/gamecenter/news/News4Fragment.java +++ b/app/src/main/java/com/gh/gamecenter/news/News4Fragment.java @@ -9,7 +9,7 @@ import android.view.View; import android.widget.LinearLayout; import com.gc.materialdesign.views.ProgressBarCircularIndeterminate; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment; import com.gh.common.view.VerticalItemDecoration; import com.gh.gamecenter.R; import com.gh.gamecenter.eventbus.EBNetworkState; @@ -119,7 +119,7 @@ public class News4Fragment extends BaseFragment implements SwipeRefreshLayout.On // 资讯Fragment界面切换事件 @Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(EBUISwitch busNine) { - if (NewsFragment.EB_NEWSFRAGMENT_TAG.equals(busNine.getFrom())) { + if (NewsWrapperFragment.EB_NEWSFRAGMENT_TAG.equals(busNine.getFrom())) { if (busNine.getPosition() == 3) { if (loadingLayout.getVisibility() == View.VISIBLE) { adapter.addList(0); diff --git a/app/src/main/java/com/gh/gamecenter/news/NewsFragment.java b/app/src/main/java/com/gh/gamecenter/news/NewsFragment.java deleted file mode 100644 index 80d5c41aea..0000000000 --- a/app/src/main/java/com/gh/gamecenter/news/NewsFragment.java +++ /dev/null @@ -1,212 +0,0 @@ -package com.gh.gamecenter.news; - -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentTransaction; -import android.support.v4.view.ViewPager; -import android.util.DisplayMetrics; -import android.view.View; -import android.widget.LinearLayout; -import android.widget.TextView; - -import com.gh.common.util.DataCollectionUtils; -import com.gh.common.util.DisplayUtils; -import com.gh.gamecenter.MainActivity; -import com.gh.gamecenter.R; -import com.gh.base.adapter.FragmentAdapter; -import com.gh.gamecenter.eventbus.EBUISwitch; -import com.gh.gamecenter.fragment.HomeFragment; - -import org.greenrobot.eventbus.EventBus; -import org.greenrobot.eventbus.Subscribe; -import org.greenrobot.eventbus.ThreadMode; - -import java.util.ArrayList; -import java.util.List; - -import butterknife.BindView; -import butterknife.OnClick; - - -/** - * Created by khy on 2016/6/29. - * 资讯Fragment - */ -public class NewsFragment extends HomeFragment implements View.OnClickListener, ViewPager.OnPageChangeListener { - - public final static String EB_NEWSFRAGMENT_TAG = "NewsFragment"; - private View mNewsSlidebarLine; - private ViewPager mNewsVP; - private LinearLayout.LayoutParams lparams; - - @BindView(R.id.news_zixun_tv) - TextView mNewsZixun; - - @BindView(R.id.news_guanzhu_tv) - TextView mNewsGuanzhu; - - @BindView(R.id.news_gonglve_tv) - TextView mNewsGonglve; - - @BindView(R.id.news_yuanchuang_tv) - TextView mNewsYuanchuang; - - private int width; - private int currentItem; - - @Override - protected int getLayoutId() { - return R.layout.fragment_news; - } - - @Override - protected void initView(View view) { - super.initView(view); - mNewsSlidebarLine = view.findViewById(R.id.slidebar_line); - mNewsVP = (ViewPager) view.findViewById(R.id.page_vp_content); - mNewsZixun.setSelected(true); - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - List list = new ArrayList<>(); - list.add(new News1Fragment()); - list.add(new News2Fragment()); - list.add(new News3Fragment()); - list.add(new News4Fragment()); - mNewsVP.setAdapter(new FragmentAdapter(getChildFragmentManager(), list)); - mNewsVP.addOnPageChangeListener(this); - - currentItem = 0; - if (savedInstanceState != null) { - currentItem = savedInstanceState.getInt("currentItem"); - } - - mNewsVP.setCurrentItem(currentItem); - - DisplayMetrics outMetrics = new DisplayMetrics(); - getActivity().getWindowManager().getDefaultDisplay().getMetrics(outMetrics); - width = outMetrics.widthPixels / 4; - lparams = new LinearLayout.LayoutParams(width / 2, - DisplayUtils.dip2px(getActivity(), 2)); - lparams.leftMargin = (int) (width * (currentItem + 0.25f)); - mNewsSlidebarLine.setLayoutParams(lparams); - - view.postDelayed(new Runnable() { - @Override - public void run() { - EventBus.getDefault().post(new EBUISwitch(EB_NEWSFRAGMENT_TAG, mNewsVP.getCurrentItem())); - } - }, 100); - } - - @Override - public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putInt("currentItem", currentItem); - } - - @OnClick({R.id.news_zixun_tv, R.id.news_guanzhu_tv, R.id.news_yuanchuang_tv, R.id.news_gonglve_tv}) - @Override - public void onClick(View v) { -// super.onClick(v); - switch (v.getId()) { - case R.id.news_zixun_tv: - mNewsVP.setCurrentItem(0); - break; - case R.id.news_guanzhu_tv: - mNewsVP.setCurrentItem(1); - break; - case R.id.news_gonglve_tv: - mNewsVP.setCurrentItem(2); - break; - case R.id.news_yuanchuang_tv: - mNewsVP.setCurrentItem(3); - break; - } - } - - @Override - public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { - if (positionOffset != 0) { - lparams.leftMargin = (int) (width * (position + positionOffset + 0.25f)); - mNewsSlidebarLine.setLayoutParams(lparams); - } else { - if (currentItem != mNewsVP.getCurrentItem()) { - currentItem = mNewsVP.getCurrentItem(); - EventBus.getDefault().post(new EBUISwitch(EB_NEWSFRAGMENT_TAG, currentItem)); - } - } - } - - @Override - public void onPageSelected(int position) { - if (position == 0) { - mNewsZixun.setSelected(true); - mNewsGuanzhu.setSelected(false); - mNewsGonglve.setSelected(false); - mNewsYuanchuang.setSelected(false); - - DataCollectionUtils.uploadPosition(getActivity(), "资讯", "1", "资讯"); - } else if (position == 1) { - mNewsZixun.setSelected(false); - mNewsGuanzhu.setSelected(true); - mNewsGonglve.setSelected(false); - mNewsYuanchuang.setSelected(false); - - DataCollectionUtils.uploadPosition(getActivity(), "资讯", "2", "攻略"); - } else if (position == 2) { - mNewsZixun.setSelected(false); - mNewsGuanzhu.setSelected(false); - mNewsGonglve.setSelected(true); - mNewsYuanchuang.setSelected(false); - - DataCollectionUtils.uploadPosition(getActivity(), "资讯", "3", "原创"); - } else if (position == 3) { - mNewsZixun.setSelected(false); - mNewsGuanzhu.setSelected(false); - mNewsGonglve.setSelected(false); - mNewsYuanchuang.setSelected(true); - - DataCollectionUtils.uploadPosition(getActivity(), "资讯", "4", "关注"); - } - } - - @Override - public void onPageScrollStateChanged(int i) { - - } - - @Subscribe(threadMode = ThreadMode.MAIN) - public void onEventMainThread(EBUISwitch busNine) { - if (MainActivity.EB_MAINACTIVITY_TAG.equals(busNine.getFrom())) { - if (busNine.getPosition() == 1) { - EventBus.getDefault().post(new EBUISwitch(EB_NEWSFRAGMENT_TAG, mNewsVP.getCurrentItem())); - } - } - } - - @Override - public void onHiddenChanged(boolean hidden) { - super.onHiddenChanged(hidden); - FragmentTransaction transaction = getChildFragmentManager().beginTransaction(); - List list = getChildFragmentManager().getFragments(); - if (list != null) { - if (hidden) { - for (Fragment fragment : getChildFragmentManager().getFragments()) { - transaction.hide(fragment); - } - } else { - for (Fragment fragment : getChildFragmentManager().getFragments()) { - transaction.show(fragment); - } - } - } - transaction.commit(); - } - -} - diff --git a/app/src/main/java/com/gh/gamecenter/news/NewsWrapperFragment.java b/app/src/main/java/com/gh/gamecenter/news/NewsWrapperFragment.java new file mode 100644 index 0000000000..4466d0956d --- /dev/null +++ b/app/src/main/java/com/gh/gamecenter/news/NewsWrapperFragment.java @@ -0,0 +1,53 @@ +package com.gh.gamecenter.news; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.View; + +import com.gh.base.SearchBarHint; +import com.gh.base.fragment.BaseFragment; +import com.gh.gamecenter.R; +import com.gh.gamecenter.fragment.NewsFragment; +import com.gh.gamecenter.fragment.SearchToolbarFragment; + +import java.util.ArrayList; + + +/** + * Created by khy on 2016/6/29. + * 资讯Fragment + */ +public class NewsWrapperFragment extends BaseFragment implements SearchBarHint { + + public final static String EB_NEWSFRAGMENT_TAG = "NewsWrapperFragment"; + + private SearchToolbarFragment mSearchToolbarFragment; + + @Override + public void onCreate(@Nullable Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mSearchToolbarFragment = new SearchToolbarFragment(); + } + + @Override + protected int getLayoutId() { + return R.layout.fragment_wrapper_toolbar; + } + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + getChildFragmentManager().beginTransaction() + .replace(R.id.wrapper_toolbar, mSearchToolbarFragment) + .replace(R.id.wrapper_main_content, new NewsFragment()).commitAllowingStateLoss(); + } + + @Override + public void setHint(ArrayList hintList) { + if (mSearchToolbarFragment != null) { + mSearchToolbarFragment.setHint(hintList); + } + } + +} + diff --git a/app/src/main/java/com/gh/gamecenter/personal/ConcernFragment.java b/app/src/main/java/com/gh/gamecenter/personal/ConcernFragment.java index ecd779a9cc..312ed76d2a 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/ConcernFragment.java +++ b/app/src/main/java/com/gh/gamecenter/personal/ConcernFragment.java @@ -8,7 +8,7 @@ import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment; import com.gh.common.util.DownloadItemUtils; import com.gh.common.view.VerticalItemDecoration; import com.gh.download.DataWatcher; diff --git a/app/src/main/java/com/gh/gamecenter/personal/InstallFragment.java b/app/src/main/java/com/gh/gamecenter/personal/InstallFragment.java index e24e881765..6c2b577dcb 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/InstallFragment.java +++ b/app/src/main/java/com/gh/gamecenter/personal/InstallFragment.java @@ -10,7 +10,7 @@ import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment; import com.gh.common.util.DialogUtils; import com.gh.common.util.DownloadItemUtils; import com.gh.common.view.SwipeLayout; diff --git a/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java b/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java index 375af455dd..a4930ee705 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java +++ b/app/src/main/java/com/gh/gamecenter/personal/PersonalFragment.java @@ -26,7 +26,7 @@ import android.widget.TextView; import android.widget.Toast; import com.facebook.drawee.view.SimpleDraweeView; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment; import com.gh.common.constant.Config; import com.gh.common.util.DataCollectionUtils; import com.gh.common.util.DataUtils; diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchGameDetailFragment.java b/app/src/main/java/com/gh/gamecenter/search/SearchGameDetailFragment.java index e79cc8a236..be6191004f 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchGameDetailFragment.java +++ b/app/src/main/java/com/gh/gamecenter/search/SearchGameDetailFragment.java @@ -13,7 +13,7 @@ import android.view.ViewTreeObserver; import android.widget.LinearLayout; import android.widget.TextView; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment; import com.gh.common.util.DisplayUtils; import com.gh.common.util.DownloadItemUtils; import com.gh.common.view.VerticalItemDecoration; diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchGameListFragment.java b/app/src/main/java/com/gh/gamecenter/search/SearchGameListFragment.java index f9f1de6d34..69224520ff 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchGameListFragment.java +++ b/app/src/main/java/com/gh/gamecenter/search/SearchGameListFragment.java @@ -13,7 +13,7 @@ import android.view.ViewTreeObserver; import android.widget.LinearLayout; import android.widget.TextView; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment; import com.gh.common.util.DisplayUtils; import com.gh.common.util.DownloadItemUtils; import com.gh.common.view.VerticalItemDecoration; diff --git a/app/src/main/java/com/gh/gamecenter/search/SearchHistoryFragment.java b/app/src/main/java/com/gh/gamecenter/search/SearchHistoryFragment.java index 70cdc97b81..90ec0114a0 100644 --- a/app/src/main/java/com/gh/gamecenter/search/SearchHistoryFragment.java +++ b/app/src/main/java/com/gh/gamecenter/search/SearchHistoryFragment.java @@ -9,7 +9,7 @@ import android.view.ViewGroup; import android.widget.RelativeLayout; import android.widget.TextView; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment; import com.gh.common.util.DialogUtils; import com.gh.common.util.DisplayUtils; import com.gh.gamecenter.R; diff --git a/app/src/main/java/com/gh/gamecenter/subject/SubjectFragment.java b/app/src/main/java/com/gh/gamecenter/subject/SubjectFragment.java index 42644d190c..6c773311c4 100644 --- a/app/src/main/java/com/gh/gamecenter/subject/SubjectFragment.java +++ b/app/src/main/java/com/gh/gamecenter/subject/SubjectFragment.java @@ -10,7 +10,7 @@ import android.view.View; import android.widget.LinearLayout; import com.gc.materialdesign.views.ProgressBarCircularIndeterminate; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment; import com.gh.common.util.ApkActiveUtils; import com.gh.common.util.DownloadItemUtils; import com.gh.common.util.EntranceUtils; @@ -26,7 +26,7 @@ import com.gh.gamecenter.eventbus.EBNetworkState; import com.gh.gamecenter.eventbus.EBPackage; import com.gh.gamecenter.eventbus.EBReuse; import com.gh.gamecenter.eventbus.EBUISwitch; -import com.gh.gamecenter.news.NewsFragment; +import com.gh.gamecenter.news.NewsWrapperFragment; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; @@ -108,6 +108,7 @@ public class SubjectFragment extends BaseFragment { mName = arguments.getString("name"); mIsOrder = arguments.getBoolean("order"); mType = arguments.getString("type"); + //TODO ????? order 是 boolean mOrder = arguments.getString("order"); mTagType = arguments.getString("tagType"); mEntrance = arguments.getString(EntranceUtils.KEY_ENTRANCE); @@ -287,7 +288,7 @@ public class SubjectFragment extends BaseFragment { // 资讯Fragment界面切换事件 @Subscribe(threadMode = ThreadMode.MAIN) public void onEventMainThread(EBUISwitch busNine) { - if (NewsFragment.EB_NEWSFRAGMENT_TAG.equals(busNine.getFrom())) { + if (NewsWrapperFragment.EB_NEWSFRAGMENT_TAG.equals(busNine.getFrom())) { if (busNine.getPosition() == 0) { if (subject_pb_loading.getVisibility() == View.VISIBLE) { adapter.initList(1); diff --git a/app/src/main/java/com/gh/gamecenter/subject/SubjectTileFragment.java b/app/src/main/java/com/gh/gamecenter/subject/SubjectTileFragment.java index 2a5135d7f2..5cbf1817f7 100644 --- a/app/src/main/java/com/gh/gamecenter/subject/SubjectTileFragment.java +++ b/app/src/main/java/com/gh/gamecenter/subject/SubjectTileFragment.java @@ -17,7 +17,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.TextView; -import com.gh.base.BaseFragment; +import com.gh.base.fragment.BaseFragment; import com.gh.common.util.DisplayUtils; import com.gh.common.util.StringUtils; import com.gh.gamecenter.R; diff --git a/app/src/main/java/com/gh/gamecenter/wenda/WenDaFragment.java b/app/src/main/java/com/gh/gamecenter/wenda/WenDaFragment.java index 01d0913294..cba995b85d 100644 --- a/app/src/main/java/com/gh/gamecenter/wenda/WenDaFragment.java +++ b/app/src/main/java/com/gh/gamecenter/wenda/WenDaFragment.java @@ -1,6 +1,6 @@ //package com.gh.gamecenter.wenda; // -//import com.gh.base.BaseFragment; +//import com.gh.base.fragment.BaseFragment; //import com.gh.gamecenter.eventbus.EBNetworkState; // //import org.greenrobot.eventbus.Subscribe; diff --git a/app/src/main/res/drawable/selector_ic_game.xml b/app/src/main/res/drawable/selector_ic_game.xml new file mode 100644 index 0000000000..66ed99c36d --- /dev/null +++ b/app/src/main/res/drawable/selector_ic_game.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_ic_message.xml b/app/src/main/res/drawable/selector_ic_message.xml new file mode 100644 index 0000000000..f5eafa020f --- /dev/null +++ b/app/src/main/res/drawable/selector_ic_message.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_ic_news.xml b/app/src/main/res/drawable/selector_ic_news.xml new file mode 100644 index 0000000000..087dc331c8 --- /dev/null +++ b/app/src/main/res/drawable/selector_ic_news.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_ic_user.xml b/app/src/main/res/drawable/selector_ic_user.xml new file mode 100644 index 0000000000..e461a4ace1 --- /dev/null +++ b/app/src/main/res/drawable/selector_ic_user.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_libao.xml b/app/src/main/res/layout/activity_libao.xml index a0e2dfb1e2..ecf17def08 100644 --- a/app/src/main/res/layout/activity_libao.xml +++ b/app/src/main/res/layout/activity_libao.xml @@ -68,7 +68,7 @@ android:layout_width = "match_parent" android:layout_height = "match_parent" > - - + android:layout_height = "match_parent" > - + - + android:layout_height = "match_parent" + android:layout_below = "@+id/home_actionbar" > - + android:layout_height = "wrap_content" /> - + - + - + - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/fragment_main.xml similarity index 76% rename from app/src/main/res/layout/activity_main.xml rename to app/src/main/res/layout/fragment_main.xml index 2bf2e2e948..13894d43ca 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -2,20 +2,20 @@ android:layout_width = "match_parent" android:layout_height = "match_parent" > - + android:layout_above = "@id/lightgame_tab_container" /> - - + android:src = "@drawable/selector_ic_game" /> - - + + - + android:src = "@drawable/selector_ic_news" /> - + - - + android:src = "@drawable/selector_ic_message" /> - + - - - + android:src = "@drawable/selector_ic_user" /> - + diff --git a/app/src/main/res/layout/fragment_message.xml b/app/src/main/res/layout/fragment_message.xml index e48d4ab602..e6963c2fb1 100644 --- a/app/src/main/res/layout/fragment_message.xml +++ b/app/src/main/res/layout/fragment_message.xml @@ -7,12 +7,12 @@ - - - - + diff --git a/app/src/main/res/layout/fragment_news.xml b/app/src/main/res/layout/fragment_news.xml index b330b5d77e..c19595ca6e 100644 --- a/app/src/main/res/layout/fragment_news.xml +++ b/app/src/main/res/layout/fragment_news.xml @@ -1,13 +1,74 @@ - - + - + - + - \ No newline at end of file + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_news_slidebar.xml b/app/src/main/res/layout/fragment_news_slidebar.xml deleted file mode 100644 index af88ac8797..0000000000 --- a/app/src/main/res/layout/fragment_news_slidebar.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_page.xml b/app/src/main/res/layout/fragment_page.xml deleted file mode 100644 index 07d7c8856a..0000000000 --- a/app/src/main/res/layout/fragment_page.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_toolbar.xml b/app/src/main/res/layout/fragment_toolbar.xml new file mode 100644 index 0000000000..fd642c1410 --- /dev/null +++ b/app/src/main/res/layout/fragment_toolbar.xml @@ -0,0 +1,86 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_wrapper_toolbar.xml b/app/src/main/res/layout/fragment_wrapper_toolbar.xml new file mode 100644 index 0000000000..426052332d --- /dev/null +++ b/app/src/main/res/layout/fragment_wrapper_toolbar.xml @@ -0,0 +1,18 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/game_viewpager_item.xml b/app/src/main/res/layout/game_viewpager_item.xml index ed85df3471..f4897f94fb 100644 --- a/app/src/main/res/layout/game_viewpager_item.xml +++ b/app/src/main/res/layout/game_viewpager_item.xml @@ -1,11 +1,20 @@ - + android:layout_height = "wrap_content" + android:orientation = "vertical" + app:fractionValue = "0.65625" + app:layout_heightPercent = "65.625%" + app:measureBy = "width" > + - + + android:layout_height = "wrap_content" + app:fractionValue = "0.4375" + app:measureBy = "width" > + android:layout_gravity = "bottom|right" + android:gravity = "center" + android:orientation = "horizontal" + android:paddingBottom = "6dp" + android:paddingLeft = "10dp" + android:paddingRight = "10dp" /> - + - + + android:layout_height = "wrap_content" + android:layout_gravity = "bottom" + app:fractionValue = "0.21875" + app:measureBy = "width" > + android:textSize = "14sp" /> + android:paddingTop = "2dp" /> - + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/gamedetail_body.xml b/app/src/main/res/layout/gamedetail_body.xml index 85b556e455..5cbbd1104b 100644 --- a/app/src/main/res/layout/gamedetail_body.xml +++ b/app/src/main/res/layout/gamedetail_body.xml @@ -100,7 +100,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 9ca90332c4..b0adb442b3 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -8,7 +8,7 @@ 9dp - 48dp + 55dp 72dp diff --git a/libraries/EventBus/libs/EventBus-2.4.0.jar b/libraries/EventBus/libs/EventBus-2.4.0.jar deleted file mode 100644 index 106ed5b53d0527b8946454acb037a3bd8c0c5359..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45282 zcma&NV~{P;mMvViZQHhO+qPY&Z1a?DTc>Q>wr%sB{%-dd_ud!X{W2nV>>qPw?!9J? zF~`a^rh+su2owMS1O&i9yOk)w-vj7BKK>q%e@|Ia6+v1_IWc-*0EK@EZ14lR#{L_C z`S(Qm=RjFOIY}{5WfeMEu?N}72^ncxx;a>BTB_;EnMNgsMdsb3{Ue}%yV&3H|NmWq z|9&?y{lD(_&mnOC2r+juHMMiHH?nv6AEW={*ZsZVKSi6mncDr|W61NwG@t(dcXKcR z0Mh?vjG(ipow0(wvx}({ow1FfvvanJweo@h3hxb(^{S!^6vpJwOdHz97sR zoQtv2unNd`J0osDWaVZjT7DI_;^rW&-F6Bi@^CgpLF)wZi^=48+HXgFA%_iPyx$Bt zI|f!`hLcX01y>bS<235Jrpuv*$!b@TACV_hQV>z2f$9kis|{o;;mURv({(T}0m1o? zXXVJ&NI+4~V2Eea*l5~!d?@J;V$>Oj5hu2~%quJ-yKV!R4m;Q)hGnGJ-baPS&hwLm zXiSY*!qZJ9ino!dTa4p1hT4s9vegykC1%NssY9|Q9f4U&mg5Nw-fVD^)SX#BkP?t{ z_xVjfScQ^46}Q}YuFs{M+0%iQXWH~l4GO|wk~oyBIfad+L6ykXN(LG3>a$Ufpy;#2 zhE3VoY6v5qKx(%LaVRhbdc%Q%qC6=H%5}lyP&r1LLiY}>rVA#dQzUkD6IZ8Igla#L z*;X={RLH)OP%yudPpWb#Jz_okIgN=e%MO?lo5E^Va!i-v#H5Rs%-UwwMAezAh`Zf? z+}YMwTj!QXrzE}QkxRD_u$l)qH{lj|SKOc`%dxm(GUVhJIX!C(E81<(at^}V3)8bi zxjjD{AmFRt=ih#xFWXzKvB^RbpShLXScX!z!ij=NOx9IAqgkIy|G}kv4;>Qd0LI7V zL|A`K*ga=?V-uW?6)^aV!IxLqK_*~yiV{TV$gb&MRS%sTq`yo50AEf@wr!W}~p ztmtAG9X}#kDua7qUkXw$p$OiM)z6?B7Cr@``ZmTbruuZf5d-+U(;ha#`x%@I9zi#b z`s4I-TGPb(bRBj4F)AUjKo>)kB8|i=LrgJqSe8v9SWSoS#>gZu&f zUzuRl3o<+b1OOoNFJDmoH@FcpG`2Q(vUjyJ`4{l0`Y9u;qwq>2u?07ODp4*|5g17X zB35f5Mz*xGhT<`@!Q4^Pp(YrccNW~O6VW|uSHhcSPVe8FVbKX;}=KtRZl z|8{@ba=-R@$?Cef(*OCsBlnLg6PXR!BlC{6cZn83D3h%bcK|MQ%1BtKhp;p1#6)f- z_4#weK8@AN`GYo;_Q)UtT!TzyJHE#`xHXY@@NiC zr0Eh;r%Qg~Az4pkL(fTk8EA@bo)zgXzdw)FZ$)~b&XTpxY}VN=XA|W?ci(-|`r@-; zh6lU;f`t`EyKyhZ@+k5m&%jVi$Z?FKp(nlEFx2!zLcYn#tX@#cdvQ25-+89xq~{LS zC0cn;$%M(=qvL|RLnp!4ZyL~Eckx+!tvgYbTY0Ekd8rwjJx!NRZPsA2K6JRXnKa~*>P%%?v-tjOJHucgby>sas1t0=hgaXh<%fBb+kuqcmF=9ND45>9RTS{rEAla5{X zUA2;6D;FB9h6YnzbYcLxfsFPGbK|`2(!*FV7*3K)5-d;12c#5t$n0$U1L%FRU7N|y z3fIFUAe80lDpaPnOSXA)D;xPqdde5#{oc>Tk}!+X&UX5rAQS5B&6`yv|AO1$3vxfT zR%*2zk%GAZE!l4K5rPqeLk^qD!8EEVd|c*i-wLRYCl(DaC2f$~}DSn}jaA)PLdSA)pF z@J(+uf5ol@&c!+V|4PhEfT~Rlct^93uq=`tLB6oailr?Iv^VM@WYGwb!~RarbpFGT zi(O$6`4uYx+#ZNsX(1P4(IHg3l2(8z=^K9}{#MZdsH#EVkMq&i$4OLhy4ymIK)k|% zgdqZTqMFYrO3!b z;Fx1FkM`OTd2I7ZYg8XXDOv+1JgsdE$Ruq;(U?L|dh23jeA|48Rl7fW{=vTXoT6?~ zyl;D9QCm1$5T7+eIe>sBiB41}_8K$ujZ?qhz=q>hB z*5G7EnN?mj^s&6IVh?1CL$BOMZINGt+d5n$so2G`5{Aj$H;P!Zy-UGt_KIy>1IaT? zYnCAZ`X{-6YjQ1GT1r^fbpzEb3ChcLskp|x{D6DVx_?`xA8dyhNOok!sa370Ho}l{ z$?NRr-&Dy`c4uZ6;9p|P*7;4?U2qq$`arh{F3@wqeX|34_0) zTDDM3f~a*#i$cY_Oto&X1p)GvLo(FFBs*kF(=U}zLolB|kH5mh{I^t{X`k-#^klm8 zbl1b($IKQz0QV{dQ5-v*jfzdDt3m!gf>Lw6m2nJVZ5UHUmvLFsdp~xtP#ME1*gA5m zkmb$n;EdyAM4Fe9WYaxnMjnAM6V{D2jFm1>@VC^w}XCwA1;8xKzWvo)2RUNn|FCCoyoGQ zLTXg$QkEu)&bR%W%rR~W`ML4O$FLd?XzA7&rVOHt@;JM|C6w)Bt9>xzi{`RN#$mWd zna%yYRgKyvwK=E!a;MP5K4;Kp=p(=4el@08e~Vm~doX!kGrmm(HwPaT`Gu@NwhK9? zXrOsH%m-I9JBmE&ty7mhUD7xc;5h)0gu&0i&xHsp0WG(6ghMYm&bGM+ zIv?p^`Z7)&D_Fd?O}H1NUlJ&Wrc;UD4@ZJ@Z z?!aLm;yjNiKgyHg?l2Qu$b84Lxf6!Y{HNs8We1Quwqb?{e1;TH#@C$%$i-f#moQ@d z5<=oGJjIGum4&wCbD@cZ7cDNI1oww^*T!3ez%~pt**7)? zdx*=JYC3aStVQW;MVxmn+AszT?!_p3v40;w5twC}ZvzLStTf+eqGV^8@9ST_ zlV2j1>K8Ew*F%-%p2JZDk$&nJR6qK);Q1Gl*QG0xFV>H(NxnBWn>5DxJ+Axjs|oYwP~bVktflxBs9`g$IX^X)_Jv97C@@WfT3SSvSi zie6D_<<*DxOXIH0ez3>i6HS?o>Xuu!3f|$t26aY8YKG|lt4u=Q>_I#E%OW~|8HN6T zW0U_-Ny3IUHb#GS(?6appLluc0Re=eoyCmBRjs~Caro!`z?DdFVQ3)%!d;)=aE2G{ z+RyTLjh?r_ula+rz0!!_q3I*ozC6bl9|y?2w8xy0IL!T<8Ri$lmOE}4!1fU6D@$tE z#o>aMij?>%QRw}W)m+5FE;1DG^w$-zQPYgr=GfREH)|k@Bg22>STEIXXm0`=%$Bex zJ_0lr+1gW9q{t6#9PkQy&c-;WA)0M1X@4ga{z-8-wPP`AP$P+eq#|zXTxuREU-i!7M<*}WPbh|1QXS;A1$ofIVB4M=Ja&(86IwK^%e9~0JmEnLFfs_ z9J25_o)E~YL5-+88G?M~`D&qV@_QMxW@Xc5<>f0VnWrTMX?1Kmce|t)F-OWL zhL8AMg*~^9Z*)_BwPi|P6ogz*CDR?rV)$6tF~G2vXPmcR7<#>Q|)J4t4g zQ5$%Y#NIrzY}$=Y+t|?f=QrHv9cg_kS<}Ciw4|dw@6_jNyL?nPrftDe(jP0=Q69zK z^cH&Rw7&%?j~(<4u3tR#v50%#F-yZ4F$;;~zs#k(r!xnTG~Ur6TRfSyIvHu3e6(+M zolpo3y}&6ynR%bx8IirQUjlPsJ^Sc$L%w+YT<0LtpN}~QkKskcPb|E}AG8g04KC1; z=6EvZfbbl$VsAAD5BxQuo+0r-Y3PB}?hvB*0sj>*6Qzq;lQ;kXk^%q#ME^_f|B>is zEl6*bqh|h-X_IRcCrAVg1OMK-FcTpdpnm_RV9`RtvMRyKY#BNe6DDMHG64W<^rq&C z$`-r&D2t`e6{}n*Nd+xM%VMLY_4V$GD{E_O_79utttP4MAMcmxY)K}8%bPCzW8a;w z9k=Bl&J%3;Ebl`_qKw**D9Hm^F8k;FtpexYahsh(;)2^$#HlH_rk{Xkx^&1jw{x&e z7eRbX97MU9uCebHB=!lZXr5_Y_78Iy7ZYyT+CDf3)IKb+?xU%#)3$sW7S(d6S&xcs zPxCboszV&Sq@|@t(qektMJt3|+4CEeUAprdq+MI{8?;?=XRcEAagWau_O*}CP)8rZ z_m!q6@X51W-6g^NllTcE;;!FmGOPMBQEys?FI?IDH4o(8E_C`gg{GaNe7;J*a_8R` zxcr92sXe1oe`MEZ#t*>gcPOq-yj4bWQ`6Z|ji09GJ4EsRoO@?Z>+-cjbnLxuh?42Y z8~0FT`blv5Xc=EyZ(>p?c3-9`!5XU$2Ln`fC^$?}!EBWlX zHo<>)FCUWf^L#%OX^H={InfjUjOzJ0KhcAP+IfDY@Abyc=lx!t>R0-3lO8@+CQmZC zIPO7`&9=bR6H1Rxx{#in;L*v6wAH6VR$D*#3|mdfJm0{FJeDR?14}(UpfHe}ke!g> zK~mpk=0g@DDV;9XlD0vFdne;VlpR4*kj7J-KUB4r!!#vAwU#xxn8rONQexK3bHO#= zV6t@1O3lV*(^_C>>@!fYl*%y0b(Pp2tI;_mGbY7am*2Q0QyVR!?YJrtRT3*hqu0nb zAImv(VZ4EyAR`V{hz^INn=;~$)YmY6B>hmrGB}?e=zNI35bPrE%#{(@Y;H6r(q7~2 znu1X>>BUWvAtS=AL}}<`+R){!YvfFo!l+)Plpq%sDzvYW>)tLqcN!gDP_uw%#ilIt zR7z&5`;ctL@_@&|W&kyZi&kh^;v70<`t8`D*lYGD-Z5rI+X$A0q%eU)O;^FAsLrEd znaTMSGcs7wHbJBRoq}0Jg&E4u#g}9biCuY_M3W-6o;UeYf& z!fmZ7a6;{{#9*kksc@p%tb}!~fh@%$VJLqAb0}|ZT-7aeE>?!Ad0XZxIzoS%&c?qI zd>Wa1rl};c!->0g8<#bCiSbVDlsacq&w#-;hK1}wQmT}ALpEAQE;AwpC@N__?UO01 zXa1W{icvGyf^`oct^KtnGhG$!kO7qXI0w>ZllnI;6uA*(V|^j4mwh$L|MWxX-8QDyO22qM8T^=P_2W4X97~}KW zwTv~4GBs7GYvARHZ2E?A3hEnm=zE&XUGalLp3N!Fs#-wulhw8|ylf7*Zw z>n8;fK|F)|Q5bB=nK>LS!;FhfTzc(BiVX;cHpG4U@)!O{OMroE20_T??6^uo7jcB> zU}Q0UeawmtXGkr;z$b15jXm)G>!lDBUKQ$GQ34*pGU(0FxRcH_?yzHjnbS?I2pq83 zu}WbB;b|2vVsQCr)8)9upMpGGW9uE~(ZK+#`5|00aJDp0EFTU>ymF3(v@!r!ovW_# z=n=OJ%GP@M)3JU@N(OJAZuH3t464IG05%a0Y&HtPWx5RnI)S-(+v+#xyWo!E$(BPo zX8=Ot$t_0GNE?HO5&zZMnG#DKrsV5(K!#38N63NY7#`z(D?dh zvoQ_X$?jF+gRptJQ2!}0D#gIzR?FOWv(`Enu8^phnCU;~tchd(6*|EyZ>}YhL9sJT z_MEfFKhR20;|g&s<|f73WS6!Qa3WJfA;3=neslYL&31& zlx4}JS8ed6Qd18rd7p2oRRTjk9%8QB3geq-BO0>2;c;Rnd!Z6gd8e)GN)d}~Z%=ov zZM;bOh#@=+ZIWC+5+~@2y3G}d#RkLMxAcg-b+=O2i8@k_1(_YTv+3@kgXRXYJt_hW z^9i8@pP=kvyp(`2R9aM2_g5cHrcv&iEOz8u-A`k&DvLVE$`QV3V8>%(U_RO3$e?3q zxBYpkXQUoS42jM`dPS))zrx|pKgEN7Na*2bgBk|>m}NO>sg{h;dJJdTPc!|uaZ*pj z=c~)4Va|(#z;H`~My2Hv^i4aa6U9xQo0wCYxqjAm+281e`t)JBq~iMQLzNe>9yxgX zSe{@)ssu+)wPlhA=rv)#vAgIFKezJi7k-2B%96vp*YM;dj5OYRNa4+l9dP)JnQ@QP9GZpA-kuYaS4|fk-Ca9R@DBDhvY5_HlaH$$2T@F3pOjMaI2r?JGP(t?QJFO)zcI+@AvaLHoea3}ba`FmZtFGM=?R za}Q%LaY~IStBbdF9(Y&$i>z|&{`}Jyyz70uE{v* zo5K3tr<0yDy@Ka*vby79`$;+3)4L>p+9iU{c!3$prkrVN(P+5Q8K{oEj-v-#goPxU zOnb}Hk+mz}R(y$sx~m|i5jfe`60s1r@OFE|OeAz27Rw0Q zfIvbhY+nclux`}{afkv;*RL92E_N9D^2q*6EdexDn$(zBh{_~w z{O!k|p?iC`Y;G?5NyMF2Ku(=)(%e|8_PNb$#nh6ru1&}%rj`POyBi?N5PJ(KIsIq) zoh8bMwsmf%znee0cHZp|U8A^63X~>$5lzzd0ayfn+#lpkZNhv^Bsu0ZA-uDsWU3N5wEXzu_HiPECer!DIz>651x6Rb$A zD!a!nic8@5$TKVjV+?Szyw88CeJDkQu5!-~y%c8zM zj#rV$wkW(bKYfvpWjS-6zmDT>ZNZXL9se$bCCZo~qAtY9U6!)1B5tdo9@wIUM119f z`t7O|$tPslp2Orq?5co%Rm5$XnmEZ3fJw^1D%e+|cWf{(6V5|CY|P-EZj2XU$8upmkb{DeQ*KM}<1-tDkm+S=`4$LSW47ZL1doPa}89jr9E)l|~NbkV6BFemkYazVCkNl5Za_@y#e9Ni)dlS&( zw9W38S#tKLk0*an3%Vu!>NQ-ZdO3-AwUYCNQQ*)6=H~h*m0%}npuJ*e+hkPfIz0_0g)cRka#ZwjWinizH=PrI55qAFq)bQch{B0MX{)n4YYq+L#u zv*Ud8AiDG_ZVI7e!Fak{_K0e&73+IeZ@!?Gq@2NJAx^`}2zT$$U*^|GPIWprWr>e; z;Vdpo_P>TUw|;0SC@LE)bjKyeaA03^K*T^E{o&Ib)0TIn+dDD`RoHnb?v2rbo!16P=hwNq zktAduSx;~IEbe?W0wh!czm|xUmI$R-39d~L9G{8yb)wRo$qS~`5pAzWJ_JS5$q~$B ziO0R+9gqLMkLd}>(HB{bUf&ROD2*}o8w~p{ zg00alD94ulG{VQSf*kEoiMO7B-P5B)hqxbY_)gh$%xyCAhZy=P|Rc77YfxbNub zY#YR#WSGEOdc?y{?-@Udi|=Bb-dMTW7|ATd^&_(m)2N-xhv2ehX?u40Cz}WxEORFt zS?3JgCTYu)?PA^)&87z7!-!|E>b{3VL^Y%=9V#Okpe>LVV4Cc{Onwz5yBfcwbp<{d ziBr^Oji~51QO^gRmcmt7wOtD4NhmMi4B@(xE4}y7!FfIzYYXagS5KK=Plul$;^)B` z&iiCoF#-jpCx|L<*=1{;NCxVn! zEyQJdRkS^{bzC@hPK;(r&EKI9(_yS#aNKW�j$FdY6oB3}%K&7bMBTpOek@dmza% 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

  • )8kO_cTe6c?E>>uEdGd}74k^_t3@DwRrq;jmnsm(ocK&Y@&h zL0*(&SNyS)_5ma&6vz)778atT(MlY25&he)3S>0%=Ya}w@FTYeLS9@=m{D3mf*HJ7 zl^^71e9#kqI9y@=c;=r+egG}#(Z8F?3oA%Vh^wkG$xDC}el!5Rwf}X1TyFk6eh9mP z9)n!7?rVVj*YhEMG)VcQfrXQqnVpmUGkceN+unuyqixTBv^8@BW#jz^fjV14`y3Rn z1?ZzK<-gS-Ao2sQ{|n(?HeEm0zXLy^8E?4ISkRRn4(fNhUyy8||NhQ5OvKp4+QP}+ z)z0)j?qmiqtr=tz5)SHCieI>hAf?}N|8=_%adrO7Obk5IcRDmVNT8GV`wt=ls37jW zMAkn(%!3oL=RZ8&0>!2Wij(=57do$-74YYlw35)gP66f(yz z@F>t5=YPUMGmt-Q165s&UH%+2z~k>Pnn)iYfPjz|f`B0VMIs#aeu>|Q3|?UPFJyi| zBIEtMU;LiH!vwFxd57%=RV2BuC%~$5f`h?JK;D7#K?BwAz`rR72@VA>uyzMc1I;9V z2mLSQ*1*BwrNi#Pc%a?YzXShN&FJ?p7x{-Lc{I?g{Z%_Pw_paGR<-1w5m_tpILX1%4XfZcle2+{S-b@}a7S;p{(JPlHaq?oy8v)O@NDfn!5q8)pWrXaCE#-43AcB0 z@{a#6x!=D?;0a)NG8FFrOy)n*!NAW5JQL?m3dZZ7O5NLa;Mo&*LQOvZQ0Vua2EOI? zPGBqW?+N_94Y=Sv2)>EyP8TWcpXuJWr3+jY{44xB)!^uVr26~L1YhO8!?z{hhyNdI z-r#2ezSeOkLzZ=q%zs(=0H=d5FWk|QvhShav)G^{3k{kdK|s)gehfgLwe50${Plkl CS4t58 diff --git a/libraries/EventBus/src/main/AndroidManifest.xml b/libraries/EventBus/src/main/AndroidManifest.xml deleted file mode 100644 index 4df1b5b2fd..0000000000 --- a/libraries/EventBus/src/main/AndroidManifest.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - diff --git a/libraries/EventBus/build.gradle b/libraries/LGLibrary/build.gradle similarity index 69% rename from libraries/EventBus/build.gradle rename to libraries/LGLibrary/build.gradle index 89d074a4f1..cc778bafa7 100644 --- a/libraries/EventBus/build.gradle +++ b/libraries/LGLibrary/build.gradle @@ -2,6 +2,9 @@ apply plugin: 'com.android.library' dependencies { compile fileTree(dir: 'libs', exclude: 'android-support-*.jar', include: '*.jar') + provided libs.supportV4 + provided libs.supportAppCompat + provided libs.supportRecyclerView } android { diff --git a/libraries/EventBus/proguard-library.txt b/libraries/LGLibrary/proguard-library.txt similarity index 63% rename from libraries/EventBus/proguard-library.txt rename to libraries/LGLibrary/proguard-library.txt index 44a1304068..f2fe1559a2 100644 --- a/libraries/EventBus/proguard-library.txt +++ b/libraries/LGLibrary/proguard-library.txt @@ -18,21 +18,3 @@ #-keepclassmembers class fqcn.of.javascript.interface.for.webview { # public *; #} - --keep class de.greenrobot.event.** {*;} --keepclassmembers class ** { - public void onEvent*(**); - void onEvent*(**); -} - --keepattributes *Annotation* -#-keepclassmembers class ** { -# @org.greenrobot.eventbus.Subscribe ; -#} --keep enum de.greenrobot.event.ThreadMode { *; } - -# Only required if you use AsyncExecutor --keepclassmembers class * extends de.greenrobot.event.util.ThrowableFailureEvent { - (java.lang.Throwable); -} - diff --git a/libraries/LGLibrary/src/main/AndroidManifest.xml b/libraries/LGLibrary/src/main/AndroidManifest.xml new file mode 100644 index 0000000000..269e0bc84d --- /dev/null +++ b/libraries/LGLibrary/src/main/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + + + diff --git a/libraries/LGLibrary/src/main/java/com/lightgame/adapter/BaseFragmentPagerAdapter.java b/libraries/LGLibrary/src/main/java/com/lightgame/adapter/BaseFragmentPagerAdapter.java new file mode 100755 index 0000000000..b852e5a473 --- /dev/null +++ b/libraries/LGLibrary/src/main/java/com/lightgame/adapter/BaseFragmentPagerAdapter.java @@ -0,0 +1,53 @@ +/** + * project: OPlay + *

    + *

    + * ======================================================================== + * amend date amend user amend reason + * 2013-3-5 CsHeng + */ + +package com.lightgame.adapter; + +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; +import android.support.v4.app.FragmentPagerAdapter; + +import java.util.List; + +/** + * 通用Fragment Page Adapter + * + * @author CsHeng + * @date 2013-3-8 + */ +public class BaseFragmentPagerAdapter extends FragmentPagerAdapter { + + List mFragments; + + // nested fragment should pass getChildFragmentManager() + private BaseFragmentPagerAdapter(FragmentManager fm, List fragments) { + super(fm); + mFragments = fragments; + } + + /** + * @param fm Pass getSupportFragmentManager() or Nested Fragment Should Pass getChildFragmentManager() + * @param fragments + * @return + */ + public static BaseFragmentPagerAdapter newInstance(FragmentManager fm, List fragments) { + return new BaseFragmentPagerAdapter(fm, fragments); + } + + @Override + public Fragment getItem(int position) { + return mFragments.get(position); + } + + @Override + public int getCount() { + return mFragments.size(); + } + +} diff --git a/libraries/LGLibrary/src/main/java/com/lightgame/listeners/IllegalAttachException.java b/libraries/LGLibrary/src/main/java/com/lightgame/listeners/IllegalAttachException.java new file mode 100644 index 0000000000..0deb12be25 --- /dev/null +++ b/libraries/LGLibrary/src/main/java/com/lightgame/listeners/IllegalAttachException.java @@ -0,0 +1,23 @@ +package com.lightgame.listeners; + +/** + * Fragment Attach 到Activity时若不满足条件则抛出 + * Created by csheng on 15-9-29. + */ +public class IllegalAttachException extends RuntimeException { + + public IllegalAttachException() { + } + + public IllegalAttachException(String detailMessage) { + super(detailMessage); + } + + public IllegalAttachException(String detailMessage, Throwable throwable) { + super(detailMessage, throwable); + } + + public IllegalAttachException(Throwable throwable) { + super(throwable); + } +} diff --git a/libraries/LGLibrary/src/main/java/com/lightgame/listeners/OnBackPressedListener.java b/libraries/LGLibrary/src/main/java/com/lightgame/listeners/OnBackPressedListener.java new file mode 100755 index 0000000000..60d1894405 --- /dev/null +++ b/libraries/LGLibrary/src/main/java/com/lightgame/listeners/OnBackPressedListener.java @@ -0,0 +1,9 @@ +package com.lightgame.listeners; + +/** + * Forward activity onBackPressed() events to fragment + * (If nested fragments need this, just forward again) + */ +public interface OnBackPressedListener { + public boolean onHandleBackPressed(); +} diff --git a/libraries/LGLibrary/src/main/java/com/lightgame/listeners/OnBrowserActionListener.java b/libraries/LGLibrary/src/main/java/com/lightgame/listeners/OnBrowserActionListener.java new file mode 100644 index 0000000000..b845c84dc0 --- /dev/null +++ b/libraries/LGLibrary/src/main/java/com/lightgame/listeners/OnBrowserActionListener.java @@ -0,0 +1,13 @@ +package com.lightgame.listeners; + +/** + * @author CsHeng + * @Date 14-10-16 + * @Time 下午9:11 + */ +public interface OnBrowserActionListener { + public void onRotateImage(); + + public void onSaveImage(); +} + diff --git a/libraries/LGLibrary/src/main/java/com/lightgame/listeners/UpdateableFragment.java b/libraries/LGLibrary/src/main/java/com/lightgame/listeners/UpdateableFragment.java new file mode 100755 index 0000000000..81b205a531 --- /dev/null +++ b/libraries/LGLibrary/src/main/java/com/lightgame/listeners/UpdateableFragment.java @@ -0,0 +1,12 @@ +package com.lightgame.listeners; + +import java.util.List; + +/** + * @author: CsHeng (csheng1204[at]gmail[dot]com) + * Date: 13-12-24 + * Time: 下午2:52 + */ +public interface UpdateableFragment { + public void onFragmentNeedsUpdate(List listData); +} diff --git a/libraries/LGLibrary/src/main/java/com/lightgame/view/CheckableImageView.java b/libraries/LGLibrary/src/main/java/com/lightgame/view/CheckableImageView.java new file mode 100644 index 0000000000..5a3afd29ae --- /dev/null +++ b/libraries/LGLibrary/src/main/java/com/lightgame/view/CheckableImageView.java @@ -0,0 +1,42 @@ +package com.lightgame.view; + +import android.content.Context; +import android.support.v7.widget.AppCompatImageView; +import android.util.AttributeSet; +import android.widget.Checkable; + +public class CheckableImageView extends AppCompatImageView implements Checkable { + + private boolean mChecked; + private static final int[] CHECKED_STATE_SET = { + android.R.attr.state_checked + }; + + public CheckableImageView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @Override + public int[] onCreateDrawableState(int extraSpace) { + final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); + if (isChecked()) { + mergeDrawableStates(drawableState, CHECKED_STATE_SET); + } + return drawableState; + } + + public void toggle() { + setChecked(!mChecked); + } + + public boolean isChecked() { + return mChecked; + } + + public void setChecked(boolean checked) { + if (mChecked != checked) { + mChecked = checked; + refreshDrawableState(); + } + } +} \ No newline at end of file diff --git a/libraries/LGLibrary/src/main/java/com/lightgame/view/CheckableLinearLayout.java b/libraries/LGLibrary/src/main/java/com/lightgame/view/CheckableLinearLayout.java new file mode 100644 index 0000000000..07edc46f66 --- /dev/null +++ b/libraries/LGLibrary/src/main/java/com/lightgame/view/CheckableLinearLayout.java @@ -0,0 +1,57 @@ +package com.lightgame.view; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Checkable; +import android.widget.LinearLayout; + +public class CheckableLinearLayout extends LinearLayout implements Checkable { + + private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked}; + + private boolean mChecked = false; + + public CheckableLinearLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public boolean isChecked() { + return mChecked; + } + + public void setChecked(boolean b) { + if (b != mChecked) { + mChecked = b; + refreshDrawableState(); + setChildChecked(this, b); + } + } + + private void setChildChecked(ViewGroup vg, boolean checked) { + for (int i = 0, size = vg.getChildCount(); i < size; i++) { + final View child = vg.getChildAt(i); + if (child instanceof Checkable) { + ((Checkable) child).setChecked(checked); + } + if (child instanceof ViewGroup) { + setChildChecked((ViewGroup) child, checked); + } + } + } + + public void toggle() { + setChecked(!mChecked); + } + + @Override + public int[] onCreateDrawableState(int extraSpace) { + final int[] drawableState = super.onCreateDrawableState(extraSpace + 1); + if (isChecked()) { + mergeDrawableStates(drawableState, CHECKED_STATE_SET); + } + return drawableState; + } + +} \ No newline at end of file diff --git a/libraries/LGLibrary/src/main/java/com/lightgame/view/DoubleTapTextView.java b/libraries/LGLibrary/src/main/java/com/lightgame/view/DoubleTapTextView.java new file mode 100644 index 0000000000..df8c4d0aad --- /dev/null +++ b/libraries/LGLibrary/src/main/java/com/lightgame/view/DoubleTapTextView.java @@ -0,0 +1,69 @@ +package com.lightgame.view; + +import android.content.Context; +import android.support.v7.widget.AppCompatTextView; +import android.util.AttributeSet; +import android.view.GestureDetector; +import android.view.MotionEvent; + +/** + * @author CsHeng + * @Date 14-10-29 + * @Time 下午3:16 + */ +public class DoubleTapTextView extends AppCompatTextView { + + private OnDoubleTapListener mOnDoubleTapListener; + private GestureDetector mGestureDetector; + + public DoubleTapTextView(Context context) { + super(context); + mGestureDetector = new GestureDetector(getContext(), new GestureListener()); + } + + public DoubleTapTextView(Context context, AttributeSet attrs) { + super(context, attrs); + mGestureDetector = new GestureDetector(getContext(), new GestureListener()); + } + + public DoubleTapTextView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + mGestureDetector = new GestureDetector(getContext(), new GestureListener()); + } + + public void setOnDoubleTapListener(OnDoubleTapListener onDoubleTapListener) { + mOnDoubleTapListener = onDoubleTapListener; + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + return mGestureDetector.onTouchEvent(event); + } + + private class GestureListener extends GestureDetector.SimpleOnGestureListener { + + @Override + public boolean onDown(MotionEvent e) { + return true; + } + + @Override + public boolean onDoubleTap(MotionEvent e) { + if (mOnDoubleTapListener != null) { + return mOnDoubleTapListener.onDoubleTap(); + } + return false; + } + } + + /** + * @author CsHeng + * @Date 14-10-29 + * @Time 下午3:15 + */ + public interface OnDoubleTapListener { + boolean onDoubleTap(); + } + +} + diff --git a/app/src/main/java/com/gh/common/view/NoScrollableViewPager.java b/libraries/LGLibrary/src/main/java/com/lightgame/view/NoScrollableViewPager.java similarity index 70% rename from app/src/main/java/com/gh/common/view/NoScrollableViewPager.java rename to libraries/LGLibrary/src/main/java/com/lightgame/view/NoScrollableViewPager.java index 0218c116bd..2aa022f254 100644 --- a/app/src/main/java/com/gh/common/view/NoScrollableViewPager.java +++ b/libraries/LGLibrary/src/main/java/com/lightgame/view/NoScrollableViewPager.java @@ -1,4 +1,4 @@ -package com.gh.common.view; +package com.lightgame.view; import android.content.Context; import android.support.v4.view.ViewPager; @@ -11,30 +11,30 @@ import android.view.MotionEvent; */ public class NoScrollableViewPager extends ViewPager { - private boolean isScrollable; + private boolean mIsScrollable; public NoScrollableViewPager(Context context) { super(context); - isScrollable = true; + mIsScrollable = true; } public NoScrollableViewPager(Context context, AttributeSet attrs) { super(context, attrs); - isScrollable = true; - + mIsScrollable = true; } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { - return isScrollable && super.onInterceptTouchEvent(ev); + return mIsScrollable && super.onInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent ev) { - return isScrollable && super.onTouchEvent(ev); + return mIsScrollable && super.onTouchEvent(ev); } public void setScrollable(boolean scrollable) { - isScrollable = scrollable; + mIsScrollable = scrollable; } + } diff --git a/libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/AspectRatioImageView.java b/libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/AspectRatioImageView.java new file mode 100755 index 0000000000..ba99a7028e --- /dev/null +++ b/libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/AspectRatioImageView.java @@ -0,0 +1,73 @@ +package com.lightgame.view.imageview; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.drawable.Drawable; +import android.support.v7.widget.AppCompatImageView; +import android.util.AttributeSet; + +import com.lightgame.R; + + +/** + * 按照宽度适配,高度保持比例即可 + * + * @author CsHeng + * @date 2013-3-13 + */ +public class AspectRatioImageView extends AppCompatImageView { + + private boolean mMeasureByHeight = false; // default width + private float mFraction = 1f;// default square + + public AspectRatioImageView(Context context) { + super(context); + } + + public AspectRatioImageView(Context context, AttributeSet attrs) { + super(context, attrs); + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ScaleView); + int enumV = a.getInt(R.styleable.ScaleView_measureBy, 0); + mMeasureByHeight = enumV != 0; + mFraction = a.getFloat(R.styleable.ScaleView_fractionValue, mFraction); + a.recycle(); + } + + public AspectRatioImageView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ScaleView); + int enumV = a.getInt(R.styleable.ScaleView_measureBy, 0); + mMeasureByHeight = enumV != 0; + mFraction = a.getFloat(R.styleable.ScaleView_fractionValue, mFraction); + a.recycle(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + Drawable drawable = getDrawable(); + if (drawable != null) { + if (mMeasureByHeight) { + int height = MeasureSpec.getSize(heightMeasureSpec); + int dih = drawable.getIntrinsicHeight(); + if (dih > 0) { + int width = height * drawable.getIntrinsicWidth() / dih; + setMeasuredDimension(width, height); + } else { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + } else { + int width = MeasureSpec.getSize(widthMeasureSpec); + int diw = drawable.getIntrinsicWidth(); + if (diw > 0) { + int height = width * drawable.getIntrinsicHeight() / diw; + setMeasuredDimension(width, height); + } else { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + } + } else { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + } +} diff --git a/libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/RoundedDrawable.java b/libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/RoundedDrawable.java new file mode 100755 index 0000000000..24ffe3901e --- /dev/null +++ b/libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/RoundedDrawable.java @@ -0,0 +1,366 @@ +package com.lightgame.view.imageview; + +import android.content.res.ColorStateList; +import android.graphics.Bitmap; +import android.graphics.Bitmap.Config; +import android.graphics.BitmapShader; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.ColorFilter; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.PixelFormat; +import android.graphics.Rect; +import android.graphics.RectF; +import android.graphics.Shader; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.LayerDrawable; +import android.util.Log; +import android.widget.ImageView.ScaleType; + +@SuppressWarnings("UnusedDeclaration") +public class RoundedDrawable extends Drawable { + + public static final String TAG = "RoundedDrawable"; + public static final int DEFAULT_BORDER_COLOR = Color.BLACK; + private ColorStateList mBorderColor = ColorStateList.valueOf(DEFAULT_BORDER_COLOR); + private final RectF mBounds = new RectF(); + private final RectF mDrawableRect = new RectF(); + private final RectF mBitmapRect = new RectF(); + private final BitmapShader mBitmapShader; + private final Paint mBitmapPaint; + private final int mBitmapWidth; + private final int mBitmapHeight; + private final RectF mBorderRect = new RectF(); + private final Paint mBorderPaint; + private final Matrix mShaderMatrix = new Matrix(); + private float mCornerRadius = 0; + private boolean mOval = false; + private float mBorderWidth = 0; + private ScaleType mScaleType = ScaleType.FIT_CENTER; + + public RoundedDrawable(Bitmap bitmap) { + + mBitmapWidth = bitmap.getWidth(); + mBitmapHeight = bitmap.getHeight(); + mBitmapRect.set(0, 0, mBitmapWidth, mBitmapHeight); + + mBitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); + mBitmapShader.setLocalMatrix(mShaderMatrix); + + mBitmapPaint = new Paint(); + mBitmapPaint.setStyle(Paint.Style.FILL); + mBitmapPaint.setAntiAlias(true); + mBitmapPaint.setShader(mBitmapShader); + + mBorderPaint = new Paint(); + mBorderPaint.setStyle(Paint.Style.STROKE); + mBorderPaint.setAntiAlias(true); + mBorderPaint.setColor(mBorderColor.getColorForState(getState(), DEFAULT_BORDER_COLOR)); + mBorderPaint.setStrokeWidth(mBorderWidth); + } + + public static RoundedDrawable fromBitmap(Bitmap bitmap) { + if (bitmap != null) { + return new RoundedDrawable(bitmap); + } else { + return null; + } + } + + public static Drawable fromDrawable(Drawable drawable) { + if (drawable != null) { + if (drawable instanceof RoundedDrawable) { + // just return if it's already a RoundedDrawable + return drawable; + } else if (drawable instanceof LayerDrawable) { + LayerDrawable ld = (LayerDrawable) drawable; + int num = ld.getNumberOfLayers(); + + // loop through layers to and change to RoundedDrawables if possible + for (int i = 0; i < num; i++) { + Drawable d = ld.getDrawable(i); + ld.setDrawableByLayerId(ld.getId(i), fromDrawable(d)); + } + return ld; + } + + // try to get a bitmap from the drawable and + Bitmap bm = drawableToBitmap(drawable); + if (bm != null) { + return new RoundedDrawable(bm); + } else { + Log.w(TAG, "Failed to create bitmap from drawable!"); + } + } + return drawable; + } + + public static Bitmap drawableToBitmap(Drawable drawable) { + if (drawable instanceof BitmapDrawable) { + return ((BitmapDrawable) drawable).getBitmap(); + } + + Bitmap bitmap; + int width = Math.max(drawable.getIntrinsicWidth(), 1); + int height = Math.max(drawable.getIntrinsicHeight(), 1); + try { + bitmap = Bitmap.createBitmap(width, height, Config.ARGB_8888); + Canvas canvas = new Canvas(bitmap); + drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); + drawable.draw(canvas); + } catch (Exception e) { + e.printStackTrace(); + bitmap = null; + } + + return bitmap; + } + + private void updateShaderMatrix() { + float scale; + float dx; + float dy; + + switch (mScaleType) { + case CENTER: + mBorderRect.set(mBounds); + mBorderRect.inset((mBorderWidth) / 2, (mBorderWidth) / 2); + + mShaderMatrix.set(null); + mShaderMatrix.setTranslate((int) ((mBorderRect.width() - mBitmapWidth) * 0.5f + 0.5f), + (int) ((mBorderRect.height() - mBitmapHeight) * 0.5f + 0.5f)); + break; + + case CENTER_CROP: + mBorderRect.set(mBounds); + mBorderRect.inset((mBorderWidth) / 2, (mBorderWidth) / 2); + + mShaderMatrix.set(null); + + dx = 0; + dy = 0; + + if (mBitmapWidth * mBorderRect.height() > mBorderRect.width() * mBitmapHeight) { + scale = mBorderRect.height() / (float) mBitmapHeight; + dx = (mBorderRect.width() - mBitmapWidth * scale) * 0.5f; + } else { + scale = mBorderRect.width() / (float) mBitmapWidth; + dy = (mBorderRect.height() - mBitmapHeight * scale) * 0.5f; + } + + mShaderMatrix.setScale(scale, scale); + mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth, + (int) (dy + 0.5f) + mBorderWidth); + break; + + case CENTER_INSIDE: + mShaderMatrix.set(null); + + if (mBitmapWidth <= mBounds.width() && mBitmapHeight <= mBounds.height()) { + scale = 1.0f; + } else { + scale = Math.min(mBounds.width() / (float) mBitmapWidth, + mBounds.height() / (float) mBitmapHeight); + } + + dx = (int) ((mBounds.width() - mBitmapWidth * scale) * 0.5f + 0.5f); + dy = (int) ((mBounds.height() - mBitmapHeight * scale) * 0.5f + 0.5f); + + mShaderMatrix.setScale(scale, scale); + mShaderMatrix.postTranslate(dx, dy); + + mBorderRect.set(mBitmapRect); + mShaderMatrix.mapRect(mBorderRect); + mBorderRect.inset((mBorderWidth) / 2, (mBorderWidth) / 2); + mShaderMatrix.setRectToRect(mBitmapRect, mBorderRect, Matrix.ScaleToFit.FILL); + break; + + default: + case FIT_CENTER: + mBorderRect.set(mBitmapRect); + mShaderMatrix.setRectToRect(mBitmapRect, mBounds, Matrix.ScaleToFit.CENTER); + mShaderMatrix.mapRect(mBorderRect); + mBorderRect.inset((mBorderWidth) / 2, (mBorderWidth) / 2); + mShaderMatrix.setRectToRect(mBitmapRect, mBorderRect, Matrix.ScaleToFit.FILL); + break; + + case FIT_END: + mBorderRect.set(mBitmapRect); + mShaderMatrix.setRectToRect(mBitmapRect, mBounds, Matrix.ScaleToFit.END); + mShaderMatrix.mapRect(mBorderRect); + mBorderRect.inset((mBorderWidth) / 2, (mBorderWidth) / 2); + mShaderMatrix.setRectToRect(mBitmapRect, mBorderRect, Matrix.ScaleToFit.FILL); + break; + + case FIT_START: + mBorderRect.set(mBitmapRect); + mShaderMatrix.setRectToRect(mBitmapRect, mBounds, Matrix.ScaleToFit.START); + mShaderMatrix.mapRect(mBorderRect); + mBorderRect.inset((mBorderWidth) / 2, (mBorderWidth) / 2); + mShaderMatrix.setRectToRect(mBitmapRect, mBorderRect, Matrix.ScaleToFit.FILL); + break; + + case FIT_XY: + mBorderRect.set(mBounds); + mBorderRect.inset((mBorderWidth) / 2, (mBorderWidth) / 2); + mShaderMatrix.set(null); + mShaderMatrix.setRectToRect(mBitmapRect, mBorderRect, Matrix.ScaleToFit.FILL); + break; + } + + mDrawableRect.set(mBorderRect); + mBitmapShader.setLocalMatrix(mShaderMatrix); + } + + @Override + public void draw(Canvas canvas) { + + if (mOval) { + if (mBorderWidth > 0) { + canvas.drawOval(mDrawableRect, mBitmapPaint); + canvas.drawOval(mBorderRect, mBorderPaint); + } else { + canvas.drawOval(mDrawableRect, mBitmapPaint); + } + } else { + if (mBorderWidth > 0) { + canvas.drawRoundRect(mDrawableRect, Math.max(mCornerRadius, 0), + Math.max(mCornerRadius, 0), mBitmapPaint); + canvas.drawRoundRect(mBorderRect, mCornerRadius, mCornerRadius, mBorderPaint); + } else { + canvas.drawRoundRect(mDrawableRect, mCornerRadius, mCornerRadius, mBitmapPaint); + } + } + } + + @Override + public void setDither(boolean dither) { + mBitmapPaint.setDither(dither); + invalidateSelf(); + } + + @Override + public void setFilterBitmap(boolean filter) { + mBitmapPaint.setFilterBitmap(filter); + invalidateSelf(); + } + + @Override + public void setAlpha(int alpha) { + mBitmapPaint.setAlpha(alpha); + invalidateSelf(); + } + + @Override + public void setColorFilter(ColorFilter cf) { + mBitmapPaint.setColorFilter(cf); + invalidateSelf(); + } + + @Override + public boolean isStateful() { + return mBorderColor.isStateful(); + } + + @Override + public int getOpacity() { + return PixelFormat.TRANSLUCENT; + } + + @Override + protected boolean onStateChange(int[] state) { + int newColor = mBorderColor.getColorForState(state, 0); + if (mBorderPaint.getColor() != newColor) { + mBorderPaint.setColor(newColor); + return true; + } else { + return super.onStateChange(state); + } + } + + @Override + protected void onBoundsChange(Rect bounds) { + super.onBoundsChange(bounds); + + mBounds.set(bounds); + + updateShaderMatrix(); + } + + @Override + public int getIntrinsicWidth() { + return mBitmapWidth; + } + + @Override + public int getIntrinsicHeight() { + return mBitmapHeight; + } + + public float getCornerRadius() { + return mCornerRadius; + } + + public RoundedDrawable setCornerRadius(float radius) { + mCornerRadius = radius; + return this; + } + + public float getBorderWidth() { + return mBorderWidth; + } + + public RoundedDrawable setBorderWidth(int width) { + mBorderWidth = width; + mBorderPaint.setStrokeWidth(mBorderWidth); + return this; + } + + public int getBorderColor() { + return mBorderColor.getDefaultColor(); + } + + public RoundedDrawable setBorderColor(int color) { + return setBorderColors(ColorStateList.valueOf(color)); + } + + public ColorStateList getBorderColors() { + return mBorderColor; + } + + public RoundedDrawable setBorderColors(ColorStateList colors) { + mBorderColor = colors != null ? colors : ColorStateList.valueOf(0); + mBorderPaint.setColor(mBorderColor.getColorForState(getState(), DEFAULT_BORDER_COLOR)); + return this; + } + + public boolean isOval() { + return mOval; + } + + public RoundedDrawable setOval(boolean oval) { + mOval = oval; + return this; + } + + public ScaleType getScaleType() { + return mScaleType; + } + + public RoundedDrawable setScaleType(ScaleType scaleType) { + if (scaleType == null) { + scaleType = ScaleType.FIT_CENTER; + } + if (mScaleType != scaleType) { + mScaleType = scaleType; + updateShaderMatrix(); + } + return this; + } + + public Bitmap toBitmap() { + return drawableToBitmap(this); + } +} diff --git a/libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/RoundedImageView.java b/libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/RoundedImageView.java new file mode 100755 index 0000000000..a74e174dbd --- /dev/null +++ b/libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/RoundedImageView.java @@ -0,0 +1,323 @@ +package com.lightgame.view.imageview; + +import android.content.Context; +import android.content.res.ColorStateList; +import android.content.res.Resources; +import android.content.res.TypedArray; +import android.graphics.Bitmap; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.LayerDrawable; +import android.net.Uri; +import android.support.v7.widget.AppCompatImageView; +import android.util.AttributeSet; +import android.util.Log; + +import com.lightgame.R; + + +@SuppressWarnings("UnusedDeclaration") +public class RoundedImageView extends AppCompatImageView { + + public static final String TAG = "RoundedImageView"; + public static final int DEFAULT_RADIUS = 0; + private int mCornerRadius = DEFAULT_RADIUS; + public static final int DEFAULT_BORDER_WIDTH = 0; + private int mBorderWidth = DEFAULT_BORDER_WIDTH; + private static final ScaleType[] SCALE_TYPES = { + ScaleType.MATRIX, + ScaleType.FIT_XY, + ScaleType.FIT_START, + ScaleType.FIT_CENTER, + ScaleType.FIT_END, + ScaleType.CENTER, + ScaleType.CENTER_CROP, + ScaleType.CENTER_INSIDE + }; + private ColorStateList mBorderColor = + ColorStateList.valueOf(RoundedDrawable.DEFAULT_BORDER_COLOR); + private boolean mOval = false; + private boolean mRoundBackground = false; + + private int mResource; + private Drawable mDrawable; + private Drawable mBackgroundDrawable; + + private ScaleType mScaleType; + + public RoundedImageView(Context context) { + super(context); + } + + public RoundedImageView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public RoundedImageView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RoundedImageView, defStyle, 0); + + int index = a.getInt(R.styleable.RoundedImageView_android_scaleType, -1); + if (index >= 0) { + setScaleType(SCALE_TYPES[index]); + } else { + // default scaletype to FIT_CENTER + setScaleType(ScaleType.FIT_CENTER); + } + + mCornerRadius = a.getDimensionPixelSize(R.styleable.RoundedImageView_corner_radius, -1); + mBorderWidth = a.getDimensionPixelSize(R.styleable.RoundedImageView_border_width, -1); + + // don't allow negative values for radius and border + if (mCornerRadius < 0) { + mCornerRadius = DEFAULT_RADIUS; + } + if (mBorderWidth < 0) { + mBorderWidth = DEFAULT_BORDER_WIDTH; + } + + mBorderColor = a.getColorStateList(R.styleable.RoundedImageView_border_color); + if (mBorderColor == null) { + mBorderColor = ColorStateList.valueOf(RoundedDrawable.DEFAULT_BORDER_COLOR); + } + + mRoundBackground = a.getBoolean(R.styleable.RoundedImageView_round_background, false); + mOval = a.getBoolean(R.styleable.RoundedImageView_is_oval, false); + + updateDrawableAttrs(); + updateBackgroundDrawableAttrs(); + + a.recycle(); + } + + @Override + public void setImageResource(int resId) { + if (mResource != resId) { + mResource = resId; + mDrawable = resolveResource(); + updateDrawableAttrs(); + super.setImageDrawable(mDrawable); + } + } + + @Override + public void setImageURI(Uri uri) { + super.setImageURI(uri); + setImageDrawable(getDrawable()); + } @Override + protected void drawableStateChanged() { + super.drawableStateChanged(); + invalidate(); + } + + @Override + public void setImageDrawable(Drawable drawable) { + mResource = 0; + mDrawable = RoundedDrawable.fromDrawable(drawable); + updateDrawableAttrs(); + super.setImageDrawable(mDrawable); + } + + @Override + public void setImageBitmap(Bitmap bm) { + mResource = 0; + mDrawable = RoundedDrawable.fromBitmap(bm); + updateDrawableAttrs(); + super.setImageDrawable(mDrawable); + } /** + * Return the current scale type in use by this ImageView. + * + * @attr ref android.R.styleable#ImageView_scaleType + * @see ScaleType + */ + @Override + public ScaleType getScaleType() { + return mScaleType; + } + + private Drawable resolveResource() { + Resources rsrc = getResources(); + if (rsrc == null) { + return null; + } + + Drawable d = null; + + if (mResource != 0) { + try { + d = rsrc.getDrawable(mResource); + } catch (Exception e) { + Log.w(TAG, "Unable to find resource: " + mResource, e); + // Don't try again. + mResource = 0; + } + } + return RoundedDrawable.fromDrawable(d); + } + + @Override + public void setBackground(Drawable background) { + setBackgroundDrawable(background); + } /** + * Controls how the image should be resized or moved to match the size + * of this ImageView. + * + * @param scaleType The desired scaling mode. + * @attr ref android.R.styleable#ImageView_scaleType + */ + @Override + public void setScaleType(ScaleType scaleType) { + if (scaleType == null) { + throw new NullPointerException(); + } + + if (mScaleType != scaleType) { + mScaleType = scaleType; + + switch (scaleType) { + case CENTER: + case CENTER_CROP: + case CENTER_INSIDE: + case FIT_CENTER: + case FIT_START: + case FIT_END: + case FIT_XY: + super.setScaleType(ScaleType.FIT_XY); + break; + default: + super.setScaleType(scaleType); + break; + } + + updateDrawableAttrs(); + updateBackgroundDrawableAttrs(); + invalidate(); + } + } + + @Override + @Deprecated + public void setBackgroundDrawable(Drawable background) { + mBackgroundDrawable = RoundedDrawable.fromDrawable(background); + updateBackgroundDrawableAttrs(); + super.setBackgroundDrawable(mBackgroundDrawable); + } + + private void updateDrawableAttrs() { + updateAttrs(mDrawable, false); + } + + private void updateBackgroundDrawableAttrs() { + updateAttrs(mBackgroundDrawable, true); + } + + private void updateAttrs(Drawable drawable, boolean background) { + if (drawable == null) { + return; + } + + if (drawable instanceof RoundedDrawable) { + ((RoundedDrawable) drawable) + .setScaleType(mScaleType) + .setCornerRadius(background && !mRoundBackground ? 0 : mCornerRadius) + .setBorderWidth(background && !mRoundBackground ? 0 : mBorderWidth) + .setBorderColors(mBorderColor) + .setOval(mOval); + } else if (drawable instanceof LayerDrawable) { + // loop through layers to and set drawable attrs + LayerDrawable ld = ((LayerDrawable) drawable); + int layers = ld.getNumberOfLayers(); + for (int i = 0; i < layers; i++) { + updateAttrs(ld.getDrawable(i), background); + } + } + } + + public int getCornerRadius() { + return mCornerRadius; + } + + public void setCornerRadius(int radius) { + if (mCornerRadius == radius) { + return; + } + + mCornerRadius = radius; + updateDrawableAttrs(); + updateBackgroundDrawableAttrs(); + } + + public int getBorderWidth() { + return mBorderWidth; + } + + public void setBorderWidth(int width) { + if (mBorderWidth == width) { + return; + } + + mBorderWidth = width; + updateDrawableAttrs(); + updateBackgroundDrawableAttrs(); + invalidate(); + } + + public int getBorderColor() { + return mBorderColor.getDefaultColor(); + } + + public void setBorderColor(int color) { + setBorderColors(ColorStateList.valueOf(color)); + } + + public ColorStateList getBorderColors() { + return mBorderColor; + } + + public void setBorderColors(ColorStateList colors) { + if (mBorderColor.equals(colors)) { + return; + } + + mBorderColor = + (colors != null) ? colors : ColorStateList.valueOf(RoundedDrawable.DEFAULT_BORDER_COLOR); + updateDrawableAttrs(); + updateBackgroundDrawableAttrs(); + if (mBorderWidth > 0) { + invalidate(); + } + } + + public boolean isOval() { + return mOval; + } + + public void setOval(boolean oval) { + mOval = oval; + updateDrawableAttrs(); + updateBackgroundDrawableAttrs(); + invalidate(); + } + + public boolean isRoundBackground() { + return mRoundBackground; + } + + public void setRoundBackground(boolean roundBackground) { + if (mRoundBackground == roundBackground) { + return; + } + + mRoundBackground = roundBackground; + updateBackgroundDrawableAttrs(); + invalidate(); + } + + + + + + + + +} diff --git a/libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/RoundedTransformationBuilder.java b/libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/RoundedTransformationBuilder.java new file mode 100644 index 0000000000..efabe2c00c --- /dev/null +++ b/libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/RoundedTransformationBuilder.java @@ -0,0 +1,121 @@ +/* +* Copyright (C) 2015 Vincent Mi +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +*/ + +package com.lightgame.view.imageview; + +import android.content.res.ColorStateList; +import android.content.res.Resources; +import android.util.DisplayMetrics; +import android.util.TypedValue; +import android.widget.ImageView; + +public final class RoundedTransformationBuilder { + + //private final Resources mResources; + private final DisplayMetrics mDisplayMetrics; + + private float mCornerRadius = 0; + private boolean mOval = false; + private float mBorderWidth = 0; + private ColorStateList mBorderColor = + ColorStateList.valueOf(RoundedDrawable.DEFAULT_BORDER_COLOR); + private ImageView.ScaleType mScaleType = ImageView.ScaleType.FIT_CENTER; + + public RoundedTransformationBuilder() { + mDisplayMetrics = Resources.getSystem().getDisplayMetrics(); + } + + public RoundedTransformationBuilder scaleType(ImageView.ScaleType scaleType) { + mScaleType = scaleType; + return this; + } + + /** + * set corner radius in px + */ + public RoundedTransformationBuilder cornerRadius(float radiusPx) { + mCornerRadius = radiusPx; + return this; + } + + /** + * set corner radius in dip + */ + public RoundedTransformationBuilder cornerRadiusDp(float radiusDp) { + mCornerRadius = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, radiusDp, mDisplayMetrics); + return this; + } + + /** + * set border width in px + */ + public RoundedTransformationBuilder borderWidth(float widthPx) { + mBorderWidth = widthPx; + return this; + } + + /** + * set border width in dip + */ + public RoundedTransformationBuilder borderWidthDp(float widthDp) { + mBorderWidth = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, widthDp, mDisplayMetrics); + return this; + } + + + /** + * set border color + */ + public RoundedTransformationBuilder borderColor(int color) { + mBorderColor = ColorStateList.valueOf(color); + return this; + } + + public RoundedTransformationBuilder borderColor(ColorStateList colors) { + mBorderColor = colors; + return this; + } + + public RoundedTransformationBuilder oval(boolean oval) { + mOval = oval; + return this; + } + +// public Transformation build() { +// return new Transformation() { +// @Override public Bitmap transform(Bitmap source) { +// Bitmap transformed = RoundedDrawable.fromBitmap(source) +// .setScaleType(mScaleType) +// .setCornerRadius(mCornerRadius) +// .setBorderWidth(mBorderWidth) +// .setBorderColor(mBorderColor) +// .setOval(mOval) +// .toBitmap(); +// if (!source.equals(transformed)) { +// source.recycle(); +// } +// return transformed; +// } +// +// @Override public String key() { +// return "r:" + mCornerRadius +// + "b:" + mBorderWidth +// + "c:" + mBorderColor +// + "o:" + mOval; +// } +// }; +// } +} \ No newline at end of file diff --git a/libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/ScaleImageView.java b/libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/ScaleImageView.java new file mode 100755 index 0000000000..4bdd7b2e47 --- /dev/null +++ b/libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/ScaleImageView.java @@ -0,0 +1,47 @@ +package com.lightgame.view.imageview; + +import android.content.Context; +import android.content.res.TypedArray; +import android.support.v7.widget.AppCompatImageView; +import android.util.AttributeSet; + +import com.lightgame.R; + + +/** + * 按照百分比来保持View的大小,可选以width或者height做参考系 + * + * @author CsHeng + * @date 2013-3-14 + */ +public class ScaleImageView extends AppCompatImageView { + + private boolean mMeasureByHeight = false; // default width + + private float mFraction = 1f;// default square + + public ScaleImageView(Context context, AttributeSet set) { + super(context, set); + TypedArray a = context.obtainStyledAttributes(set, R.styleable.ScaleView); + int enumV = a.getInt(R.styleable.ScaleView_measureBy, 0); + mFraction = a.getFloat(R.styleable.ScaleView_fractionValue, mFraction); + if (enumV != 0) { + mMeasureByHeight = true; + } + a.recycle(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + if (mMeasureByHeight) { + width = (int) (height * mFraction); + } else { + height = (int) (width * mFraction); + } + setMeasuredDimension(width, height); + + } + +} diff --git a/libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/ScaleRoundedImageView.java b/libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/ScaleRoundedImageView.java new file mode 100755 index 0000000000..dc7dc1a0b3 --- /dev/null +++ b/libraries/LGLibrary/src/main/java/com/lightgame/view/imageview/ScaleRoundedImageView.java @@ -0,0 +1,47 @@ +package com.lightgame.view.imageview; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; + +import com.lightgame.R; + + +/** + * Created with IntelliJ IDEA. + * User: CsHeng + * Date: 13-3-26 + * Time: 下午12:54 + * To change this template use File | Settings | File Templates. + */ +public class ScaleRoundedImageView extends RoundedImageView { + + private boolean mMeasureByHeight = false; // default width + + private float mFraction = 1f;// default square + + public ScaleRoundedImageView(Context context, AttributeSet set) { + super(context, set); + TypedArray a = context.obtainStyledAttributes(set, R.styleable.ScaleView); + int enumV = a.getInt(R.styleable.ScaleView_measureBy, 0); + mFraction = a.getFloat(R.styleable.ScaleView_fractionValue, mFraction); + if (enumV != 0) { + mMeasureByHeight = true; + } + a.recycle(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + if (mMeasureByHeight) { + setMeasuredDimension((int) (height * mFraction), height); + } else { + setMeasuredDimension(width, (int) (width * mFraction)); + } + } + +} + + diff --git a/libraries/LGLibrary/src/main/java/com/lightgame/view/scale/ScaleFrameLayout.java b/libraries/LGLibrary/src/main/java/com/lightgame/view/scale/ScaleFrameLayout.java new file mode 100755 index 0000000000..aec369e112 --- /dev/null +++ b/libraries/LGLibrary/src/main/java/com/lightgame/view/scale/ScaleFrameLayout.java @@ -0,0 +1,50 @@ +package com.lightgame.view.scale; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.widget.FrameLayout; + +import com.lightgame.R; + + +/** + * Created with IntelliJ IDEA. + * User: CsHeng + * Date: 13-3-15 + * Time: 下午4:38 + * To change this template use File | Settings | File Templates. + */ +public class ScaleFrameLayout extends FrameLayout { + + private boolean mMeasureByHeight = false; // default width + private float mFraction = 1f;// default square + + public ScaleFrameLayout(Context context) { + super(context); + } + + public ScaleFrameLayout(Context context, AttributeSet set) { + super(context, set); + TypedArray a = context.obtainStyledAttributes(set, R.styleable.ScaleView); + int enumV = a.getInt(R.styleable.ScaleView_measureBy, 0); + mFraction = a.getFloat(R.styleable.ScaleView_fractionValue, mFraction); + if (enumV != 0) { + mMeasureByHeight = true; + } + a.recycle(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + if (mMeasureByHeight) { + setMeasuredDimension((int) (height * mFraction), height); + } else { + setMeasuredDimension(width, (int) (width * mFraction)); + } + } + +} diff --git a/libraries/LGLibrary/src/main/java/com/lightgame/view/scale/ScaleLinearLayout.java b/libraries/LGLibrary/src/main/java/com/lightgame/view/scale/ScaleLinearLayout.java new file mode 100755 index 0000000000..dd4ef8be93 --- /dev/null +++ b/libraries/LGLibrary/src/main/java/com/lightgame/view/scale/ScaleLinearLayout.java @@ -0,0 +1,51 @@ +package com.lightgame.view.scale; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.widget.LinearLayout; + +import com.lightgame.R; + + +/** + * Created with IntelliJ IDEA. + * User: CsHeng + * Date: 13-3-15 + * Time: 下午12:31 + * To change this template use File | Settings | File Templates. + */ +public class ScaleLinearLayout extends LinearLayout { + + private boolean mMeasureByHeight = false; // default width + private float mFraction = 1f;// default square + + public ScaleLinearLayout(Context context) { + super(context); + } + + public ScaleLinearLayout(Context context, AttributeSet set) { + super(context, set); + TypedArray a = context.obtainStyledAttributes(set, R.styleable.ScaleView); + int enumV = a.getInt(R.styleable.ScaleView_measureBy, 0); + mFraction = a.getFloat(R.styleable.ScaleView_fractionValue, mFraction); + if (enumV != 0) { + mMeasureByHeight = true; + } + a.recycle(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + if (mMeasureByHeight) { + setMeasuredDimension((int) (height * mFraction), height); + } else { + setMeasuredDimension(width, (int) (width * mFraction)); + } + } + + +} diff --git a/libraries/LGLibrary/src/main/java/com/lightgame/view/scale/ScaleRelativeLayout.java b/libraries/LGLibrary/src/main/java/com/lightgame/view/scale/ScaleRelativeLayout.java new file mode 100755 index 0000000000..8e2d29cb3a --- /dev/null +++ b/libraries/LGLibrary/src/main/java/com/lightgame/view/scale/ScaleRelativeLayout.java @@ -0,0 +1,50 @@ +package com.lightgame.view.scale; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.widget.RelativeLayout; + +import com.lightgame.R; + + +/** + * Created with IntelliJ IDEA. + * User: CsHeng + * Date: 13-3-15 + * Time: 下午4:38 + * To change this template use File | Settings | File Templates. + */ +public class ScaleRelativeLayout extends RelativeLayout { + + private boolean mMeasureByHeight = false; // default width + private float mFraction = 1f;// default square + + public ScaleRelativeLayout(Context context) { + super(context); + } + + public ScaleRelativeLayout(Context context, AttributeSet set) { + super(context, set); + TypedArray a = context.obtainStyledAttributes(set, R.styleable.ScaleView); + int enumV = a.getInt(R.styleable.ScaleView_measureBy, 0); + mFraction = a.getFloat(R.styleable.ScaleView_fractionValue, mFraction); + if (enumV != 0) { + mMeasureByHeight = true; + } + a.recycle(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + if (mMeasureByHeight) { + setMeasuredDimension((int) (height * mFraction), height); + } else { + setMeasuredDimension(width, (int) (width * mFraction)); + } + } + +} diff --git a/libraries/LGLibrary/src/main/java/com/lightgame/view/scale/ScaleViewPager.java b/libraries/LGLibrary/src/main/java/com/lightgame/view/scale/ScaleViewPager.java new file mode 100644 index 0000000000..e76d014a47 --- /dev/null +++ b/libraries/LGLibrary/src/main/java/com/lightgame/view/scale/ScaleViewPager.java @@ -0,0 +1,51 @@ +package com.lightgame.view.scale; + +import android.content.Context; +import android.content.res.TypedArray; +import android.support.v4.view.ViewPager; +import android.util.AttributeSet; + +import com.lightgame.R; + + +/** + * Created with IntelliJ IDEA. + * User: CsHeng + * Date: 13-3-15 + * Time: 下午4:38 + * To change this template use File | Settings | File Templates. + */ +public class ScaleViewPager extends ViewPager { + + private boolean mMeasureByHeight = false; // default width + private float mScale = 1f;// default square + + public ScaleViewPager(Context context) { + super(context); + } + + public ScaleViewPager(Context context, AttributeSet set) { + super(context, set); + TypedArray a = context.obtainStyledAttributes(set, R.styleable.ScaleView); + int enumV = a.getInt(R.styleable.ScaleView_measureBy, 0); + mScale = a.getFloat(R.styleable.ScaleView_fractionValue, mScale); + if (enumV != 0) { + mMeasureByHeight = true; + } + a.recycle(); + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + int width = MeasureSpec.getSize(widthMeasureSpec); + int height = MeasureSpec.getSize(heightMeasureSpec); + if (mMeasureByHeight) { + setMeasuredDimension((int) (height * mScale), height); + } else { + setMeasuredDimension(width, (int) (width * mScale)); + } + + } + +} diff --git a/libraries/LGLibrary/src/main/res/values/lightgame_attrs.xml b/libraries/LGLibrary/src/main/res/values/lightgame_attrs.xml new file mode 100644 index 0000000000..ae0ab99f67 --- /dev/null +++ b/libraries/LGLibrary/src/main/res/values/lightgame_attrs.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libraries/LGLibrary/src/main/res/values/lightgame_ids.xml b/libraries/LGLibrary/src/main/res/values/lightgame_ids.xml new file mode 100644 index 0000000000..430479cb2c --- /dev/null +++ b/libraries/LGLibrary/src/main/res/values/lightgame_ids.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 7c18cde3e4..db9e7de06e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,4 +1,5 @@ include ':app' +include ':libraries:LGLibrary' include ':libraries:MiPush' include ':libraries:MTA' include ':libraries:QQShare'