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

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

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐福记456

您的鼓励和肯定是我创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值