细数RxBinding的各种优雅响应式绑定

来源:互联网 发布:linux vi显示行数 编辑:程序博客网 时间:2024/06/06 01:46

RxBinding出自Square公司的Jake Wharton大神之手,往往是结合RxJava一起使用。RxBinding的核心是RxView,它包含:attaches、detaches、clicks、drags、draws、focusChanges、globalLayouts、hovers、layoutChanges、longClicks、scrollChangeEvents、systemUiVisibilityChanges、touches、activated、clickable、enabled、pressed、selected、visibility等与View有关的事件。本文主要介绍常用的RxView相关方法:点击、长按、布局变化、滑动、绘制。

需要导入依赖包:

    compile 'io.reactivex:rxandroid:1.2.1'    compile 'io.reactivex:rxjava:1.2.1'    compile 'com.jakewharton.rxbinding:rxbinding:0.4.0'

1、clicks点击事件:

RxView.clicks(btn_click)        .subscribe(new Action1<Void>() {            @Override            public void call(Void aVoid) {                Toast.makeText(getApplicationContext(), "this is onClick", Toast.LENGTH_SHORT).show();            }        });

这样就可以监听button的点击事件。如果短时间反复点击,又不想每次都相应点击事件该怎么办呢?Jake Wharton考虑到了这点,干脆在里面设置定时器,在设定时间内只响应首次(throttleFirst)或者末次(throttleLast)的点击事件。只响应首次点击可以这样写:

RxView.clicks(btn_click)        .throttleFirst(5, TimeUnit.SECONDS)//设置5s内丢弃新点击事件,按钮去抖动        .subscribe(new Action1<Void>() {            @Override            public void call(Void aVoid) {                Toast.makeText(getApplicationContext(), "this is onClick", Toast.LENGTH_SHORT).show();            }        });

如果只想在特定时间监听事件,完了之后不再需要监听又该怎么办呢?可以利用subscription 取消订阅:

Action1 clickAction = new Action1<Void>() {    @Override    public void call(Void aVoid) {        count ++;        if(count == 5)            subscription.unsubscribe();//取消订阅        Toast.makeText(getApplicationContext(), "this is onClick", Toast.LENGTH_SHORT).show();    }};subscription = RxView.clicks(btn_click)    .throttleFirst(5, TimeUnit.SECONDS)//设置5s内丢弃新点击事件,按钮去抖动    .subscribe(clickAction);

2、longClicks长按事件:

RxView.longClicks(btn_long_click)        .throttleFirst(5, TimeUnit.SECONDS)        .subscribe(new Action1<Void>() {            @Override            public void call(Void aVoid) {                Toast.makeText(getApplicationContext(), "this is onLongClick", Toast.LENGTH_SHORT).show();            }        });


3、layoutChanges事件:

RxView.layoutChanges(btn_bind)        .subscribe(new Action1<Void>() {            @Override            public void call(Void aVoid) {                Toast.makeText(getApplicationContext(), "layoutChange", Toast.LENGTH_SHORT).show();            }        });RxView.clicks(btn_layout)        .throttleFirst(5, TimeUnit.SECONDS)        .subscribe(new Action1<Void>() {            @Override            public void call(Void aVoid) {                btn_bind.layout(btn_bind.getLeft() + 50, btn_bind.getTop(), btn_bind.getRight() + 50, btn_bind.getBottom());            }        });

点击一个btn_layout按钮改变btn_bind按钮的layout布局,btn_bind按钮在监听布局变化事件,然后在call方法里面回调布局变化处理。

4、draws绘制事件:

RxView.draws(mView)        .subscribe(new Observer<Void>() {            @Override            public void onCompleted() {            }            @Override            public void onError(Throwable e) {            }            @Override            public void onNext(Void aVoid) {                Toast.makeText(getApplicationContext(), "onDraw", Toast.LENGTH_SHORT).show();            }        });RxView.clicks(btn_draw)        .throttleFirst(5, TimeUnit.SECONDS)        .subscribe(new Action1<Void>() {            @Override            public void call(Void aVoid) {                mView.getViewTreeObserver().dispatchOnDraw();            }        });

点击btn_draw按钮触发mView的绘制:mView.getViewTreeObserver().dispatchOnDraw()。同时,mView在监听绘制事件,在onNext方法回调绘制处理。


5、scrollChange事件:

RxView.scrollChangeEvents(btn_bind)        .subscribe(new Observer<ViewScrollChangeEvent>() {            @Override            public void onCompleted() {            }            @Override            public void onError(Throwable e) {            }            @Override            public void onNext(ViewScrollChangeEvent viewScrollChangeEvent) {                Toast.makeText(getApplicationContext(), "onScroll", Toast.LENGTH_SHORT).show();            }        });RxView.clicks(btn_scroll)        .throttleFirst(5, TimeUnit.SECONDS)        .subscribe(new Action1<Void>() {            @Override            public void call(Void aVoid) {                count += 10;                if(count == 100)                    count = 0;                btn_bind.scrollTo(count, 0);            }        });

点击btn_scroll按钮改变btn_bind按钮坐标位置。同时btn_bind按钮在监听滑动事件,在onNext方法里回调滑动处理。并且viewScrollChangeEvent可以调用getScrollX方法获得X轴的滑动位移,getScrollY方法获得Y轴的滑动位移。

好了,RxBinding的常用事件响应式绑定介绍完了。大家如果感兴趣,可以自己倒腾下,享受响应式编程带来的乐趣。更多详情请查看官网:点击打开链接

0 0
原创粉丝点击