工具栏AlphaScrollBehavior CoordinatorLayout [英] ToolbarAlphaScrollBehavior CoordinatorLayout

查看:77
本文介绍了工具栏AlphaScrollBehavior 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视频./p>

工具栏的开头必须是透明的,并且在滚动时颜色应为 更改为原色

预先感谢...

解决方案

我做了我需要的一切并得到了-但是工具栏在KitKat上始终是透明的.

链接:透明工具栏

Hi I've been following this link to accomplish the opacity effect on the toolbar

My Layout File :

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

And The Class :

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

}

But i am getting the following error

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

The child in onDependentViewChanged is null

The behavior i am trying to accomplish is this one : Youtube video.

The toolbar must be transparent in the beginning and on scroll the color should change to the primary color

Thanks in Advance...

解决方案

I did everything I needed and got this - but the toolbar is always transparent on KitKat .

link: Transparent toolbar

这篇关于工具栏AlphaScrollBehavior CoordinatorLayout的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