0

您好我一直在關注這個link實現工具欄上的不透明效果ToolbarAlphaScrollBehavior CoordinatorLayout

我的佈局文件:

  <?xml version="1.0" encoding="utf-8"?> 
     <layout> 
     <android.support.design.widget.CoordinatorLayout 
       android:id="@+id/coordinator_layout" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:fitsSystemWindows="true" 
       tools:context=".ProductDetailActivity"> 

     <android.support.design.widget.AppBarLayout 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize" 
       android:background="@android:color/transparent" 
       android:theme="@style/AppTheme.AppBarOverlay" 
       app:elevation="0dp" /> 
     <android.support.v4.widget.NestedScrollView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content"> 
      . 
      . 
      . 
     </android.support.v4.widget.NestedScrollView> 

     <android.support.v7.widget.Toolbar 
       android:id="@+id/prod_detail_toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize" 
       app:layout_behavior="util.ToolbarAlphaScrollBehavior" 
       /> 
     </android.support.design.widget.CoordinatorLayout> 
     </layout> 

和類:

public class ToolbarAlphaScrollBehavior extends CoordinatorLayout.Behavior<android.support.v7.widget.Toolbar> { 

    private static final String TAG = ToolbarAlphaScrollBehavior.class.getSimpleName(); 

    private ColorDrawable mStatusBarColorDrawable; 
    private int mStatusBarColor; 
    private TextView mTitleView; 
    private boolean searchedForTitleView = false; 
    private Context context; 

    public ToolbarAlphaScrollBehavior(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mStatusBarColor = ContextCompat.getColor(context, R.color.colorPrimaryDark); 
     mStatusBarColor = getColorWithAlpha(0, mStatusBarColor); 
     mStatusBarColorDrawable = new ColorDrawable(mStatusBarColor); 
     this.context=context; 
    } 

    public static int getColorWithAlpha(float alpha, int baseColor) { 
     int a = Math.min(255, Math.max(0, (int) (alpha * 255))) << 24; 
     int rgb = 0x00ffffff & baseColor; 
     return a + rgb; 
    } 

    public ToolbarAlphaScrollBehavior() { 
    } 

    @Override 
    public boolean layoutDependsOn(CoordinatorLayout parent, Toolbar child, View dependency) { 
     return dependency instanceof AppBarLayout; 
    } 

    @Override 
    public boolean onInterceptTouchEvent(CoordinatorLayout parent, Toolbar child, MotionEvent ev) { 
     return ev == null || super.onInterceptTouchEvent(parent, child, ev); 
    } 

    @Override 
    public boolean onDependentViewChanged(CoordinatorLayout parent, Toolbar child, View dependency) { 
     Log.e(TAG, "child "+child.getTitle()); 
     if (dependency instanceof AppBarLayout) { 
      float ratio = (float) getCurrentScrollValue(child, dependency)/getTotalScrollRange(child, dependency); 
      float alpha = 1f - Math.min(1f, Math.max(0f, ratio)); 
      int drawableAlpha = (int) (alpha * 255); 
      // Log.i("ToolbarAlphaScrollBehavior", "Alpha: " + alpha); 
      if (Build.VERSION.SDK_INT==Build.VERSION_CODES.LOLLIPOP || 
        Build.VERSION.SDK_INT==Build.VERSION_CODES.LOLLIPOP_MR1) { 
       child.getBackground().setAlpha(drawableAlpha); 
      } else if (Build.VERSION.SDK_INT==Build.VERSION_CODES.KITKAT) { 
       ViewGroup toolbarParent = (ViewGroup) child.getParent(); 
       if (toolbarParent.getChildCount() == 2) { 
        int count = toolbarParent.getChildCount(); 
        for (int i = count - 1; i >= 0; i--) { 
         toolbarParent.getChildAt(i).getBackground().setAlpha(drawableAlpha); 
        } 
       } 
      } else { 
       child.getBackground().setAlpha(drawableAlpha); 
      } 

      setStatusBarColor(parent, drawableAlpha); 
      if (mTitleView != null) { 
       ViewCompat.setAlpha(mTitleView, alpha); 
       return false; 
      } 
      if (!searchedForTitleView) { 
       TextView textView= new TextView(context); 
       textView.setText(child.getTitle()); 
       mTitleView = textView; 
       searchedForTitleView = true; 
      } 

     } 
     return false; 
    } 

    private void setStatusBarColor(CoordinatorLayout parent, int alpha) { 
     ColorDrawable statusBarBackground = (ColorDrawable) parent.getStatusBarBackground(); 
     statusBarBackground.setColor(getColorWithAlpha(alpha, statusBarBackground.getColor())); 
     parent.setStatusBarBackground(statusBarBackground); 
    } 

    private int getCurrentScrollValue(Toolbar child, View dependency) { 
     return dependency.getBottom() - child.getTop(); 
    } 

    private float getTotalScrollRange(Toolbar child, View dependency) { 
     return Math.max(dependency.getHeight(), ((AppBarLayout) dependency).getTotalScrollRange()) - child.getTop(); 
    } 

} 

但我收到以下錯誤

Attempt to invoke virtual method 'void android.graphics.drawable.Drawable.setAlpha(int)' on a null object reference 

在onDependentViewChanged孩子是空

我試圖完成的行爲是這一個:Youtube video

工具欄必須是在一開始和在滾動的顏色透明應 變化到原色

由於提前...

+0

關注此鏈接[collapsingtoolbarlayout-example](http://tutorialsbuzz.com/2015/11/android-collapsingtoolbarlayout-example_7.html)它可以幫助你 –

回答

0

嘗試調用虛擬方法'void android.graphics.drawable.Drawable.setAlpha(int)'上一個空對象引用

<android.support.v7.widget.Toolbar 
       android:id="@+id/prod_detail_toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize" 
       android:background = "@color/colorPrimary" 
       app:layout_behavior="util.ToolbarAlphaScrollBehavior" 
       /> 
0

我做了我需要的一切,並得到了這個 - 但工具欄始終在KitKat上是透明的。

鏈接:Transparent toolbar

-1

您可以設置...

mToolbar.setBackgroundColor(ContextCompat.getColor(getActivity(),android.R.color.transparent)); 

或設置背景的工具欄的XML!