activityターンオーバーアニメーションmakeSceneTransitionAnimationの効果がない問題の解決方法について


  • 前言
  • 回転アニメーション概要
  • で発生した問題
  • 運転は効果がない
  • 戻るボタンをクリックすると効果が現れますが、ジャンプを始めたばかりの頃は効果がありません
  • 最終的な効果
  • を実現する.
  • で発生したその他の問題
  • まとめ

  • 前言


    ここ数日プロジェクトの需要の中でactivityがジャンプする时、アイコンを次のactivityに平行移動するように要求して、私はすぐにactivityの回転場のアニメーションを使うことを思いついて、以下は簡単にactivityの回転場のアニメーションと出会った問題&対応する解決方法を紹介します.

    回転アニメーションの概要


    Activityの過剰動画に詳しい方はご存知と思いますが、一般的にはそのまま使っています
    overridePendingTransition(enterAnim, exitAnim);

    しかし、このような古い、硬い方法はどうして私たちのMDスタイルのAppに合うことができますか?Googleでは、新しいsdkでActivityの過剰アニメーションであるActivity Optionsを提供しています.また、Activity OptionsCompatという互換性のあるパッケージも提供されています.Activity OptionsCompatは静的クラスであり、数少ない方法を提供しています.次に、以下に列挙します.
    1. , overridePendingTransition , 
    ActivityOptionsCompat.makeCustomAnimation(Context context, int enterResId, int exitResId)
    
    2. activity, 
    ActivityOptionsCompat.makeScaleUpAnimation(View source,int startX, int startY, int startWidth, int startHeight)
    
    3.
    ActivityOptionsCompat.makeThumbnailScaleUpAnimation(View source,Bitmap thumbnail, int startX, int startY)
    
    4. activity
    ActivityOptionsCompat.makeSceneTransitionAnimation(Activity activity, View sharedElement, String sharedElementName)
    
    5.  activity
    ActivityOptionsCompat.makeSceneTransitionAnimation(Activity activity,Pair… sharedElements)

    はい、この5つの方法で呼び出すことができます.つまり、このような5つの過剰な方法を提供しています.使用するときはthemeで指定する必要があります.

    ps:私たちのプロジェクトで実現する機能は4つ目の効果と同じです.

    問題


    実行しても効果がない


    第4の方法を使用することを知っていて、私达はこの方法に従ってコードをプロジェクトに追加して、移行する2つのコントロールもtranslationName属性を追加して、とても喜んで问题がこのように简単に解决したと思って、しかし理想は豊満で、现実は骨感で、本物のテストは私の望む効果が现れていません.

    戻るボタンをクリックすると効果が現れますが、ジャンプを始めたばかりの時は効果がありません


    ネット上で多くの招待状を探して、最后にstackoverflowがある招待状の中で1つの言叶が私の注意を引き起こしたことを见て、多分あなたの携帯电话のシステムのバージョンが5.0以上あることを意味して、これを见て、私は会社のサムスンs 6のテスト机を変えて、とてもドキドキしてプログラムを运行して、効果がなくて、しかし戻るボタンをクリックする时私の望む効果が现れました.

    最終的な効果を実現


    そこで私は自分でdemoを作ってこの回転場のアニメーションをテストして、結果は意外にも効果を実現して、私はこのdemoと私のプロジェクトを比較して、コードに違いがないことを発見して、唯一の違いはdemoの中の2つのコントロールはすべてactivityのレイアウトの中で、しかし私のプロジェクトの中の2番目のコントロールはlistviewの1つのheaderViewの中で、activityのレイアウトファイルの中で、私はこの原因ではないと思います結局、修正した結果、やっと私が望んでいた結果が現れた.

    その他の問題


    2番目のコントロールはlistViewのヘッダーなので、ヘッダーの中のviewをlist viewの上に置かなければなりません.addHeaderViewではいけません.これはScrolviewを使います.自然にListviewとScrollViewの衝突問題を解決しなければなりません.また、2番目のactivityに入った後、scrollviewは一番上ではなく、現実のlist viewの部分です.次の解決策を示します:1.listviewを継承し、彼のonMeasure()を書き換えます.
    @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,  
                    MeasureSpec.AT_MOST);  
            super.onMeasure(widthMeasureSpec, expandSpec);  
        }

    2.listviewはscrollviewの焦点を占めているので、ページに入ってからlistviewがactivityのコードに追加されたことを表示します.
    mListView.setFocusable(false);

    できます.ps:listviewのレイアウトファイルに追加
    android:focusable="false"

    効果はありません.scrollviewを上部にスクロールする方法もあります
    mScrollView.smoothScrollTo(0,0);

    まとめ


    このブログの中心思想は:1.makeSceneTransitionAnimationはandroid 5で実行する必要があります.0以上のシステムのみ
    2.過剰な2つのコントロールを実現するにはactivityのレイアウトファイルにincludeを使用してもよいがlistviewは使用できない.addHeaderViewの形式で使用
    3.scrollviewとlistviewのスライド衝突解決
    4.フォーカスの問題でscrollviewが上部にない
    以上はすべて私自身の拙见で、もし问题の地方があるならば、各位の伝言を頼んで、私は改正して、私の笔の误りあるいは间违った思想が间もなく神になるあなた达を误导したためではありません.最后に、私と同じ问题に直面した学友达を助けることができることを望んで、みんなが毎日楽しくて、すべて大神になることを祈ります!