专栏名称: 安卓开发精选
伯乐在线旗下账号,分享安卓应用相关内容,包括:安卓应用开发、设计和动态等。
目录
相关文章推荐
鸿洋  ·  裁员在家如何保持高效学习 ·  21 小时前  
鸿洋  ·  PackageManagerService和 ... ·  昨天  
鸿洋  ·  2024 了, Insets 你不会还不懂吧? ·  3 天前  
鸿洋  ·  鸿蒙版 React Native ... ·  4 天前  
51好读  ›  专栏  ›  安卓开发精选

CoordinatorLayout 布局的使用方式(下)

安卓开发精选  · 公众号  · android  · 2016-08-09 08:30

正文

(点击上方公众号,可快速关注)


来源:伯乐在线专栏作者 - Spike

链接:http://android.jobbole.com/84103/

点击 → 了解如何加入专栏作者


接上文


// 处理ToolBar的显示

private void handleToolbarTitleVisibility(float percentage) {

    if (percentage >= PERCENTAGE_TO_SHOW_TITLE_AT_TOOLBAR) {

        if (!mIsTheTitleVisible) {

            startAlphaAnimation(mTvToolbarTitle, ALPHA_ANIMATIONS_DURATION, View.VISIBLE);

            mIsTheTitleVisible = true;

        }

    } else {

        if (mIsTheTitleVisible) {

            startAlphaAnimation(mTvToolbarTitle, ALPHA_ANIMATIONS_DURATION, View.INVISIBLE);

            mIsTheTitleVisible = false;

        }

    }

}

 

// 控制Title的显示

private void handleAlphaOnTitle(float percentage) {

    if (percentage >= PERCENTAGE_TO_HIDE_TITLE_DETAILS) {

        if (mIsTheTitleContainerVisible) {

            startAlphaAnimation(mLlTitleContainer, ALPHA_ANIMATIONS_DURATION, View.INVISIBLE);

            mIsTheTitleContainerVisible = false;

        }

    } else {

        if (!mIsTheTitleContainerVisible) {

            startAlphaAnimation(mLlTitleContainer, ALPHA_ANIMATIONS_DURATION, View.VISIBLE);

            mIsTheTitleContainerVisible = true;

        }

    }

}

 

// 设置渐变的动画

public static void startAlphaAnimation(View v, long duration, int visibility) {

    AlphaAnimation alphaAnimation = (visibility == View.VISIBLE)

            ? new AlphaAnimation(0f, 1f)

            : new AlphaAnimation(1f, 0f);

 

    alphaAnimation.setDuration(duration);

    alphaAnimation.setFillAfter(true);

    v.startAnimation(alphaAnimation);

}


自动滑动动画, 当到一定比例时展开或关闭.


// 设置自动滑动的动画效果

private void initParallaxValues() {

    CollapsingToolbarLayout.LayoutParams petDetailsLp =

            (CollapsingToolbarLayout.LayoutParams) mIvPlaceholder.getLayoutParams();

 

    CollapsingToolbarLayout.LayoutParams petBackgroundLp =

            (CollapsingToolbarLayout.LayoutParams) mFlTitleContainer.getLayoutParams();

 

    petDetailsLp.setParallaxMultiplier(0.9f);

    petBackgroundLp.setParallaxMultiplier(0.3f);

 

    mIvPlaceholder.setLayoutParams(petDetailsLp);

    mFlTitleContainer.setLayoutParams(petBackgroundLp);

}


最终逻辑


public class MainActivity extends AppCompatActivity {

 

    // 控制ToolBar的变量

    private static final float PERCENTAGE_TO_SHOW_TITLE_AT_TOOLBAR = 0.9f;

    private static final float PERCENTAGE_TO_HIDE_TITLE_DETAILS = 0.3f;

 

    private static final int ALPHA_ANIMATIONS_DURATION = 200;

 

    private boolean mIsTheTitleVisible = false;

    private boolean mIsTheTitleContainerVisible = true;

 

    @Bind(R.id.main_iv_placeholder)

    ImageView mIvPlaceholder; // 大图片

 

    @Bind(R.id.main_ll_title_container)

