本片文章将介绍笔者一个新的开源库ShareView
ShareView
一个用View模拟Acitivty的栈结构及多状态灵活切换的管理库,实现了页的生命周期,懒加载, 预加载, 切换动画。 集成调用,大幅减少代码量。
库诞生契机
团队中使用的传统MVP+Fragmen有个头疼的地方, 每个页面基本都要创建一个Fragment,并且这些Fragment之间基本都需要数据交互, 有了EventBus后虽然大幅减少了数据传递的难度但是满地的Subscirbe真的让人很难受,针对一个参数配置界面更是头疼,由于配置项较多都需要新开一个界面, 开了后也就只是配置一个参数或者只调一个接口,大部分时间都花在创建Presenter和Model上<__>
如果直接创建一个View,View太多数据不好管理,还需要手动实现各个动画,那么为何不封装一个库来完成这些需求呢?
性能的提升
传统方式:
1: 其他子线程耗时操作 -> 无
1: 点击
2: 加载
3: 跳转
ShareView:
1: 其他子线程耗时操作->主线程加载
2: 点击
3: 跳转
使用场景
主页以外的衍生页都可以用ShareView实现,避免耦合度过高同时减少代码量数据提升用户体验,可能会复用的UI不建议使用
用法
TaskDelegate栈效果
创建一个ShareView
<FrameLayout
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.ailiwean.lib.ShareView
android:id="@+id/shareView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
创建栈结构对应Adapter
public class AAdapter extends TaskAdapter {
public static int CONTENT = 1;
@Override
public int getLayoutId() {
return R.layout.aa;
}
@Override
public int getType() {
return CONTENT;
}
@Override
public void init(final TaskViewHolder vh) {
}
@Override
public void lazy(TaskViewHolder vh) {
}
@Override
public void preload(TaskViewHolder vh) {
}
@Override
public int getFrontType() {
return super.getFrontType();
}
@Override
public boolean leaveRetain() {
return false;
}
}
- getLayoutId() : 提供一个LayoutID
- getType() : 提供该页的Key
- init() : 初始化时调用一次,当View销毁会重新调用
- lazy() : 延迟初始化(View完全展示)
- preload() : 预加载的实现执行子线程耗时等待操作时可预先加载 其他页面的View
- getFrontType() : 标记前一个页面的Type,根页无需实现
- leaveRetain() : 该页退出后是否保留, false即销毁重建
数据类型订阅
在Adapter内部调用subscribe注册
@Override
public void init(final TaskViewHolder vh) {
subscribe(new TaskObserve<String>() {
@Override
public void response(TaskViewHolder vh, String s) {
}
});
subscribe(new TaskObserve<Integer>() {
@Override
public void response(TaskViewHolder vh, Integer integer) {
}
});
}
发布事件
vh.getShareView().postData(CONTENT, "Hello Word");
vh.getShareView().postData(OTHER, 2);
为该页单独设定动画
@Override
public void init(final TaskViewHolder vh) {
bindAnimation(new DefaultAnim(400) {
@Override
public int taskTopEnter() {
return AnimHelper.ALPHA_UP_SHOW;
}
@Override
public int taskTopExit() {
return AnimHelper.ALPHA_DOWN_HIDE;
}
@Override
public int taskInnerEnter() {
return AnimHelper.RIGHT_HALF_SHOW;
}
@Override
public int taskInnerExit() {
return AnimHelper.LEFT_HALF_HIDE;
}
});
}
- taskTopEnter : 顶部页的进入动画
- taskTopExit :顶部页的退出动画
- taskInnerEnter :底部页的进入动画
- taskInnerExit : 底部页的退出动画
默认动画
//无动画
public static final int NULL = 0;
//透明下退出
public static final int ALPHA_DOWN_HIDE = 10000;
//透明上进入
public static final int ALPHA_UP_SHOW = 100001;
//右退出
public static final int RIGHT_ALL_HIDE = 100002;
//左进入
public static final int LEFT_ALL_SHOW = 100003;
//右一半进入
public static final int RIGHT_HALF_SHOW = 100004;
//左一半退出
public static final int LEFT_HALF_HIDE = 100005;
注册监听
@Override
public void init(final TaskViewHolder vh) {
addLifeListener(new LifeListener<TaskViewHolder>() {
@Override
public void onVisiable(TaskViewHolder vH) {
}
@Override
public void onHide(TaskViewHolder vH) {
}
});
}
绑定Adapter
shareTask.getTaskDelegate()
.regAdapter(new BAdapter())
.cp()
.regAdapter(new CAdapter())
.cp()
.regAdapter(new AAdapter())
.cp()
.go();
Adapter对外开放
shareTask.getTaskDelegate()
.regAdapter(new BAdapter())
.subscibe(new TaskObserve<Object>() {
})
.addLifeListener(new LifeListener<TaskViewHolder>() {
})
.cp()
.regAdapter(new CAdapter())
.cp()
.regAdapter(new AAdapter())
.cp()
.go();
Adapter会将构建好的Build返回,使用于依赖外部场景对象。
启动页面
传入对应Type
shareTask.goTo(OTHER);
页面预加载
调用一次回调一次preload()方法,View不存在时创建View
shareTask.preload(OTHER);
回退栈
按照如下处理, 返回true时表示未在栈底由内部消费。
@Override
public void onBackPressed() {
if (shareTask.back())
return;
super.onBackPressed();
}
Api说明
.setDefault() //设置默认type, 栈模式无效
.isLazyLoad() //是否懒加载, false会创建所有View
.isReuseLayout() //是否复用View, 栈模式无效
.bindCommonAnimation() //绑定一个全局动画
扩展
自定义动画
CustomAnim anim1 = new CustomAnim() {
@Override
protected void animEnter(View pageView, boolean isTopTask) {
}
@Override
protected void animExit(View pageView, boolean isTopTask) {
}
};
pageView是要操作的View,isTopTask区分是否是否顶部。方法体内可自由发挥。
注意:
- animEnter里动画开始前先调用finalEnterAnimStar() 传入回调的两个参数,结束后调用finalEnterAnimEnd()。
- animExit里动画开始前先调用finalExitAnimStar(),结束后调用finalExitAnimEnd()。
ViewHolder
为了方便操作不再使用头疼的引用所以增加了ViewHolder,持有各个View 提供快捷操作
MultiDelegate多状态效果
其实就是TaskDelegate去掉动画效果的阉割版, 不过用来写多个状态的布局还是非常好用。逻辑非常清晰。可以将多状态的公共操作单独出来,放成一个type, 然后注册的其他type做自己单独的操作。 布局共用一个,使用复用模式即可isReuseLayout(true)。
传送门
传送门 欢迎Star