Android UI性能极限库-真正的响应零延迟(快到飞)

本片文章将介绍笔者一个新的开源库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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值