2016-07-12 2 views
3

마스터/세부 흐름을 구현했으며 조각을 추가 한 후 햄버거 아이콘에서 화살표 아이콘으로 전환 애니메이션을 가져오고 싶습니다 (탐색 용 서랍을 열 때와 같은 애니메이션).조각을 추가 할 때 햄버거에서 화살표 아이콘으로 전환 애니메이션

나는 다음과 같은 코드를 사용하고 있습니다 :

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_home); 

    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    toggle = new ActionBarDrawerToggle(this, drawer, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    drawer.setDrawerListener(toggle); 
    toggle.setDrawerIndicatorEnabled(true); 
    toggle.syncState(); 

    //Add home page fragment 
    FragmentManager fragmentManager = getFragmentManager(); 
    HabitHomeFragment homePageFragment = new HabitHomeFragment(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.replace(R.id.habit_home, homePageFragment); 
    fragmentTransaction.commit();} 

를 세부 사항을 조각 추가 할 때 :

public void showDetails() { 
     toggle.setDrawerIndicatorEnabled(false); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     fragmentTransaction.replace(R.id.habit_home, habitDetailsFragment).addToBackStack("detail").commit();} 

그리고 도구 모음 :

<android.support.design.widget.AppBarLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/AppTheme.AppBarOverlay"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     app:popupTheme="@style/AppTheme.PopupOverlay" /> 

</android.support.design.widget.AppBarLayout> 
....  

현재 조각을 변경 한 후에 아이콘이 애니메이션없이 변경됩니다.

+0

해결 방법을 찾으셨습니까? – Questioner

+0

이 문제에 대한 해결책을 찾지 못했습니다. – user1030150

+0

@Questioner, 두 가지 해결책을 찾았습니다. 답변을 참조하십시오. – babay

답변

4

먼저 설명합니다.

  1. android.support.v7.app.ActionBarDrawerToggle은 햄버거와 화살표 아이콘 및 애니메이션에 특수 드로어 블 클래스를 사용합니다.

  2. 클래스는 android.support.v7.graphics.drawable.DrawerArrowDrawable

  3. DrawerArrowDrawable 1 (화살표)로 진행 0 (햄버거) 내지 setProgress(float progress) 방법과 애니메이션을 구현한다.

  4. ActionBarDrawerToggle이 ActionBarDrawerToggle 그것은 청취자의와 생성자에서 개인 setPosition()

  5. ActionBarDrawerToggle 전화를 toolbar.setNavigationOnClickListener()를 호출 public void onDrawerSlide(View drawerView, float slideOffset) 사용 DrawerArrowDrawable.setProgress()

  6. 호출 private void setPosition(float position) 사용, 그는 서랍을 전환하는 데 사용됩니다.

  7. ActionBarDrawerToggle 실제 DrawerArrowDrawable 상태를 유지하십시오. ToolbarActionBar은 실제 DrawerArrowDrawable 상태를 추적하지 않습니다.

그렇다면 활동에서해야 할 일. Option-A, ActionBarDrawerToggle을 사용하십시오.

// define a variable to track hamburger-arrow state 
    protected boolean isHomeAsUp = false; 

    protected DrawerLayout drawer; 
    protected Toolbar toolbar; 
    protected ActionBarDrawerToggle toggle; 

    // I've implemented it in setContentView(), but you can implement it in onCreate() 
    @Override 
    public void setContentView(@LayoutRes int layoutResID) { 
     super.setContentView(layoutResID); 

     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.drawer_open, R.string.drawer_close); 
     drawer.addDrawerListener(toggle); 
     toggle.syncState(); 

     // overwrite Navigation OnClickListener that is set by ActionBarDrawerToggle 
     toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (drawer.isDrawerOpen(GravityCompat.START)){ 
        drawer.closeDrawer(GravityCompat.START); 
       } else if (isHomeAsUp){ 
        onBackPressed(); 
       } else { 
        drawer.openDrawer(GravityCompat.START); 
       } 
      } 
     }); 
    } 

    // call this method for animation between hamburged and arrow 
    protected void setHomeAsUp(boolean isHomeAsUp){ 
     if (this.isHomeAsUp != isHomeAsUp) { 
      this.isHomeAsUp = isHomeAsUp; 

      ValueAnimator anim = isHomeAsUp ? ValueAnimator.ofFloat(0, 1) : ValueAnimator.ofFloat(1, 0); 
      anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
       @Override 
       public void onAnimationUpdate(ValueAnimator valueAnimator) { 
        float slideOffset = (Float) valueAnimator.getAnimatedValue(); 
        toggle.onDrawerSlide(drawer, slideOffset); 
       } 
      }); 
      anim.setInterpolator(new DecelerateInterpolator()); 
      // You can change this duration to more closely match that of the default animation. 
      anim.setDuration(400); 
      anim.start(); 
     } 
    } 

또는 당신은 toolbar.setNavigationIcon()와 탐색 아이콘으로 DrawerArrowDrawable을 설정하고 ActionBarDrawerToggle 참조 옵션-B없이 애니메이션을 적용 할 수 있습니다 : https://stackoverflow.com/a/42024138/1148784

3

는 설명 https://stackoverflow.com/a/42023946/1148784 내 다른 답변을 참조하십시오. 이것은 B 옵션입니다. Activity 클래스의 코드입니다. 여기서는 ActionBarDrawerToggle을 사용하지 않습니다.

protected boolean isHomeAsUp = false; 
    DrawerArrowDrawable homeDrawable; 
    protected Toolbar toolbar; 
    protected DrawerLayout drawer; 

    @Override 
    public void setContentView(@LayoutRes int layoutResID) { 
     super.setContentView(layoutResID); 

     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 

     homeDrawable = new DrawerArrowDrawable(toolbar.getContext()); 
     toolbar.setNavigationIcon(homeDrawable); 

     toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (drawer.isDrawerOpen(GravityCompat.START)){ 
        drawer.closeDrawer(GravityCompat.START); 
       } else if (isHomeAsUp){ 
        onBackPressed(); 
       } else { 
        drawer.openDrawer(GravityCompat.START); 
       } 
      } 
     }); 
    } 

    protected void setHomeAsUp(boolean isHomeAsUp){ 
     if (this.isHomeAsUp != isHomeAsUp) { 
      this.isHomeAsUp = isHomeAsUp; 
      ValueAnimator anim = isHomeAsUp ? ValueAnimator.ofFloat(0, 1) : ValueAnimator.ofFloat(1, 0); 
      anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
       @Override 
       public void onAnimationUpdate(ValueAnimator valueAnimator) { 
        float slideOffset = (Float) valueAnimator.getAnimatedValue(); 
        homeDrawable.setProgress(slideOffset); 
       } 
      }); 
      anim.setInterpolator(new DecelerateInterpolator()); 
      anim.setDuration(400); 
      anim.start(); 
     } 
    } 
관련 문제