12

Używam niestandardowego układu paska narzędzi Zwijanie, który ma tytuł i podtytuł.
Mam tytuł do zwinięcia i animacji na zakrzywionej ścieżce, ale część tytułu staje się mniejsza, ponieważ zwijanie nie jest płynne. Zmienia rozmiar w sposób postrzępiony.
To moje zachowanie, które jest odpowiedzialne za przenoszenie i zmiana rozmiaru tytułem:Niestandardowy pasek narzędzi Zwijanie gładkie zmiana rozmiaru tytułu

public class ViewBehavior : CoordinatorLayout.Behavior 
{ 
    private Context mContext; 

    private int mStartMarginRight; 
    private int mEndMargintRight; 
    private int mMarginLeft; 
    private int mStartMarginBottom; 
    private bool isHide; 
    private static float SCALE_MINIMUM = 0.5f; 
    public ViewBehavior(Context context, IAttributeSet attrs) 
    { 
     mContext = context; 
    } 

    public override bool LayoutDependsOn(CoordinatorLayout parent, Java.Lang.Object child, View dependency) 
    { 
     return dependency is AppBarLayout; 
    } 

    public override bool OnDependentViewChanged(CoordinatorLayout parent, Java.Lang.Object child, View dependency) 
    { 
     ShouldInitProperties((child as HeaderView), dependency); 

     int maxScroll = ((AppBarLayout)dependency).TotalScrollRange; 
     float percentage = System.Math.Abs(dependency.GetY())/(float)maxScroll; 

     float childPosition = dependency.Height 
       + dependency.GetY() 
       - (child as View).Height 
       - (getToolbarHeight() - (child as View).Height) * percentage/2; 


     childPosition = childPosition - mStartMarginBottom * (1f - percentage); 

     CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)(child as View).LayoutParameters; 
     lp.RightMargin = (int)(100 * System.Math.Sin(percentage * System.Math.PI)) + mStartMarginRight/2 + mEndMargintRight/2; 
     lp.LeftMargin = mMarginLeft; 
     (child as View).LayoutParameters = lp; 

     (child as View).SetY(childPosition); 
     float x = (child as HeaderView).Title.TextSize; 
     //Here is the algorithm for setting the text size 
     (child as HeaderView).Title.SetTextSize(ComplexUnitType.Sp, 36 * (1 - percentage/2)); 
     (child as HeaderView).SubTitle.SetTextSize(ComplexUnitType.Sp, 26 * (1 - percentage/2)); 

     var toolbarTitleSize = (int)TypedValue.ApplyDimension(ComplexUnitType.Sp, 18, Application.Context.Resources.DisplayMetrics); 
     var toolbarSubTitleSize = (int)TypedValue.ApplyDimension(ComplexUnitType.Sp, 16, Application.Context.Resources.DisplayMetrics); 
     if ((child as HeaderView).Title.TextSize < toolbarTitleSize) 
      (child as HeaderView).Title.SetTextSize(ComplexUnitType.Sp, 18); 
     if ((child as HeaderView).SubTitle.TextSize < toolbarSubTitleSize) 
      (child as HeaderView).SubTitle.SetTextSize(ComplexUnitType.Sp, 14); 
     if (Build.VERSION.SdkInt < BuildVersionCodes.Lollipop) 
     { 
      if (isHide && percentage < 1) 
      { 
       (child as View).Visibility = ViewStates.Visible; 
       isHide = false; 
      } 
      else if (!isHide && percentage == 1) 
      { 
       (child as View).Visibility = ViewStates.Gone; 
       isHide = true; 
      } 
     } 
     return true; 
    } 


    public void ShouldInitProperties(HeaderView child, View dependency) 
    { 

     if (mStartMarginRight == 0) 
      mStartMarginRight = mContext.Resources.GetDimensionPixelOffset(Resource.Dimension.header_view_start_margin_right); 

     if (mEndMargintRight == 0) 
      mEndMargintRight = mContext.Resources.GetDimensionPixelOffset(Resource.Dimension.header_view_end_margin_right); 

     if (mStartMarginBottom == 0) 
      mStartMarginBottom = mContext.Resources.GetDimensionPixelOffset(Resource.Dimension.header_view_start_margin_bottom); 

     if (mMarginLeft == 0) 
      mMarginLeft = mContext.Resources.GetDimensionPixelOffset(Resource.Dimension.header_view_end_margin_left); 

    } 


    public int getToolbarHeight() 
    { 
     int result = 0; 
     TypedValue tv = new TypedValue(); 
     if (mContext.Theme.ResolveAttribute(Android.Resource.Attribute.ActionBarSize, tv, true)) 
     { 
      result = TypedValue.ComplexToDimensionPixelSize(tv.Data, mContext.Resources.DisplayMetrics); 
     } 
     return result; 
    } 
} 

