From 22a196214e43e1b7d55e3e8ff80608a8537e69de Mon Sep 17 00:00:00 2001 From: kenumir Date: Wed, 4 Oct 2017 20:59:54 +0200 Subject: [PATCH] Icon animation transition (first try). --- .../activity/ApplicationDetailsActivity.java | 10 +++++++ .../fragment/ApplicationsFragment.java | 25 ++++++++++++++---- .../java/com/wt/apkinfo/util/ViewUtil.java | 26 +++++++++++++++++++ .../main/res/drawable/theme_round_icon.xml | 8 ++++++ app/src/main/res/values-v21/styles.xml | 7 +++++ app/src/main/res/values/styles.xml | 5 ++-- 6 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 app/src/main/java/com/wt/apkinfo/util/ViewUtil.java create mode 100644 app/src/main/res/drawable/theme_round_icon.xml create mode 100644 app/src/main/res/values-v21/styles.xml diff --git a/app/src/main/java/com/wt/apkinfo/activity/ApplicationDetailsActivity.java b/app/src/main/java/com/wt/apkinfo/activity/ApplicationDetailsActivity.java index 1b690f2..1f7321b 100644 --- a/app/src/main/java/com/wt/apkinfo/activity/ApplicationDetailsActivity.java +++ b/app/src/main/java/com/wt/apkinfo/activity/ApplicationDetailsActivity.java @@ -8,6 +8,7 @@ import android.content.Intent; import android.content.res.Resources; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; @@ -31,6 +32,7 @@ import com.wt.apkinfo.entity.ApplicationDetailsEntity; import com.wt.apkinfo.entity.ComponentInfo; import com.wt.apkinfo.util.DateTime; +import com.wt.apkinfo.util.ViewUtil; import com.wt.apkinfo.viewmodel.ApplicationDetailsViewModel; import java.io.File; @@ -108,12 +110,20 @@ public boolean onMenuItemClick(MenuItem menuItem) { } } }); + toolbar.setNavigationIcon(R.drawable.theme_round_icon); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { finish(); } }); + toolbar.setNavigationContentDescription(appId); + if (Build.VERSION.SDK_INT >= 21) { + View navIcon = ViewUtil.findViewWithContentDescription(toolbar, appId); + if (navIcon != null) { + navIcon.setTransitionName("transition_" + appId); + } + } mAppInfoAdapter = new AppInfoAdapter(getResources(), new OnHeaderClick() { @Override diff --git a/app/src/main/java/com/wt/apkinfo/fragment/ApplicationsFragment.java b/app/src/main/java/com/wt/apkinfo/fragment/ApplicationsFragment.java index 71c6014..74e28be 100644 --- a/app/src/main/java/com/wt/apkinfo/fragment/ApplicationsFragment.java +++ b/app/src/main/java/com/wt/apkinfo/fragment/ApplicationsFragment.java @@ -4,12 +4,15 @@ import android.arch.lifecycle.Observer; import android.arch.lifecycle.ViewModelProviders; import android.content.Intent; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.support.v4.app.ActivityOptionsCompat; import android.support.v4.app.Fragment; +import android.support.v4.view.ViewCompat; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; @@ -142,10 +145,16 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) { if (adapter == null) { adapter = new ApplicationsListAdapter(new OnItemClick() { @Override - public void onItemClick(View v, ApplicationEntity item) { + public void onItemClick(View v, ApplicationEntity item, ApplicationsItemHolder holder) { Intent it = new Intent(getActivity(), ApplicationDetailsActivity.class); it.putExtra(ApplicationDetailsActivity.KEY_APP_ID, item.getId()); - startActivity(it); + if (Build.VERSION.SDK_INT >= 21) { + ActivityOptionsCompat options = ActivityOptionsCompat. + makeSceneTransitionAnimation(getActivity(), holder.icon1, "transition_" + item.id); + startActivity(it, options.toBundle()); + } else { + startActivity(it); + } } }); } @@ -168,7 +177,7 @@ public void onChanged(@Nullable List apps) { } private interface OnItemClick { - void onItemClick(View v, ApplicationEntity item); + void onItemClick(View v, ApplicationEntity item, ApplicationsItemHolder holder); } private static class ApplicationsListAdapter extends RecyclerView.Adapter { @@ -191,7 +200,7 @@ public ApplicationsItemHolder onCreateViewHolder(ViewGroup parent, int viewType) } @Override - public void onBindViewHolder(ApplicationsItemHolder holder, int position) { + public void onBindViewHolder(final ApplicationsItemHolder holder, int position) { final ApplicationEntity entry = mData.get(position); holder.text1.setText(entry.getName()); holder.text2.setText(entry.getId()); @@ -200,10 +209,11 @@ public void onBindViewHolder(ApplicationsItemHolder holder, int position) { @Override public void onClick(View view) { if (mOnItemClick != null) { - mOnItemClick.onItemClick(view, entry); + mOnItemClick.onItemClick(view, entry, holder); } } }); + holder.update(entry); } @Override @@ -222,5 +232,10 @@ public ApplicationsItemHolder(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } + + public void update(ApplicationEntity entry) { + ViewCompat.setTransitionName(icon1, "transition_" + entry.id); + //icon1.setTransitionName("transition_" + entry.id); + } } } diff --git a/app/src/main/java/com/wt/apkinfo/util/ViewUtil.java b/app/src/main/java/com/wt/apkinfo/util/ViewUtil.java new file mode 100644 index 0000000..b193644 --- /dev/null +++ b/app/src/main/java/com/wt/apkinfo/util/ViewUtil.java @@ -0,0 +1,26 @@ +package com.wt.apkinfo.util; + +import android.support.annotation.Nullable; +import android.view.View; + +import java.util.ArrayList; + +/** + * Created by kenumir on 04.10.2017. + * + */ + +public class ViewUtil { + + @Nullable + public static View findViewWithContentDescription(View src, String contentDescription) { + ArrayList potentialViews = new ArrayList(); + src.findViewsWithText(potentialViews, contentDescription, View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION); + View res = null; + if (potentialViews.size() > 0){ + res = potentialViews.get(0); + } + return res; + } + +} diff --git a/app/src/main/res/drawable/theme_round_icon.xml b/app/src/main/res/drawable/theme_round_icon.xml new file mode 100644 index 0000000..ceef76f --- /dev/null +++ b/app/src/main/res/drawable/theme_round_icon.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml new file mode 100644 index 0000000..9b4e52a --- /dev/null +++ b/app/src/main/res/values-v21/styles.xml @@ -0,0 +1,7 @@ + + + + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 5e98343..6825b60 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,12 +1,13 @@ - +