    LinearLayout mLlTitleContainer; // Title的LinearLayout

 

    @Bind(R.id.main_fl_title)

    FrameLayout mFlTitleContainer; // Title的FrameLayout

 

    @Bind(R.id.main_abl_app_bar)

    AppBarLayout mAblAppBar; // 整个可以滑动的AppBar

 

    @Bind(R.id.main_tv_toolbar_title)

    TextView mTvToolbarTitle; // 标题栏Title

 

    @Bind(R.id.main_tb_toolbar)

    Toolbar mTbToolbar; // 工具栏

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        ButterKnife.bind(this);

 

        mTbToolbar.setTitle("");

 

        // AppBar的监听

        mAblAppBar.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {

            @Override

            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {

                int maxScroll = appBarLayout.getTotalScrollRange();

                float percentage = (float) Math.abs(verticalOffset) / (float) maxScroll;

                handleAlphaOnTitle(percentage);

                handleToolbarTitleVisibility(percentage);

            }

        });

 

        initParallaxValues(); // 自动滑动效果

    }

 

    // 设置自动滑动的动画效果

    private void initParallaxValues() {

        CollapsingToolbarLayout.LayoutParams petDetailsLp =

                (CollapsingToolbarLayout.LayoutParams) mIvPlaceholder.getLayoutParams();

 

        CollapsingToolbarLayout.LayoutParams petBackgroundLp =

                (CollapsingToolbarLayout.LayoutParams) mFlTitleContainer.getLayoutParams();

 

        petDetailsLp.setParallaxMultiplier(0.9f);

        petBackgroundLp.setParallaxMultiplier(0.3f);

 

        mIvPlaceholder.setLayoutParams(petDetailsLp);

        mFlTitleContainer.setLayoutParams(petBackgroundLp);

    }

 

    // 处理ToolBar的显示

    private void handleToolbarTitleVisibility(float percentage) {

        if (percentage >= PERCENTAGE_TO_SHOW_TITLE_AT_TOOLBAR) {

            if (!mIsTheTitleVisible) {

                startAlphaAnimation(mTvToolbarTitle, ALPHA_ANIMATIONS_DURATION, View.VISIBLE);

                mIsTheTitleVisible = true;

            }

        } else {

            if (mIsTheTitleVisible) {

                startAlphaAnimation(mTvToolbarTitle, ALPHA_ANIMATIONS_DURATION, View.INVISIBLE);

                mIsTheTitleVisible = false;

            }

        }

    }

 

    // 控制Title的显示

    private void handleAlphaOnTitle(float percentage) {

        if (percentage >= PERCENTAGE_TO_HIDE_TITLE_DETAILS) {

            if (mIsTheTitleContainerVisible) {

                startAlphaAnimation(mLlTitleContainer, ALPHA_ANIMATIONS_DURATION, View.INVISIBLE);

                mIsTheTitleContainerVisible = false;

            }

        } else {

            if (!mIsTheTitleContainerVisible) {

                startAlphaAnimation(mLlTitleContainer, ALPHA_ANIMATIONS_DURATION, View.VISIBLE);

                mIsTheTitleContainerVisible = true;

            }

        }

    }

 

    // 设置渐变的动画

    public static void startAlphaAnimation(View v, long duration, int visibility) {

        AlphaAnimation alphaAnimation = (visibility == View.VISIBLE)

                ? new AlphaAnimation(0f, 1f)

                : new AlphaAnimation(1f, 0f);

 

        alphaAnimation.setDuration(duration);

        alphaAnimation.setFillAfter(true);

        v.startAnimation(alphaAnimation);

    }

}




这样联动效果就已经显示出来了, 在AppBar中Toolbar和Title之间的关系, 符合Material的风格, 给用户更多的体验. 既然已经集成到HelloWorld中, 说明Android是极力推荐使用CoordinatorLayout这种风格的.


OK, that’s all! Enjot it!


专栏作者简介( 点击 → 加入专栏作者 


Spike:硕士毕业, 任职于春雨移动健康, 从事移动端架构工作. 做了六年技术研发, 还会一直坚持下去. 分享一些自己的开发经验.

打赏支持作者写出更多好文章,谢谢!