Jak mogę zmienić algorytm tak powinno zmienić rozmiar łagodniejszy sposób?

Edycja - Wideo:
https://youtu.be/j6LseSW6h1s

+0

Proszę udostępnić film lub GIF o postrzępionych części. Dlaczego próbujesz napisać swój własny algorytm, gdy api w Androidzie zapewnia tę samą funkcję. –

+0

Spróbuj spojrzeć na: https://github.com/ahmadmuzakki29/subtitle-collapsingtoolbar –

+0

@AnuragSingh Dodano wideo pokazujące różnicę między tytułem a podtytułem i zwykłym tytułem. Piszę własny algorytm, ponieważ domyślny nie jest dla podtytułu. Nie mogę naprawdę zrozumieć z tego, co robić. – amitairos

Odpowiedz

2

Jak wspomniano przez innych skalowanie za pomocą textSize nie działa dobrze na Androidzie w animacjach, ponieważ nie jest wystarczająco dokładne (zaokrągla wartości dziesiętne do liczb całkowitych).

jeżeli spełnia ona swoje potrzeby należy wykonać animację z atrybutami scaleX/scaleY, np .:

float scale = 1 - percentage * SCALE_MINIMUM; 
(child as HeaderView).Title.SetScaleX(scale); 
(child as HeaderView).Title.SetScaleY(scale); 
(child as HeaderView).SubTitle.SetScaleX(scale); 
(child as HeaderView).SubTitle.SetScaleY(scale); 
+0

Dzięki. Po prostu zmieniłem go na: (dziecko jako HeaderView) .SetScaleX (skala); (dziecko jako HeaderView) .SetScaleY (skala); – amitairos

2

Problem masz jest to, że nawet jeśli obliczenia wagi jako wartości demical, stają się wartościami całkowitymi w TextView. Należy włączyć flagi LINEAR_TEXT_FLAG i SUBPIXEL_TEXT_FLAG w klasie Paint klasy TextView, aby uzyskać płynne skalowanie i pozycjonowanie.

coś takiego:

yourTextView.Paint.SubpixelText = true; 
yourTextView.Paint.LinearText = true; 
+0

Dzięki. Próbowałem, ale nadal nie ma różnicy. Może muszę coś zmienić również w moim algorytmie? – amitairos

+1

Czy sprawdziłeś, jakie wartości faktycznie uzyskujesz z obliczeń? Możesz je wydrukować i narysować wykres, aby sprawdzić, czy jest również "postrzępiony". – hankide

1

mam używać tego formatu układ do zawalenia pasek i działa płynnie.

