12

私は、タイトルと字幕を持つカスタム折りたたみツールバーレイアウトを使用しています。
曲がったパスで崩壊してアニメートするタイトルを取得しましたが、崩壊が滑らかではないため、タイトルの部分が小さくなりました。それはギザギザのような形でサイズ変更されます。
これは、タイトルの移動とサイズ変更のために責任がある私の振る舞いである:それはスムーズな方法でサイズを変更する必要がありますので、カスタム折りたたみツールバー滑らかなタイトルのサイズ変更

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; 
    } 
} 

はどのようなアルゴリズムを変更できますか?

編集 - ビデオ:
https://youtu.be/j6LseSW6h1s

+0

を使用してアニメーションを実行する必要があるギザギザの部分のためのビデオやGIFを共有してください。なぜあなたは、アンドロイドAPIが同じ機能を提供するときに、あなた自身のアルゴリズムをすべて書こうとしていますか?字幕や定期的なタイトルとタイトルの違いを示しhttps://github.com/ahmadmuzakki29/subtitle-collapsingtoolbar –

+0

次を見ているようにしてください。私は自分のアルゴリズムを書いています。なぜなら、デフォルトの字幕は字幕ではないからです。 私は実際に何をすべきか理解できません。 –

+0

@AnuragSinghを追加しましたビデオ: – amitairos

答えて

2

は(それは整数に小数点以下の値を切り上げ)アニメーションの中にAndroid上でうまく動作しません。

それはあなたの必要性を満たしている場合、あなたはscaleX/scaleY属性、例えば:

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

ありがとうございます。ちょうど私はそれを次のように変更しました:(HeaderViewとしての子).SetScaleX(scale); (HeaderViewとしての子).SetScaleY(scale); – amitairos

2

あなたが持っている問題は、あなたがdemical値としてスケールを計算した場合でも、彼らはTextViewの中で整数値になるということです。スムーズなスケーリングと位置付けを実現するには、TextViewのPaintクラスにLINEAR_TEXT_FLAGSUBPIXEL_TEXT_FLAGの両方のフラグを有効にする必要があります。このような

何か:

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

ありがとうございます。私はそれを試みたが、まだ違いはなかった。私のアルゴリズムでも何かを変更する必要があるのでしょうか? – amitairos

+1

実際にどの計算値から得た値を確認しましたか?それらを印刷してグラフを描いて、それが「ギザギザ」かどうかを確認することもできます。 – hankide

1

私はツールバーを崩壊するために、このレイアウト形式を使用する必要があり、それがスムーズに動作します。

私はそれはあなたを助け願っていますツールバー

@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; 
      } 
     } 
    } 

をハンドルするために、私はintializeこれだけレイアウトや設定テキスト

 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); 

は、このメソッドを追加していますIntializeComponentsで断片でその後

<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> 

: )

+0

ありがとうございました。しかし、これは私の問題を解決しません。問題は、CollapsingToolbar内でカスタムTextViewを使用しているため、テキストサイズの変更がスムーズでないことです。 – amitairos

1

いいえ、あなたもcustomTextviewを使用している場合は、 customTextViewのみを使用します。

ここにcustomtextviewコードを投稿しますか?だからあなたのcustomTextviewのすべての問題を見ることができます。それは十分に正確ではありませんので、TEXTSIZEを経由してスケーリング他の人が述べたように

+0

これはカスタムTextViewではなく、タイトルとして機能するTextViewです。折りたたみツールバーのタイトルは一切表示せず、このTextViewを表示してパーセンテージに従ってサイズを変更します。 – amitairos

関連する問題