其實 Android 官方範例裡還有另一個關於 Activity 轉場 Transition
那就順便重點學習一下嚕
// MainActivity 裡面只有一個 GridView // 而它的 AdapterView.OnItemClickListener 是這樣的 public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { Item item = (Item) adapterView.getItemAtPosition(position); // 建立 intent 並把 item id 塞進 extra 中 Intent intent = new Intent(this, DetailActivity.class); intent.putExtra(DetailActivity.EXTRA_PARAM_ID, item.getId()); // 這裡利用 ActivityOptionsCompat.makeSceneTransitionAnimation(Activity activity, Pair...<View, String> sharedElements) // 建立轉場動畫,注意到它需要傳入Pair<View, String> 一一把 view 跟識別名稱傳入 ActivityOptionsCompat activityOptions = ActivityOptionsCompat.makeSceneTransitionAnimation( this, new Pair<View, String>( view.findViewById(R.id.imageview_item), DetailActivity.VIEW_NAME_HEADER_IMAGE ), new Pair<View, String>( view.findViewById(R.id.textview_name), DetailActivity.VIEW_NAME_HEADER_TITLE ) ); // 然後用 ActivityCompat.startActivity 把 intent 跟 ActivityOptionsCompat(作為 Bundle) 傳入 ActivityCompat.startActivity(this, intent, activityOptions.toBundle()); }
而在 DetailActivity 中
//bundle 用的 key public static final String EXTRA_PARAM_ID = "detail:_id"; // 用作 activity scene transition 識別名稱 public static final String VIEW_NAME_HEADER_IMAGE = "detail:header:image"; public static final String VIEW_NAME_HEADER_TITLE = "detail:header:title"; private ImageView mHeaderImageView; private TextView mHeaderTitle; private Item mItem; @Override protected void onCreate(Bundle savedInstanceState) { // 省略... // 用 id 取出 item mItem = Item.getItem(getIntent().getIntExtra(EXTRA_PARAM_ID, 0)); mHeaderImageView = (ImageView) findViewById(R.id.imageview_header); mHeaderTitle = (TextView) findViewById(R.id.textview_title); // 用 ViewCompat.setTransitionName 把 view 跟對應的共同識別名稱關連起來 ViewCompat.setTransitionName(mHeaderImageView, VIEW_NAME_HEADER_IMAGE); ViewCompat.setTransitionName(mHeaderTitle, VIEW_NAME_HEADER_TITLE); loadItem(); } private void loadItem() { mHeaderTitle.setText(getString(R.string.image_header, mItem.getName(), mItem.getAuthor())); //API 5.0 以上才有支援 Activity Scene Transition,取得 Transition 並加上 TransitionListener if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && addTransitionListener()) { //用縮圖做 transition,待轉場動畫結束後再 load 大圖進來 loadThumbnail(); } else { //否則直接載入大圖 loadFullSizeImage(); } } private boolean addTransitionListener() { final Transition transition = getWindow().getSharedElementEnterTransition(); //取得預設的元件轉場 Transition if (transition != null) { transition.addListener(new Transition.TransitionListener() { @Override public void onTransitionEnd(Transition transition) { // 轉場結束所以可以 load 大圖跟移除 listener 了 loadFullSizeImage(); transition.removeListener(this); } @Override public void onTransitionStart(Transition transition) { } @Override public void onTransitionCancel(Transition transition) { // 如果轉場被 Cancel 也移除 listener transition.removeListener(this); } @Override public void onTransitionPause(Transition transition) { } @Override public void onTransitionResume(Transition transition) { } }); return true; } // 如果 transition 是 null 則回傳 false return false; } // 省略...
這範例還挺簡單的
而且在 DetailActivity 按 back 回 MainActivity 時它也自動加了轉場呢
相關資料:
Android sample code - Activity Scene Transition Basic
沒有留言:
張貼留言