package com.mjj.changetheme.activity; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.content.SharedPreferences; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.TypedValue; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import com.mjj.changetheme.R; import com.mjj.changetheme.app.MyAppliction; import com.mjj.changetheme.data.Theme; import com.mjj.changetheme.fragment.MainFragment; public class MainActivity extends AppCompatActivity implements MainFragment.OnRecyclerViewCreated { private ViewGroup mViewGroup; private ImageView mImageView; private MainFragment mMainFragment; private final long ANIMTION_TIME = 1000; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTheme(MyAppliction.getThemeResources()); setContentView(R.layout.activity_main); addFragment(0, 0); initView(); } @Override protected void onPause() { super.onPause(); } @Override protected void onDestroy() { super.onDestroy(); save(); } /** * 主题选择的本地存储 */ private void save() { SharedPreferences sharedPreferences = getSharedPreferences("theme",MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putInt("theme", MyAppliction.getThemeValue()); editor.commit(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id){ case R.id.action_changetheme: changeTheme(); return true; default: return super.onOptionsItemSelected(item); } } private void initView() { mViewGroup = (ViewGroup) findViewById(R.id.layout_fragment); mImageView = (ImageView) findViewById(R.id.imageview); } /** * 添加Fragment,如果已存在Fragment就先移除在添加 * @param position * @param scroll */ private void addFragment(int position,int scroll) { FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); if (mMainFragment != null){ fragmentTransaction.remove(mMainFragment); } mMainFragment = new MainFragment(); Bundle bundle = new Bundle(); bundle.putInt("position",position); bundle.putInt("scroll",scroll); mMainFragment.setArguments(bundle); fragmentTransaction.add(R.id.layout_fragment, mMainFragment); fragmentTransaction.commit(); } /** * 改变主题 */ private void changeTheme(){ setDrawableCahe(); setTheme(); getState(); } /** * 获取当前fragment状态,在Demo中简单演示了RecyclerView的位置恢复 */ public void getState() { RecyclerView recyclerView = mMainFragment.getRecyclerView(); recyclerView.stopScroll(); if (recyclerView.getLayoutManager() instanceof LinearLayoutManager){ LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); int position = layoutManager.findFirstVisibleItemPosition(); int scroll = recyclerView.getChildAt(0).getTop(); addFragment(position,scroll); } } /** * 获取布局的DrawableCahe给ImageView覆盖Fragment */ private void setDrawableCahe() { //设置false清除缓存 mViewGroup.setDrawingCacheEnabled(false); //设置true之后可以获取Bitmap mViewGroup.setDrawingCacheEnabled(true); mImageView.setImageBitmap(mViewGroup.getDrawingCache()); mImageView.setAlpha(1f); mImageView.setVisibility(View.VISIBLE); } /** * 设置主题 */ private void setTheme() { TypedValue typedValue = new TypedValue(); getTheme().resolveAttribute(R.attr.myTheme, typedValue, true); switch (typedValue.data){ case Theme.DAYTHEME: MyAppliction.setThemeValue(Theme.NIGHTTHEME); setTheme(Theme.RESOURCES_NIGHTTHEME); break; case Theme.NIGHTTHEME: MyAppliction.setThemeValue(Theme.DAYTHEME); setTheme(Theme.RESOURCES_DAYTHEME); break; } } /** * Fragment状态恢复完毕的监听回调 */ @Override public void recyclerViewCreated() { startAnimation(mImageView); } /** * ImageView的动画 * @param view */ private void startAnimation(final View view) { ValueAnimator animator = ValueAnimator.ofFloat(1f).setDuration(ANIMTION_TIME); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float n = (float) animation.getAnimatedValue(); view.setAlpha(1f - n); } }); animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); mImageView.setVisibility(View.INVISIBLE); } }); animator.start(); } }