• rxbinding



    介绍

    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'
        }
    
    • 1
    • 2
    • 3
    • 4

    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'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    implementation 'com.jakewharton.rxbinding3:rxbinding-material:3.0.0-alpha2'
    
    • 1

    举例 单点 并不可重复点击

            rxViewGcUtil.add(
    				RxView.clicks(binding.btnRescue)
                    .throttleFirst(1, TimeUnit.SECONDS)
                    .subscribe(unit -> WebActivity.newRescue(getContext()))
                    );
    
    • 1
    • 2
    • 3
    • 4
    • 5

    因为是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;
            }
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    RxView 操作

    转载自:https://www.jianshu.com/p/1ad3633ef0b4

    显隐

    RxView.visibility(binding.input).accept(true);   ==     bt_1.setVisibility(value ? View.VISIBLE : View.GONE);
    
    • 1

    长按

     RxView.longClicks(bt_1)  ==   bt_1.setOnLongClickListener(new View.OnLongClickListener() {
    
    • 1

    View被添加

    RxView.attaches(bt_1);
    
    • 1

    View被添加时触发

    RxView.attachEvents(bt_1)
    
    • 1

    View被移除

    RxView.detaches(bt_1);
    
    • 1

    View拖拽

      RxView.drags(ll_demo)
              .subscribe(new Consumer<DragEvent>() {
                  @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;
                      }
                  }
              });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    View重绘

    RxView.draws(view_demo) == view_demo.getViewTreeObserver().addOnDrawListener(new ViewTreeObserver.OnDrawLis
    
    • 1

    globalLayouts 监听布局改变

    RxView.globalLayouts(rootview) ==  rootview.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTre
    
    • 1

    focusChanges 监听焦点变化

      RxView.focusChanges(et_demo)  ==  et_demo.setOnFocusChangeListener(new View.OnFocusChange
    
    • 1

    keys 按键被按下

    RxView.keys(et_demo) == et_demo.setOnKeyListener(new View.OnKeyListener() {
    
    • 1

    hovers 悬停事件

    layoutChanges和layoutChangeEvents 组件布局参数发生改变

    RxView.layoutChanges(rootview) 
     RxView.layoutChangeEvents(rootview)
    
    	==  rootview.addOnLayoutChangeListener(new View.OnLayoutChangeListener() 
    
    • 1
    • 2
    • 3
    • 4

    preDraws 将要绘制时

     RxView.preDraws(view_demo, new Func 
    
    	 ==  view_demo.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreD
    
    • 1
    • 2
    • 3

    滚动事件

     RxView.scrollChangeEvents(view_demo)
    	
    	 == view_demo.setOnScrollChangeListener(new View.OnScrollChangeLis
    
    • 1
    • 2
    • 3

    systemUiVisibilityChanges 状态栏和导航栏可见和隐藏

     RxView.systemUiVisibilityChanges(rootview) 
    
    	== rootview.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChange
    
    • 1
    • 2
    • 3

    touches 触摸事件

     RxView.touches(et_demo) == et_demo.setOnTouchListener(new View.OnTouchLis
    
    • 1

    例:

            RxView.touches(binding.btnLock, new Function1<MotionEvent, Boolean>() {
                        @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,走这里" );
                    });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    如果不需要拦截事件,就需要把事件传递下去,touches方法默认拦截

    binding.btnDefault.onTouchEvent(motionEvent);
    
    • 1

    RxTextView

    在这里插入图片描述

    EditText 文本变化监听

        RxTextView.beforeTextChangeEvents(et_demo)
        RxTextView.textChangeEvents(et_demo)
        RxTextView.afterTextChangeEvents(et_demo)
    
    		==   et_demo.addTextChangedListener(new TextWatcher() {
    
    • 1
    • 2
    • 3
    • 4
    • 5

            rxViewGcUtil.add(RxTextView.textChanges(binding.input).subscribe(new Consumer<CharSequence>() {
                @Override
                public void accept(CharSequence charSequence) throws Exception {
                    
                }
            }));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    editorActions和editorActionEvents

      RxTextView.editorActions(et_demo)
          RxTextView.editorActionEvents(et_demo)
    
    ==    et_demo.setOnEditorActionListener(new TextView.OnEditorActionList
    
    • 1
    • 2
    • 3
    • 4

    RxViewGroup

    当viewgroup添加或者删除子view时触发

        rootview.addView(view);
        rootview.removeView(view);
    
    • 1
    • 2
        RxViewGroup.changeEvents(rootview)
    ==   rootview.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeL
    
    • 1
    • 2

    RxToolbar

    navigationClicks

    RxToolbar.navigationClicks(toolbar_normal
    
    	== toolbar_normal.setNavigationOnClickListener(new View.OnCl
    
    • 1
    • 2
    • 3

    itemClicks

    RxToolbar.itemClicks(toolbar_normal).
    
    	==toolbar_normal.setOnMenuItemClickListener(new Toolbar.OnMen
    
    • 1
    • 2
    • 3

    RxMenuItem

    clicks

    RxMenuItem.clicks(menuItem)
    
    • 1

    actionViewEvents

    RxMenuItem.actionViewEvents(menuItem)
    
    • 1

    RxRadioGroup

    checkedChanges 监听选中变化

    RxRadioGroup.checkedChanges(radio_g).
    
    	==radio_g.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListene
    
    • 1
    • 2
    • 3

    checked 选择单选按钮

    RxRadioGroup.checked(radio_g).accept(radioButton2.getId());
    
    	==    radio_g.check(radioButton2.getId());
    
    
    • 1
    • 2
    • 3
    • 4

    RxCompoundButton

    RxCompoundButton.checkedChanges(radioButton1)
    
    == radioButton1.setOnCheckedChangeListener(new CompoundButton.OnCheckedCha
    
    • 1
    • 2
    • 3

    RxAutoCompleteTextView

     RxAutoCompleteTextView.itemClickEvents(auto_tv)
    
    • 1

    RxPopupMenu

    RxPopupMenu.itemClicks(popupMenu)
    
    	== popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClick
    
    • 1
    • 2
    • 3
     RxPopupMenu.dismisses(popupMenu).subs
    
    	==popupMenu.setOnDismissListener(new PopupMenu.OnDismissLis
    
    • 1
    • 2
    • 3

    RxAdapter、RxAbsListView、RxAdapterView

        //适配器Adapter数据改变
        RxAdapter.dataChanges();
        //绝对视图滚动事件
        RxAbsListView.scrollEvents();
    
        RxAdapterView.selectionEvents();
    
        RxAdapterView.itemSelections();
    
        RxAdapterView.itemClicks();
    
        RxAdapterView.itemLongClicks();
    
        RxAdapterView.itemLongClickEvents();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    RxSeekBar

        RxSeekBar.userChanges(seekBar)
    
        RxSeekBar.systemChanges(seekBar)
    
        RxSeekBar.changeEvents(seekBar)
    
        RxSeekBar.changes(seekBar).
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    RxRatingBar

        //星级滚动条进度改变事件
        RxRatingBar.ratingChanges();
        //星级滚动条进度改变事件
        RxRatingBar.ratingChangeEvents();
    
    • 1
    • 2
    • 3
    • 4

    RxSearchView

    queryTextChanges 输入文本监听,文本变化后的文本

    RxSearchView.queryTextChanges(search_view)
    
    • 1

    queryTextChangeEvents

      RxSearchView.queryTextChangeEvents(search_view).subscribe(new Consumer<SearchViewQueryTextEvent>() {
          @Override
          public void accept(SearchViewQueryTextEvent searchViewQueryTextEvent) throws Exception {
              if(searchViewQueryTextEvent.isSubmitted()){
                  //提交后的处理
    
              }else{
                  //输入文本监听
    
              }
          }
      });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    query

      try {
          //设置SearchView的初始值
          RxSearchView.query(search_view, true).accept("asd");
      } catch (Exception e) {
          e.printStackTrace();
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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'
    
    • 1

    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'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Google ‘material’ library bindings:

    implementation 'com.jakewharton.rxbinding4:rxbinding-material:4.0.0'
    
    • 1

    总结

    参考地址

    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

  • 相关阅读:
    php中mcrypt_encrypt升级到openssl_encrypt
    网络层:控制平面
    R 语言Analyzing wine data
    【HUAWEI】trunk和access两种链路模式实例
    leetcode 655. 输出二叉树(java)
    RabbitMQ Windows 安装、配置、使用 - 小白教程
    21天打卡挑战 - 经典算法之快速排序
    Python 基础语法
    卡音(安卓)
    Spring 源码(4)在Spring配置文件中自定义标签如何实现?
  • 原文地址:https://blog.csdn.net/weixin_35691921/article/details/117353426