package hearsilent.amazingavatar; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.support.design.widget.AppBarLayout; import android.support.v4.widget.Space; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.DividerItemDecoration; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.nostra13.universalimageloader.core.ImageLoader; import java.util.Locale; import de.hdodenhof.circleimageview.CircleImageView; import hearsilent.amazingavatar.callbacks.AvatarCallback; import hearsilent.amazingavatar.libs.AppBarStateChangeListener; import hearsilent.amazingavatar.libs.NetworkHelper; import hearsilent.amazingavatar.libs.Utils; import hearsilent.amazingavatar.models.AvatarModel; import static hearsilent.amazingavatar.R.id.recyclerView; public class MainActivity extends AppCompatActivity { private final static float EXPAND_AVATAR_SIZE_DP = 80f; private final static float COLLAPSED_AVATAR_SIZE_DP = 32f; private AppBarLayout mAppBarLayout; private CircleImageView mAvatarImageView; private TextView mToolbarTextView, mTitleTextView; private Space mSpace; private Toolbar mToolBar; private RecyclerView mRecyclerView; private AppBarStateChangeListener mAppBarStateChangeListener; private int[] mAvatarPoint = new int[2], mSpacePoint = new int[2], mToolbarTextPoint = new int[2], mTitleTextViewPoint = new int[2]; private float mTitleTextSize; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViews(); setUpViews(); fetchAvatar(); } private void findViews() { mAppBarLayout = (AppBarLayout) findViewById(R.id.app_bar); mAvatarImageView = (CircleImageView) findViewById(R.id.imageView_avatar); mToolbarTextView = (TextView) findViewById(R.id.toolbar_title); mTitleTextView = (TextView) findViewById(R.id.textView_title); mSpace = (Space) findViewById(R.id.space); mToolBar = (Toolbar) findViewById(R.id.toolbar); mRecyclerView = (RecyclerView) findViewById(recyclerView); } private void setUpViews() { mTitleTextSize = mTitleTextView.getTextSize(); setUpToolbar(); setUpRecyclerView(); setUpAmazingAvatar(); } private void setUpRecyclerView() { mRecyclerView.setHasFixedSize(true); mRecyclerView.setItemAnimator(new DefaultItemAnimator()); mRecyclerView .addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL)); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mRecyclerView.setAdapter(new Adapter()); } private void setUpToolbar() { setSupportActionBar(mToolBar); if (getSupportActionBar() != null) { getSupportActionBar().setDisplayShowTitleEnabled(false); getSupportActionBar().setDisplayHomeAsUpEnabled(true); } } private void setUpAmazingAvatar() { mAppBarStateChangeListener = new AppBarStateChangeListener() { @Override public void onStateChanged(AppBarLayout appBarLayout, AppBarStateChangeListener.State state) { } @Override public void onOffsetChanged(AppBarStateChangeListener.State state, float offset) { translationView(offset); } }; mAppBarLayout.addOnOffsetChangedListener(mAppBarStateChangeListener); } private void translationView(float offset) { float xOffset = -(mAvatarPoint[0] - mSpacePoint[0]) * offset; float yOffset = -(mAvatarPoint[1] - mSpacePoint[1]) * offset; float xTitleOffset = -(mTitleTextViewPoint[0] - mToolbarTextPoint[0]) * offset; float yTitleOffset = -(mTitleTextViewPoint[1] - mToolbarTextPoint[1]) * offset; int newSize = Utils.convertDpToPixelSize( EXPAND_AVATAR_SIZE_DP - (EXPAND_AVATAR_SIZE_DP - COLLAPSED_AVATAR_SIZE_DP) * offset, MainActivity .this); float newTextSize = mTitleTextSize - (mTitleTextSize - mToolbarTextView.getTextSize()) * offset; mAvatarImageView.getLayoutParams().width = newSize; mAvatarImageView.getLayoutParams().height = newSize; mAvatarImageView.setTranslationX(xOffset); mAvatarImageView.setTranslationY(yOffset); mTitleTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, newTextSize); mTitleTextView.setTranslationX(xTitleOffset); mTitleTextView.setTranslationY(yTitleOffset); } /** * Avatar from TinyFaces (https://github.com/maximedegreve/TinyFaces) */ private void fetchAvatar() { NetworkHelper.getAvatar(new AvatarCallback() { @Override public void onSuccess(AvatarModel avatarModel) { super.onSuccess(avatarModel); if (isFinishing()) { return; } ImageLoader.getInstance().displayImage(avatarModel.url, mAvatarImageView); mTitleTextView.setText( String.format(Locale.getDefault(), "%s %s", avatarModel.firstName, avatarModel.lastName)); new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { resetPoints(); } }); } }); } private void clearAnim() { mAvatarImageView.setTranslationX(0); mAvatarImageView.setTranslationY(0); mTitleTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTitleTextSize); mTitleTextView.setTranslationX(0); mTitleTextView.setTranslationY(0); } private void resetPoints() { clearAnim(); int avatarSize = Utils.convertDpToPixelSize(EXPAND_AVATAR_SIZE_DP, this); mAvatarImageView.getLocationOnScreen(mAvatarPoint); mAvatarPoint[0] -= (avatarSize - mAvatarImageView.getWidth()) / 2; mSpace.getLocationOnScreen(mSpacePoint); mToolbarTextView.getLocationOnScreen(mToolbarTextPoint); mToolbarTextPoint[0] += Utils.convertDpToPixelSize(16, this); mTitleTextView.post(new Runnable() { @Override public void run() { mTitleTextView.getLocationOnScreen(mTitleTextViewPoint); translationView(mAppBarStateChangeListener.getCurrentOffset()); } }); } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (!hasFocus) { return; } resetPoints(); } private class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private class DemoViewHolder extends RecyclerView.ViewHolder { private TextView textView; private DemoViewHolder(View view) { super(view); textView = (TextView) view.findViewById(R.id.textView); } } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new DemoViewHolder(LayoutInflater.from(parent.getContext()) .inflate(R.layout.item_demo, parent, false)); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { ((DemoViewHolder) holder).textView .setText(String.format(Locale.getDefault(), "HearSilent %d", position)); } @Override public int getItemCount() { return 100; } } }