rxbinding
介绍Rxbinding 3.0引入依赖举例 单点 并不可重复点击RxView 操作显隐长按View被添加View被添加时触发View被移除View拖拽View重绘globalLayouts 监听布局改变focusChanges 监听焦点变化keys 按键被按下hovers 悬停事件layoutChanges和layoutChangeEvents 组件布局参数发生改变preDraws 将要绘制时滚动事件systemUiVisibilityChanges 状态栏和导航栏可见和隐藏touches 触摸事件
RxTextViewEditText 文本变化监听editorActions和editorActionEvents
RxViewGroupRxToolbarnavigationClicksitemClicks
RxMenuItemclicksactionViewEvents
RxRadioGroupcheckedChanges 监听选中变化checked 选择单选按钮RxCompoundButtonRxAutoCompleteTextViewRxPopupMenu
RxAdapter、RxAbsListView、RxAdapterViewRxSeekBarRxRatingBarRxSearchView
Rxbinding 4.0
参考地址
介绍
RxBinding 是 Jake Wharton 的一个开源库,它提供了一套在 Android 平台上的基于 RxJava的 Binding API。 RxBinding 是对 Android View 事件的扩展,它帮助我们可以对 View 事件使用 RxJava 的各种操作; RxBinding 提供了与 RxJava 一致的回调,简化了代码; 几乎支持所有的常用控件及事件; 支持 Kotlin;
Rxbinding 3.0
rxbinding 3 需要AndroidX
引入依赖
implementation ('com.jakewharton.rxbinding3:rxbinding:3.0.0') {
exclude module: 'rxjava'
exclude module: 'rxandroid'
}
rxbinding 默认会引入rxjava、rxandroid。如果项目内有自己的rx组件,需要刨包。
其他依赖,可以扩展:
implementation 'com.jakewharton.rxbinding3:rxbinding-core:3.0.0-alpha2'
implementation 'com.jakewharton.rxbinding3:rxbinding-appcompat:3.0.0-alpha2'
implementation 'com.jakewharton.rxbinding3:rxbinding-drawerlayout:3.0.0-alpha2'
implementation 'com.jakewharton.rxbinding3:rxbinding-leanback:3.0.0-alpha2'
implementation 'com.jakewharton.rxbinding3:rxbinding-recyclerview:3.0.0-alpha2'
implementation 'com.jakewharton.rxbinding3:rxbinding-slidingpanelayout:3.0.0-alpha2'
implementation 'com.jakewharton.rxbinding3:rxbinding-swiperefreshlayout:3.0.0-alpha2'
implementation 'com.jakewharton.rxbinding3:rxbinding-viewpager:3.0.0-alpha2'
implementation 'com.jakewharton.rxbinding3:rxbinding-material:3.0.0-alpha2'
举例 单点 并不可重复点击
rxViewGcUtil.add(
RxView.clicks(binding.btnRescue)
.throttleFirst(1, TimeUnit.SECONDS)
.subscribe(unit -> WebActivity.newRescue(getContext()))
);
因为是Rx结构,Disposable肯定处理,下面是小小的封装,集中管理Disposable
public class RxViewGcUtil {
private CompositeDisposable compositeDisposable;
public RxViewGcUtil() {
compositeDisposable = new CompositeDisposable();
}
public void add(Disposable disposable) {
if (disposable != null)
compositeDisposable.add(disposable);
}
private void delete(Disposable disposable) {
if (compositeDisposable != null) {
compositeDisposable.delete(disposable);
}
}
public void clear() {
if (compositeDisposable != null) {
compositeDisposable.clear();
compositeDisposable = null;
}
}
}
RxView 操作
转载自:https://www.jianshu.com/p/1ad3633ef0b4
显隐
RxView.visibility(binding.input).accept(true); == bt_1.setVisibility(value ? View.VISIBLE : View.GONE);
长按
RxView.longClicks(bt_1) == bt_1.setOnLongClickListener(new View.OnLongClickListener() {
View被添加
RxView.attaches(bt_1);
View被添加时触发
RxView.attachEvents(bt_1)
View被移除
RxView.detaches(bt_1);
View拖拽
RxView.drags(ll_demo)
.subscribe(new Consumer
@Override
public void accept(DragEvent event) throws Exception {
//获取事件
int action = event.getAction();
switch (action) {
case DragEvent.ACTION_DRAG_STARTED:
Log.d("aaa", "开始拖拽");
break;
case DragEvent.ACTION_DRAG_ENDED:
Log.d("aaa", "结束拖拽");
break;
case DragEvent.ACTION_DRAG_ENTERED:
Log.d("aaa", "拖拽的view进入监听的view时");
break;
case DragEvent.ACTION_DRAG_EXITED:
Log.d("aaa", "拖拽的view离开监听的view时");
ll_demo.setBackgroundColor(Color.parseColor("#303F9F"));
break;
case DragEvent.ACTION_DRAG_LOCATION:
float x = event.getX();
float y = event.getY();
ll_demo.setBackgroundColor(Color.GRAY);
Log.i("aaa", "拖拽的view在监听view中的位置:x =" + x + ",y=" + y);
break;
case DragEvent.ACTION_DROP:
Log.i("aaa", "释放拖拽的view");
if(event != null && event.getLocalState() != null){
View localState = (View) event.getLocalState();
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
((ViewGroup) localState.getParent()).removeView(localState);
ll_demo.addView(localState, layoutParams);
}
break;
}
}
});
View重绘
RxView.draws(view_demo) == view_demo.getViewTreeObserver().addOnDrawListener(new ViewTreeObserver.OnDrawLis
globalLayouts 监听布局改变
RxView.globalLayouts(rootview) == rootview.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTre
focusChanges 监听焦点变化
RxView.focusChanges(et_demo) == et_demo.setOnFocusChangeListener(new View.OnFocusChange
keys 按键被按下
RxView.keys(et_demo) == et_demo.setOnKeyListener(new View.OnKeyListener() {
hovers 悬停事件
layoutChanges和layoutChangeEvents 组件布局参数发生改变
RxView.layoutChanges(rootview)
RxView.layoutChangeEvents(rootview)
== rootview.addOnLayoutChangeListener(new View.OnLayoutChangeListener()
preDraws 将要绘制时
RxView.preDraws(view_demo, new Func
== view_demo.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreD
滚动事件
RxView.scrollChangeEvents(view_demo)
== view_demo.setOnScrollChangeListener(new View.OnScrollChangeLis
systemUiVisibilityChanges 状态栏和导航栏可见和隐藏
RxView.systemUiVisibilityChanges(rootview)
== rootview.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChange
touches 触摸事件
RxView.touches(et_demo) == et_demo.setOnTouchListener(new View.OnTouchLis
例:
RxView.touches(binding.btnLock, new Function1
@Override
public Boolean invoke(MotionEvent motionEvent) {
if (binding.btnEngine.isSelectedState()) {
return true;
} else {
return false;
}
}
})
.throttleFirst(1, TimeUnit.SECONDS)
.subscribe(unit -> {
AppLogUtils.i(TAG, "当 上面return true,走这里" );
});
如果不需要拦截事件,就需要把事件传递下去,touches方法默认拦截
binding.btnDefault.onTouchEvent(motionEvent);
RxTextView
EditText 文本变化监听
RxTextView.beforeTextChangeEvents(et_demo)
RxTextView.textChangeEvents(et_demo)
RxTextView.afterTextChangeEvents(et_demo)
== et_demo.addTextChangedListener(new TextWatcher() {
例
rxViewGcUtil.add(RxTextView.textChanges(binding.input).subscribe(new Consumer
@Override
public void accept(CharSequence charSequence) throws Exception {
}
}));
editorActions和editorActionEvents
RxTextView.editorActions(et_demo)
RxTextView.editorActionEvents(et_demo)
== et_demo.setOnEditorActionListener(new TextView.OnEditorActionList
RxViewGroup
当viewgroup添加或者删除子view时触发
rootview.addView(view);
rootview.removeView(view);
RxViewGroup.changeEvents(rootview)
== rootview.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeL
RxToolbar
navigationClicks
RxToolbar.navigationClicks(toolbar_normal
== toolbar_normal.setNavigationOnClickListener(new View.OnCl
itemClicks
RxToolbar.itemClicks(toolbar_normal).
==toolbar_normal.setOnMenuItemClickListener(new Toolbar.OnMen
RxMenuItem
clicks
RxMenuItem.clicks(menuItem)
actionViewEvents
RxMenuItem.actionViewEvents(menuItem)
RxRadioGroup
checkedChanges 监听选中变化
RxRadioGroup.checkedChanges(radio_g).
==radio_g.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListene
checked 选择单选按钮
RxRadioGroup.checked(radio_g).accept(radioButton2.getId());
== radio_g.check(radioButton2.getId());
RxCompoundButton
RxCompoundButton.checkedChanges(radioButton1)
== radioButton1.setOnCheckedChangeListener(new CompoundButton.OnCheckedCha
RxAutoCompleteTextView
RxAutoCompleteTextView.itemClickEvents(auto_tv)
RxPopupMenu
RxPopupMenu.itemClicks(popupMenu)
== popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClick
RxPopupMenu.dismisses(popupMenu).subs
==popupMenu.setOnDismissListener(new PopupMenu.OnDismissLis
RxAdapter、RxAbsListView、RxAdapterView
//适配器Adapter数据改变
RxAdapter.dataChanges();
//绝对视图滚动事件
RxAbsListView.scrollEvents();
RxAdapterView.selectionEvents();
RxAdapterView.itemSelections();
RxAdapterView.itemClicks();
RxAdapterView.itemLongClicks();
RxAdapterView.itemLongClickEvents();
RxSeekBar
RxSeekBar.userChanges(seekBar)
RxSeekBar.systemChanges(seekBar)
RxSeekBar.changeEvents(seekBar)
RxSeekBar.changes(seekBar).
RxRatingBar
//星级滚动条进度改变事件
RxRatingBar.ratingChanges();
//星级滚动条进度改变事件
RxRatingBar.ratingChangeEvents();
RxSearchView
queryTextChanges 输入文本监听,文本变化后的文本
RxSearchView.queryTextChanges(search_view)
queryTextChangeEvents
RxSearchView.queryTextChangeEvents(search_view).subscribe(new Consumer
@Override
public void accept(SearchViewQueryTextEvent searchViewQueryTextEvent) throws Exception {
if(searchViewQueryTextEvent.isSubmitted()){
//提交后的处理
}else{
//输入文本监听
}
}
});
query
try {
//设置SearchView的初始值
RxSearchView.query(search_view, true).accept("asd");
} catch (Exception e) {
e.printStackTrace();
}
Rxbinding 4.0
更新于:20210528
RxBinding RxJava binding APIs for Android UI widgets from the platform and support libraries.
Download Platform bindings:
implementation 'com.jakewharton.rxbinding4:rxbinding:4.0.0'
AndroidX library bindings:
implementation 'com.jakewharton.rxbinding4:rxbinding-core:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-appcompat:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-drawerlayout:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-leanback:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-recyclerview:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-slidingpanelayout:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-swiperefreshlayout:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-viewpager:4.0.0'
implementation 'com.jakewharton.rxbinding4:rxbinding-viewpager2:4.0.0'
Google ‘material’ library bindings:
implementation 'com.jakewharton.rxbinding4:rxbinding-material:4.0.0'
参考地址
JakeWharton RxBinding:https://github.com/JakeWharton/RxBinding
ChinaCode:https://gitcode.net/mirrors/JakeWharton/rxbinding?utm_source=csdn_github_accelerator
Rx系列<第二十四篇>:RxJava之RxBinding3.0:https://www.jianshu.com/p/1ad3633ef0b4
文章来源
发表评论