Android Fragment切換動畫效果
來自: http://blog.csdn.net//lcq5211314123/article/details/48881441
以前做Fragment切換時,都是直接 Fragment的切換,最近看到趕集網首頁的Fragment點擊按鈕切換時,是有動畫效果的,看著還不錯,就參考網上的思路,照著實現了一下,下面是效果圖:
思路:類似于Activity的轉場動畫一樣,為FragmentTranslation添加指定的動畫即可。代碼如下:
1.自定義屬性動畫Layout,可extends任意一個布局,添加如下 set方法。使布局支持自定義的屬性動畫。
/** @文件名稱:SlidingRelativeLayout.java @文件作者:rzq @創建時間:2015年10月2日 下午11:23:38 @文件描述:Fragment切換動畫效果Layout * @修改歷史:2015年10月2日創建初始版本 **/ public class SlidingRelativeLayout extends RelativeLayout { private float yFraction = 0; private float xFraction = 0;public SlidingRelativeLayout(Context context) { super(context); } public SlidingRelativeLayout(Context context, AttributeSet attrs) { super(context, attrs); } public SlidingRelativeLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } private ViewTreeObserver.OnPreDrawListener preDrawListener = null; public void setYFraction(float fraction) { this.yFraction = fraction; if (getHeight() == 0) { if (preDrawListener == null) { preDrawListener = new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { getViewTreeObserver().removeOnPreDrawListener(preDrawListener); setYFraction(yFraction); return true; } }; getViewTreeObserver().addOnPreDrawListener(preDrawListener); } return; } float translationY = getHeight() * fraction; Log.v("translationY set", translationY + " "); setTranslationY(translationY); } /** * 支持XFraction屬性動畫,以下都類似 */ public void setXFraction(float fraction) { this.xFraction = fraction; if (getWidth() == 0) { if (preDrawListener == null) { preDrawListener = new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { getViewTreeObserver().removeOnPreDrawListener(preDrawListener); setXFraction(xFraction); return true; } }; getViewTreeObserver().addOnPreDrawListener(preDrawListener); } return; } float translationX = getWidth() * fraction; setTranslationX(translationX); } public void setGlide(float fraction) { float translationX = getWidth() * fraction; setTranslationX(translationX); setRotationY(90 * fraction); setPivotX(0); } public void setGlideBack(float fraction) { float translationX = getWidth() * fraction; setTranslationX(translationX); setRotationY(90 * fraction); setPivotX(0); setPivotY(getHeight() / 2); }
}
2.為Fragment的切換添加指定的自定義屬性動畫。 public class FragmentTranslationActivity extends Activity implements OnClickListener { private LinearLayout mCategoryLayout; private LinearLayout mNearLayout; private LinearLayout mPublishLayout; private LinearLayout mPersionalLayout; private TextView mCateiView, mNearView, mPublishView, mPersionalView;
private FragmentManager fm; private Fragment mCategoryFragment; private Fragment mNearFragment; private Fragment mPublishFragment; private Fragment mPersionalCenterFragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_fragment_transation); mCategoryLayout = (LinearLayout) findViewById(R.id.catagories_view); mCategoryLayout.setOnClickListener(this); mCateiView = (TextView) findViewById(R.id.category); mCateiView.setBackgroundResource(R.drawable.tab_lastcategories_selected); mNearLayout = (LinearLayout) findViewById(R.id.near_view); mNearLayout.setOnClickListener(this); mNearView = (TextView) findViewById(R.id.near); mPublishLayout = (LinearLayout) findViewById(R.id.publish_view); mPublishLayout.setOnClickListener(this); mPublishView = (TextView) findViewById(R.id.publish); mPersionalLayout = (LinearLayout) findViewById(R.id.persional_view); mPersionalLayout.setOnClickListener(this); mPersionalView = (TextView) findViewById(R.id.persional); // Add first fragment mCategoryFragment = new TranslationFragment(0); /** * 不應該在onCreate時全部創建Fragment,否則此Activity會加載的很慢,尤其有請求的時候 */ // mNearFragment = new TranslationFragment(1); // mPublishFragment = new TranslationFragment(2); // mPersionalCenterFragment = new TranslationFragment(3); fm = getFragmentManager(); FragmentTransaction fragmentTransaction = fm.beginTransaction(); fragmentTransaction.replace(R.id.fragment_place, mCategoryFragment); fragmentTransaction.commit(); } @Override public void onClick(View v) { /** * 取得FragmentTransaction事務對象 */ FragmentTransaction fragmentTransaction = fm.beginTransaction(); if (Build.VERSION.SDK_INT >= 11) { /** * 為FragmentTransaction添加指定的自定義屬性動畫(注意:使用support.v4.FragmentTransaction只能添加View動畫) */ fragmentTransaction.setCustomAnimations(R.animator.slide_fragment_horizontal_right_in, R.animator.slide_fragment_horizontal_left_out, R.animator.slide_fragment_horizontal_left_in, R.animator.slide_fragment_horizontal_right_out); } switch (v.getId()) { case R.id.catagories_view: mCateiView.setBackgroundResource(R.drawable.tab_lastcategories_selected); mNearView.setBackgroundResource(R.drawable.tab_near); mPublishView.setBackgroundResource(R.drawable.tab_publish); mPersionalView.setBackgroundResource(R.drawable.tab_personal_centre_default); if (mCategoryFragment == null) { mCategoryFragment = new TranslationFragment(0); } fragmentTransaction.replace(R.id.fragment_place, mCategoryFragment); break; case R.id.near_view: mNearView.setBackgroundResource(R.drawable.tab_near_selected); mCateiView.setBackgroundResource(R.drawable.tab_lastcategories); mPublishView.setBackgroundResource(R.drawable.tab_publish); mPersionalView.setBackgroundResource(R.drawable.tab_personal_centre_default); if (mNearFragment == null) { mNearFragment = new TranslationFragment(1); } fragmentTransaction.replace(R.id.fragment_place, mNearFragment); break; case R.id.publish_view: mPublishView.setBackgroundResource(R.drawable.tab_publish_selected); mCateiView.setBackgroundResource(R.drawable.tab_lastcategories); mNearView.setBackgroundResource(R.drawable.tab_near); mPersionalView.setBackgroundResource(R.drawable.tab_personal_centre_default); if (mPublishFragment == null) { mPublishFragment = new TranslationFragment(2); } fragmentTransaction.replace(R.id.fragment_place, mPublishFragment); break; case R.id.persional_view: mPersionalView.setBackgroundResource(R.drawable.tab_personal_centre_selected); mCateiView.setBackgroundResource(R.drawable.tab_lastcategories); mNearView.setBackgroundResource(R.drawable.tab_near); mPublishView.setBackgroundResource(R.drawable.tab_publish); if (mPersionalCenterFragment == null) { mPersionalCenterFragment = new TranslationFragment(3); } fragmentTransaction.replace(R.id.fragment_place, mPersionalCenterFragment); break; } fragmentTransaction.commit(); }
}</pre>
代碼也不復雜,主要有以下幾點注意:
- fragmentTransaction.setCustomAnimation()只能添加xml中定義的動畫。
- setCustomAnimation()必須在replace,add等方法前才會生效。
- 使用support.v4包,則只能添加View動畫,添加自定義的屬性動畫會報:不能識別的動畫類型。
</ol> </div>
本文由用戶 MckinleyMap 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!