GithubHelp home page GithubHelp logo

easybehavior's Introduction

EasyBehavior

  • 如果你正苦于实现一个酷炫的个人信息页面效果
  • 如果产品要求你实现下拉放大背景图,上滑能看到详细信息
  • 如果还要求一系列同步动画效果
  • 通过Behavior实现它将是你的不二选择,本项目旨在帮助各位轻松实现自己的Behavior!

注意:

  • demo2已在master分支中移除,需要的话请前往backupv1分支,切换版本到低于26
  • androidx适配版本已发布,请拉取androidx分支

博文地址

 例子1 链接  例子2 链接


DEMO下载

效果图

EasyBehavior CoAliBehavior

例子的实现

注意:以下内容可能引起您的轻度不适(xing fen),请慎重阅读,例子中呢,用到了两个Behavior。

1.用户头像的放大以及缩小,按照上面的方法,我们可以很明白的知道实现步骤了

  • 继承
public class CircleImageInUsercBehavior extends CoordinatorLayout.Behavior<CircleImageView> {
  • 重写onDependentViewChanged,
    //当dependency变化的时候调用
    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, CircleImageView child, View dependency) {
        //初始化一些基础参数
        init(parent, child, dependency);
        //计算比例
         ...
        //设置头像的大小
        ViewCompat.setScaleX(child, percent);
        ViewCompat.setScaleY(child, percent);
        return false;
    }

啊?这样就搞定了?是的!就是这么easy!!
这里写图片描述
那我有一个问题了,是不是说每一个view想要做跟随动画,都得创建一个相应的Behavior呢?答案很明显是NO~!
看完下一个例子你就会明白了


2.这个Behavior用途主要有以下3点:

  • 控制背景图的放大以及回弹
  • 中间middle部分跟随背景图的放大缩小做相应的移动
  • Toolbar的背景Alpha的改变

第一步:初始化参数,通过tag查找每一个View,这里需要注意,我们需要在布局文件中,每个相应的View都需要声明相同的tag 如 android:tag="你的tag",当然,也可以用原始的findViewById,这里只是希望id改动时,我们的Behavior可以不受到影响

    @Override
    public boolean onLayoutChild(CoordinatorLayout parent, AppBarLayout abl, int layoutDirection) {
       ...
        if (mToolBar == null) {
            mToolBar = (Toolbar) parent.findViewWithTag(TAG_TOOLBAR);
        }
        ...
        abl.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
       ...//实现Toolbar的背景变化
        });
       ...
    }

第二步:开始scale动画(下拉上划滑动过程中)

    @Override
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, int dx, int dy, int[] consumed) {
        if (!isRecovering) {//未在回弹动画中,开始我们的变化动画
            if (...) {
                scale(child, target, dy);
                return;
            }
        }
        super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed);
        
    @Override
    public boolean onNestedPreFling(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target, float velocityX, float velocityY) {
        if (velocityY > 100) {//当y速度>100,就秒弹回
            isAnimate = false;
        }
        return super.onNestedPreFling(coordinatorLayout, child, target, velocityX, velocityY);
    }
    }

第三步:松手的回弹

    @Override
    public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout abl, View target) {
        recovery(abl);//回弹,这个方法详细请看源码
        super.onStopNestedScroll(coordinatorLayout, abl, target);
    }

ok,步骤就是这样,是不是很easy呢?


附:AppBarLayout的跟随动画,不仅仅是上面的一种方式 我们也可以在逻辑代码中通过原生的Listener来实现

mAppBarLayout.addOnOffsetChangedListener(new AppBarLayout.OnOffsetChangedListener() {
            @Override
            public void onOffsetChanged(AppBarLayout appBarLayout, int verticalOffset) {
            //计算进度百分比
                float percent = Float.valueOf(Math.abs(verticalOffset)) / Float.valueOf(appBarLayout.getTotalScrollRange());
                ...//根据百分比做你想做的
            }
        });

License


Copyright (C) 2017 JmStefanAndroid

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

easybehavior's People

Contributors

jmstefanandroid avatar liuyibin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

easybehavior's Issues

求指教

06-28 17:44:31.639 14638-14638/? E/dalvikvm: VM aborting
06-28 17:44:31.639 14638-14638/? A/libc: Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1), thread 14638 (an.easybehavior)

沉浸式怎么处理

你好,当图1往上滑动的时候,顶部的状态栏直接就是黑色的了,请问这个应该怎么修改?
image
4.4以上可以实现沉浸式吗

有bug

APP启动就闪退

06-28 15:28:20.256 6134-6134/me.stefan.easybehavior E/dalvikvm: Could not find class 'android.graphics.drawable.RippleDrawable', referenced from method android.support.v7.widget.AppCompatImageHelper.hasOverlappingRendering
06-28 15:28:20.309 6134-6134/me.stefan.easybehavior E/dalvikvm: VM aborting
06-28 15:28:20.309 6134-6134/me.stefan.easybehavior A/libc: Fatal signal 6 (SIGABRT) at 0x000017f6 (code=-6), thread 6134 (an.easybehavior)

Demo2中有个bug,当下滑刷新后,刷新即将完成时,轻轻上滑,就会出现刷新完成但是 SmileView(笑脸)没有隐藏的情况

这种情况出现的概率还是比较大的,大神可以解决一下吗?
出现这个bug后,我再次下滑刷新(打断点)当刷新完成时,发现问题出在onStopNestedScroll 方法里的recovery方法。 该方法 的 第二行 代码 mFingerMoveDy 属性对应的值是终是 0.0 , 也就是说第二行代码条件不成立,而

private void recovery(final AppBarLayout abl) {
        if (isRecovering) return;
        if (mFingerMoveDy > 0) {
             ...
        }else{
        // 应该是  else的情况你没作处理 ,导致的该bug吧 ?
        }

对应的bug视频观看地址:

AndroidX 新的API上表现出bug

你好,AndroidX下拉放大图片的时候,马上放手然后快速惯性轻轻往上滑会出现,中间middle的布局网上滑动,但是viewpager content 的布局没有移动,最后导致中间留了很大的空白面积,请问有没有解决方法

一些问题请教

首先感谢提供这么好的demo学习
①AppBarLayoutOverScrollViewBehavior中,这里的mLastBottom获取逻辑不是很懂AppBarLayoutOverScrollViewBehavior的129行
②关于onStartNestedScroll回调时机的问题,一次滑动为什么会回调两次?
③DisInterceptNestedScrollView是否一定要集成NestedScrollView?

你好

请问移到自己项目有什么要注意的,会非常卡顿

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.