<android.support.design.widget.AppBarLayout 
     android:id="@+id/app_bar_layout" 
     android:layout_width="match_parent" 
     android:layout_height="@dimen/height_300dp" 
     android:background="?colorPrimary"> 

     <android.support.design.widget.CollapsingToolbarLayout 
      android:id="@+id/collapsible_Toolbar_Layout" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      app:collapsedTitleTextAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse" 
      app:contentScrim="@color/colorDarkBlue" 
      app:expandedTitleMarginEnd="@dimen/margin_64dp" 
      app:expandedTitleMarginStart="@dimen/margin_20dp" 
      app:expandedTitleTextAppearance="@style/TextAppearance.AppCompat.Widget.ActionBar.Title.Inverse" 
      app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"> 

      <ImageView 
       android:id="@+id/image" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:clickable="true" 
       android:fitsSystemWindows="true" 
       android:focusableInTouchMode="true" 
       android:scaleType="centerCrop" 
       app:layout_collapseMode="parallax" /> 

      <RelativeLayout 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:background="@color/colorTransparent" /> 

      <ImageButton 
       android:id="@+id/ib" 
       android:layout_width="@dimen/margin_35dp" 
       android:layout_height="@dimen/margin_35dp" 
       android:layout_gravity="right" 
       android:layout_marginRight="@dimen/margin_10dp" 
       android:layout_marginTop="@dimen/height_245dp" 
       android:background="@null" 
       android:src="@drawable/ic_launcher" /> 


      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="?actionBarSize" 
       android:background="@android:color/transparent" 
       android:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
       app:contentInsetStart="@dimen/margin_50dp" 
       app:layout_collapseMode="pin"> 

       <ImageButton 
        android:id="@+id/ib2" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_gravity="right" 
        android:layout_marginRight="@dimen/margin_10dp" 
        android:background="@null" 
        android:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
        android:src="@drawable/ic_launcher" 
        android:visibility="invisible" /> 

      </android.support.v7.widget.Toolbar> 
     </android.support.design.widget.CollapsingToolbarLayout> 
    </android.support.design.widget.AppBarLayout> 

Potem w Fragmentu w IntializeComponents Jestem intialize to tylko układ i ustawienie Tekst

 appBarLayout = (AppBarLayout)view.findViewById(R.id.app_bar_layout); 

     CollapsingToolbarLayout toolbarLayout = (CollapsingToolbarLayout) view.findViewById(R.id.collapsible_Toolbar_Layout); 
     toolbarLayout.setTitle(yourTitle); 
     toolbarLayout.setCollapsedTitleTextColor(Color.WHITE); 
     toolbarLayout.setExpandedTitleColor(Color.WHITE); 
     appBarLayout.addOnOffsetChangedListener(this); 

Dodaj ten sposób obchodzić pasek

@Override 
    public void onOffsetChanged(AppBarLayout appBarLayout, int offset) { 
     int maxScroll = appBarLayout.getTotalScrollRange(); 
     float percentage = (float) Math.abs(offset)/(float) maxScroll; 
     handleToolbarTitleVisibility(percentage); 
    } 

    private void handleToolbarTitleVisibility(float percentage) { 
     if (percentage >= PERCENTAGE_TO_SHOW_TITLE_AT_TOOLBAR) { 
      if(!mIsTheTitleVisible) { 
       imageButton.setVisibility(View.VISIBLE); 
       ib.setVisibility(View.INVISIBLE); 
       mIsTheTitleVisible = true; 
      } 

     } else { 

      if (mIsTheTitleVisible) { 
       imageButton.setVisibility(View.INVISIBLE); 
       ibMap.setVisibility(View.VISIBLE); 
       mIsTheTitleVisible = false; 
      } 
     } 
    } 

Mam nadzieję, że będzie pomaga:)

+0

Dziękuję za trud. Jednak to nie rozwiązuje mojego problemu.Problem polega na tym, że zmiana rozmiaru tekstu nie jest płynna, ponieważ używam niestandardowego TextView na moim pasku CollapsingToolbar. – amitairos

1

Nie, jeśli używasz customTextview, to również będzie działać, ponieważ jestem również używając tylko customTextView.

Czy umieścisz tutaj kod niestandardowego widoku? Tak więc wszyscy mogą zobaczyć problem w twoim customTextview.

+0

To nie jest niestandardowy TextView, to TextView, który służy jako tytuł. Nie pokazuję w ogóle tytułu Zwijany pasek narzędzi i pokaż ten tekst i zmień jego rozmiar zgodnie z procentem. – amitairos

Powiązane problemy