Scoop 开源框架

2017-08-11  本文已影响0人  踏雪风暴

Scoop 是一个用于构建基于视图的模块化Android应用的微型框架。

image.png

五大核心组成:

1.Router
允许您在屏幕之间导航和维护后栈的对象。
2.View controllers
一个新的构建块,使用它来取代Activity和Fragment
3.Layouts
同View controllers,使用它来取代Activity和Fragment
4.Scoops ("Scopes")
管理程序的依赖和生命周期
5.Transitions
从一个视图移动到另一个视图之间的动画。提供了一组基本的过渡,如右滑、左等。另外,还可以创建自己的自定义转换。

Screen

指定要显示的View controllers或Layouts,以及想要传递给 View controllers 或 Layouts的可选数据。

Screen screen = new MyScreen(new MyData("foo"));
router.goTo(screen);
@ViewController(MyController.class)
public class MyScreen extends Screen {
}

Router 涉及5个常用的方法:
1.goTo
前往指定的Screen,并将其添加至 后退栈
2.replaceWith
前往指定的Screnn,并将替换掉 后退栈顶部的 Screen
3.replaceAllWith
用特定的 Screens 集合 替换掉该后退栈Screen,并前往 集合的 last Screen
4.resetTo
前往指定的Screen,并将其添加至 后退栈,并且从后退栈中 删除该Screen后面的所有 Screens。
5.goBack
前往上一个Screen

Router 不直接跟 Views 依赖,Router 可以发送一个可以监听的事件。
Scoop 涉及 可扩展的 UIContainer,UIContainer 可以管理 View Controllers 和 Transitions

ViewController

取代Activity和Fragment,需要指定布局 id,以及实现生命周期方法。其生命周期的状态只有两个:附加、分离。

@ViewController(MyController.class)
public class MyScreen extends Screen {
}
public class MyController extends ViewController {

    @Override
    protected int layoutId() {
        return R.layout.xxx;
    }

    @Override
    public void onAttach() {
        super.onAttach();
    }

    @Override
    public void onDetach() {
        super.onDetach();

    }

    @OnClick(R.id.xxx)
    public void doSomething() {

    }
}

这里用到了ButterKnife 开源项目。

ViewController 与 Android、fragments最大的不同之处:在 Scoop中,不会将 ViewController 放置到内存中,每当移除到一个新的 Screen 时,原来附加 的 ViewController 会分离。

Layout

注解 Layout 的作用可以认为与 注解 ViewController 相似,可以完成相同的目的。但是该种方法在Controller 和 View 之前具有更高的耦合度,因此不被推荐。

Scoops

Scoop又称为Scope,主要用途是提供 命名 Services 的访问。当创建了一个Scoop后,可以访问其父类的Services

Scoop rootScoop = new Scoop.Builder("root")
        .service(MyService.SERVICE_NAME, myService)
        .build();

Scoop childScoop = new Scoop.Builder("child", rootScoop)
        .service(MyService.SERVICE_NAME, myService2)
        .service(OtherService.SERVICE_NAME, otherService)
        .build();

Scoop 内部的逻辑:当尝试使用Scoop 查找Sevices时,会优先查找自身的Sevices,如果没有时,才会重复的向上查找。

当一个Scoop 不在需要时,可以 调用 childScoop.destroy(); 销毁掉Scoop,销毁的逻辑:删除所有的Services ,以及调用 子 Scoop的 destory。

Transitions

Transitions 完成从一个ViewController 到另一个 ViewController的转场动画。这里提供了4中动画效果:
1.后滑效果;2.前滑效果;3.下滑效果;4.上滑效果;5.变色效果

为了使用 Transitions,需要ViewController重写 enterTransition() 和 exitTransition() 方法。

public class MyController extends ViewController {

    @Override
    protected ScreenTransition enterTransition() {
        return new ForwardSlideTransition();
    }

    @Override
    protected ScreenTransition exitTransition() {
        return new BackwardSlideTransition();
    }

    ...
}

当然如果没有指定转场动画,则会使 立即切换 View。当然也可以自定义Transitions,自定义Transitions 需要实现 ScreenTransition 接口。

public class AutoTransition implements ScreenTransition {

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    @Override
    public void translate(final ViewGroup root, final View from, final View to, final TransitionListener transitionListener) {

        Scene toScene = new Scene(root, to);

        android.transition.AutoTransition transition = new android.transition.AutoTransition();

        transition.addListener(new Transition.TransitionListener() {
            @Override
            public void onTransitionEnd(Transition transition) {
                transitionListener.onTransitionCompleted();
            }

            @Override
            public void onTransitionCancel(Transition transition) {
                transitionListener.onTransitionCompleted();
            }
            ...
        });

        TransitionManager.go(toScene, transition);
    }
}
上一篇下一篇

猜你喜欢

热点阅读