细数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(); } });
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
- 细数RxBinding的各种优雅响应式绑定
- 使用RxBinding响应控件的异步事件
- 使用RxBinding响应控件的异步事件
- 使用RxBinding响应控件的异步事件
- RxBinding详解: 规范而强大的安卓UI响应式编程
- RxBinding详解: 规范而强大的安卓UI响应式编程
- RXBinding 绑定View
- RxBinding的使用,实现数据和View的绑定
- RxBinding的使用,实现数据和View的绑定
- RxBinding的使用,实现数据和View的绑定
- rxbinding各种引入
- Android学习笔记 十六 使用RxBinding响应控件的异步事件
- RxBinding的使用
- RxBinding的实现原理
- 004.RxBinding的使用
- Rxbinding的使用
- RxJava2+Retrofit+RxBinding解锁各种新姿势
- Vue实现双向绑定的原理以及响应式数据
- 2016CCPC-Fianl宁波流水账
- Oracle基础
- 权限控制
- How to Use Procedure
- 计算机学习的三条主线
- 细数RxBinding的各种优雅响应式绑定
- linux命令行日常系快捷键
- 怎么查看Oracle数据库中的所有用户名
- Java面向对象
- Interlude: Troubleshooting for 'no corresponding BEGIN TRANSACTION'
- eclipse使用egit插件管理git库
- VB调用摄像头录像,拍照,保存
- Eclipse使用入门教程
- unity接sdk,微信支付的时候重启游戏