package io.hefuyi.zhihudaily.ui.fragment; import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.bumptech.glide.Glide; import com.bumptech.glide.load.resource.drawable.GlideDrawable; import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.target.Target; import javax.inject.Inject; import butterknife.Bind; import butterknife.ButterKnife; import io.hefuyi.zhihudaily.DailyApplication; import io.hefuyi.zhihudaily.R; import io.hefuyi.zhihudaily.animation.AnimationEndListener; import io.hefuyi.zhihudaily.injector.component.ApplicationComponent; import io.hefuyi.zhihudaily.injector.component.DaggerSplashComponent; import io.hefuyi.zhihudaily.injector.component.SplashComponent; import io.hefuyi.zhihudaily.injector.module.ActivityModule; import io.hefuyi.zhihudaily.injector.module.SplashModule; import io.hefuyi.zhihudaily.mvp.contract.SplashContract; import io.hefuyi.zhihudaily.mvp.model.StartImage; import io.hefuyi.zhihudaily.ui.activity.GuiderActivity; import io.hefuyi.zhihudaily.util.DensityUtil; import io.hefuyi.zhihudaily.util.L; import io.hefuyi.zhihudaily.util.UIUtils; /** * A simple {@link Fragment} subclass. */ public class SplashFragment extends Fragment implements SplashContract.View{ public static final String TAG = SplashFragment.class.getSimpleName(); @Inject SplashContract.Presenter splashPresenter; @Bind(R.id.tvAuthor) TextView tvAuthor; @Bind(R.id.ivLogo) ImageView ivLogo; @Bind(R.id.splash) ImageView ivSplash; private Animation mIvSplashAnim; private int mWidth; private int mHeight; /*初始化相关*/ @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); injectDependencies(); splashPresenter.attachView(this); mIvSplashAnim = AnimationUtils.loadAnimation(getActivity(), R.anim.splash); //计算屏幕宽度和高度 //if api>=19 use themes in values-v19 has a full screen splash mWidth = DensityUtil.getScreenWidth(getActivity()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { mHeight = DensityUtil.getScreenHeightWithDecorations(getActivity()); } else { mHeight = DensityUtil.getScreenHeight(getActivity()); } L.i(TAG, "screen height = " + mHeight); } private void injectDependencies() { ApplicationComponent applicationComponent = ((DailyApplication) getActivity().getApplication()).getApplicationComponent(); SplashComponent splashComponent = DaggerSplashComponent.builder() .applicationComponent(applicationComponent) .activityModule(new ActivityModule(getActivity())) .splashModule(new SplashModule()) .build(); splashComponent.inject(this); } /*初始化相关*/ /*view接口*/ @Override public void showBackgroundImage(final StartImage startImage) { Runnable runnable = new Runnable() { @Override public void run() { tvAuthor.setText(startImage.getText()); Glide.with(getActivity()) .load(startImage.getImg()) .error(R.drawable.bg_splash) .listener(new RequestListener<String, GlideDrawable>() { @Override public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) { return false; } @Override public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) { ivSplash.post(new Runnable() { @Override public void run() { ivSplash.startAnimation(mIvSplashAnim); } }); return false; } }) .centerCrop() .into(ivSplash); } }; getActivity().runOnUiThread(runnable); } @Override public void showError() { Runnable runnable = new Runnable() { @Override public void run() { Toast.makeText(getActivity(), "refresh error", Toast.LENGTH_SHORT).show(); } }; getActivity().runOnUiThread(runnable); } /*view接口*/ /*普通逻辑*/ /*普通逻辑*/ /*生命周期回调*/ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View root = inflater.inflate(R.layout.fragment_splash, container, false); ButterKnife.bind(this, root); return root; } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); //if api>=19 use themes in values-v19 has a full screen splash. //so we need relayout the tvAuthor and ivLogo by set bigger marginButtom /*根据透明导航栏做调整*/ int navigationBarHeight = UIUtils.getStatusBarHeight(getActivity()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { int tvMarginBottom = navigationBarHeight + DensityUtil.dip2px(getActivity(), 8); int logoMarginBottom = navigationBarHeight + DensityUtil.dip2px(getActivity(), 48); ((RelativeLayout.LayoutParams) tvAuthor.getLayoutParams()).setMargins(0, 0, 0, tvMarginBottom); ((RelativeLayout.LayoutParams) ivLogo.getLayoutParams()).setMargins(0, 0, 0, logoMarginBottom); tvAuthor.requestLayout(); ivLogo.requestLayout(); } } @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); //设置动画监听器,加载启动图片 mIvSplashAnim.setAnimationListener(animationListener); splashPresenter.refresh(mWidth,mHeight); } /*生命周期回调*/ private final Animation.AnimationListener animationListener=new AnimationEndListener(){ @Override public void onAnimationEnd(Animation animation) { super.onAnimationEnd(animation); //启动图片消失 ivSplash.setVisibility(View.GONE); ((GuiderActivity)getActivity()).intentToMainActivity(); } }; }