Explorar el Código

0.0.41.beta14

kongzue hace 3 años
padre
commit
bf732d28dd

+ 2 - 0
.idea/misc.xml

@@ -8,7 +8,9 @@
         <entry key="..\:/WorkSpace/Android/DialogXDemo/app/src/main/res/drawable/rect_ios_edit_box_bkg_focus.xml" value="0.425" />
         <entry key="..\:/WorkSpace/Android/DialogXDemo/app/src/main/res/layout/activity_app_compat_test.xml" value="0.5328205128205128" />
         <entry key="..\:/WorkSpace/Android/DialogXDemo/app/src/main/res/layout/activity_main.xml" value="0.5328205128205128" />
+        <entry key="..\:/WorkSpace/Android/DialogXDemo/app/src/main/res/layout/item_custom_recycleview.xml" value="0.5411458333333333" />
         <entry key="..\:/WorkSpace/Android/DialogXDemo/app/src/main/res/layout/layout_custom_dialog.xml" value="0.36944444444444446" />
+        <entry key="..\:/WorkSpace/Android/DialogXDemo/app/src/main/res/layout/layout_custom_scrollview.xml" value="0.5411458333333333" />
         <entry key="..\:/WorkSpace/Android/DialogXDemo/app/src/main/res/layout/layout_custom_view.xml" value="0.5328205128205128" />
         <entry key="..\:/WorkSpace/Android/DialogXDemo/app/src/main/res/layout/layout_full_login.xml" value="0.3824074074074074" />
       </map>

+ 6 - 2
DialogX/src/main/java/com/kongzue/dialogx/dialogs/BottomDialog.java

@@ -33,6 +33,7 @@ import com.kongzue.dialogx.interfaces.DialogXStyle;
 import com.kongzue.dialogx.interfaces.OnBackPressedListener;
 import com.kongzue.dialogx.interfaces.OnBindView;
 import com.kongzue.dialogx.interfaces.OnDialogButtonClickListener;
+import com.kongzue.dialogx.interfaces.ScrollController;
 import com.kongzue.dialogx.util.BottomDialogTouchEventInterceptor;
 import com.kongzue.dialogx.util.TextInfo;
 import com.kongzue.dialogx.util.views.BlurView;
@@ -221,7 +222,7 @@ public class BottomDialog extends BaseDialog {
         public ViewGroup boxBody;
         public ImageView imgTab;
         public TextView txtDialogTitle;
-        public ScrollView scrollView;
+        public ScrollController scrollView;
         public LinearLayout boxContent;
         public TextView txtDialogTip;
         public View imgSplit;
@@ -446,7 +447,7 @@ public class BottomDialog extends BaseDialog {
                 if (boxContent != null) {
                     if (style.overrideBottomDialogRes() != null && style.overrideBottomDialogRes().touchSlide()) {
                         //若内容布已经超出屏幕可用范围,且预设的对话框最大高度已知
-                        if (bkg.isChildScrollViewCanScroll() && bottomDialogMaxHeight != 0) {
+                        if (scrollView.isCanScroll() && bottomDialogMaxHeight != 0) {
                             //先将内容布局放置到屏幕底部以外区域,然后执行上移动画
                             if (!isEnterAnimFinished)
                                 bkg.setY(getRootFrameLayout().getMeasuredHeight());
@@ -536,6 +537,9 @@ public class BottomDialog extends BaseDialog {
             
             if (onBindView != null && onBindView.getCustomView() != null) {
                 onBindView.bindParent(boxCustom, me);
+                if (onBindView.getCustomView() instanceof ScrollController) {
+                    scrollView = (ScrollController) onBindView.getCustomView();
+                }
             }
             
             if (isAllowInterceptTouch() && isCancelable()) {

+ 1 - 1
DialogX/src/main/java/com/kongzue/dialogx/dialogs/BottomMenu.java

@@ -480,7 +480,7 @@ public class BottomMenu extends BottomDialog {
             if (!isAllowInterceptTouch()) {
                 dialog.bkg.setMaxHeight((int) bottomDialogMaxHeight);
                 if (bottomDialogMaxHeight != 0) {
-                    dialogImpl.scrollView.setEnabled(false);
+                    dialogImpl.scrollView.lockScroll(true);
                 }
             }
             

+ 19 - 0
DialogX/src/main/java/com/kongzue/dialogx/interfaces/ScrollController.java

@@ -0,0 +1,19 @@
+package com.kongzue.dialogx.interfaces;
+
+/**
+ * @author: Kongzue
+ * @github: https://github.com/kongzue/
+ * @homepage: http://kongzue.com/
+ * @mail: myzcxhh@live.cn
+ * @createTime: 2021/8/5 8:39
+ */
+public interface ScrollController {
+    
+    boolean isLockScroll();
+    
+    void lockScroll(boolean lockScroll);
+    
+    int getScrollDistance();
+    
+    boolean isCanScroll();
+}

+ 12 - 7
DialogX/src/main/java/com/kongzue/dialogx/util/BottomDialogTouchEventInterceptor.java

@@ -9,6 +9,7 @@ import android.view.animation.DecelerateInterpolator;
 
 import com.kongzue.dialogx.dialogs.BottomDialog;
 import com.kongzue.dialogx.interfaces.DialogConvertViewInterface;
+import com.kongzue.dialogx.interfaces.ScrollController;
 import com.kongzue.dialogx.util.views.BottomDialogScrollView;
 import com.kongzue.dialogx.util.views.DialogXBaseRelativeLayout;
 
@@ -74,19 +75,23 @@ public class BottomDialogTouchEventInterceptor {
                         case MotionEvent.ACTION_MOVE:
                             if (isBkgTouched) {
                                 float aimY = impl.bkg.getY() + event.getY() - bkgTouchDownY;
-                                if (impl.bkg.isChildScrollViewCanScroll()) {
+                                //Log.e(">>>", "isCanScroll: "+impl.scrollView.isCanScroll() );
+                                if (impl.scrollView.isCanScroll()) {
+//                                    Log.e(">>>", "impl.bkg.getY(): "+impl.bkg.getY());
+//                                    Log.e(">>>", "deltaY(): "+(event.getY() - bkgTouchDownY));
+                                    Log.e(">>>", "impl.scrollView.getScrollDistance(): "+impl.scrollView.getScrollDistance());
                                     if (aimY > 0) {
-                                        if (impl.scrollView.getScrollY() == 0) {
-                                            if (impl.scrollView instanceof BottomDialogScrollView) {
-                                                ((BottomDialogScrollView) impl.scrollView).lockScroll(true);
+                                        if (impl.scrollView.getScrollDistance() == 0) {
+                                            if (impl.scrollView instanceof ScrollController) {
+                                                ((ScrollController) impl.scrollView).lockScroll(true);
                                             }
                                             impl.bkg.setY(aimY);
                                         } else {
                                             bkgTouchDownY = event.getY();
                                         }
                                     } else {
-                                        if (impl.scrollView instanceof BottomDialogScrollView) {
-                                            ((BottomDialogScrollView) impl.scrollView).lockScroll(false);
+                                        if (impl.scrollView instanceof ScrollController) {
+                                            ((ScrollController) impl.scrollView).lockScroll(false);
                                         }
                                         impl.bkg.setY(0);
                                     }
@@ -101,7 +106,7 @@ public class BottomDialogTouchEventInterceptor {
                             break;
                         case MotionEvent.ACTION_UP:
                         case MotionEvent.ACTION_CANCEL:
-                            scrolledY = impl.scrollView.getScrollY();
+                            scrolledY = impl.scrollView.getScrollDistance();
                             isBkgTouched = false;
                             if (bkgOldY == 0) {
                                 if (impl.bkg.getY() < dip2px(35)) {

+ 23 - 4
DialogX/src/main/java/com/kongzue/dialogx/util/views/BottomDialogScrollView.java

@@ -2,11 +2,10 @@ package com.kongzue.dialogx.util.views;
 
 import android.content.Context;
 import android.util.AttributeSet;
-import android.util.Log;
 import android.view.MotionEvent;
+import android.view.View;
 import android.widget.ScrollView;
-
-import com.kongzue.dialogx.dialogs.BottomDialog;
+import com.kongzue.dialogx.interfaces.ScrollController;
 
 /**
  * @author: Kongzue
@@ -15,7 +14,7 @@ import com.kongzue.dialogx.dialogs.BottomDialog;
  * @mail: myzcxhh@live.cn
  * @createTime: 2020/11/17 15:29
  */
-public class BottomDialogScrollView extends ScrollView {
+public class BottomDialogScrollView extends ScrollView implements ScrollController {
     
     public BottomDialogScrollView(Context context) {
         super(context);
@@ -35,10 +34,30 @@ public class BottomDialogScrollView extends ScrollView {
     
     boolean lockScroll;
     
+    @Override
+    public boolean isLockScroll() {
+        return lockScroll;
+    }
+    
     public void lockScroll(boolean lockScroll) {
         this.lockScroll = lockScroll;
     }
     
+    @Override
+    public int getScrollDistance() {
+        return getScrollY();
+    }
+    
+    @Override
+    public boolean isCanScroll() {
+        View child = getChildAt(0);
+        if (child != null) {
+            int childHeight = child.getHeight();
+            return getHeight() < childHeight;
+        }
+        return false;
+    }
+    
     @Override
     public boolean onTouchEvent(MotionEvent ev) {
         if (lockScroll) {

+ 1 - 0
DialogX/src/main/java/com/kongzue/dialogx/util/views/MaxRelativeLayout.java

@@ -154,6 +154,7 @@ public class MaxRelativeLayout extends RelativeLayout {
         return null;
     }
     
+    @Deprecated
     public boolean isChildScrollViewCanScroll() {
         if (childScrollView == null) return false;
         if (!childScrollView.isEnabled()) {

+ 35 - 1
app/src/main/java/com/kongzue/dialogxdemo/MainActivity.java

@@ -20,6 +20,8 @@ import android.widget.RelativeLayout;
 import android.widget.TextView;
 
 import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
 
 import com.kongzue.baseframework.BaseActivity;
 import com.kongzue.baseframework.interfaces.DarkNavigationBarTheme;
@@ -40,7 +42,6 @@ import com.kongzue.dialogx.dialogs.TipDialog;
 import com.kongzue.dialogx.dialogs.WaitDialog;
 import com.kongzue.dialogx.interfaces.BaseDialog;
 import com.kongzue.dialogx.interfaces.DialogLifecycleCallback;
-import com.kongzue.dialogx.interfaces.DialogXStyle;
 import com.kongzue.dialogx.interfaces.OnBackPressedListener;
 import com.kongzue.dialogx.interfaces.OnBindView;
 import com.kongzue.dialogx.interfaces.OnDialogButtonClickListener;
@@ -53,6 +54,10 @@ import com.kongzue.dialogx.style.KongzueStyle;
 import com.kongzue.dialogx.style.MIUIStyle;
 import com.kongzue.dialogx.style.MaterialStyle;
 import com.kongzue.dialogx.util.TextInfo;
+import com.kongzue.dialogxdemo.custom.CustomRecycleViewAdapter;
+
+import java.util.ArrayList;
+import java.util.List;
 
 @Layout(R.layout.activity_main)
 @DarkStatusBarTheme(true)
@@ -95,6 +100,7 @@ public class MainActivity extends BaseActivity {
     private TextView btnBottomReply;
     private TextView btnBottomSelectMenu;
     private TextView btnBottomMultiSelectMenu;
+    private TextView btnBottomCustomRecycleView;
     private TextView btnCustomMessageDialog;
     private TextView btnCustomInputDialog;
     private TextView btnCustomBottomMenu;
@@ -140,6 +146,7 @@ public class MainActivity extends BaseActivity {
         btnBottomReply = findViewById(R.id.btn_bottom_reply);
         btnBottomSelectMenu = findViewById(R.id.btn_bottom_select_menu);
         btnBottomMultiSelectMenu = findViewById(R.id.btn_bottom_multiSelect_menu);
+        btnBottomCustomRecycleView = findViewById(R.id.btn_bottom_custom_recycleView);
         btnCustomMessageDialog = findViewById(R.id.btn_customMessageDialog);
         btnCustomInputDialog = findViewById(R.id.btn_customInputDialog);
         btnCustomBottomMenu = findViewById(R.id.btn_customBottomMenu);
@@ -787,6 +794,33 @@ public class MainActivity extends BaseActivity {
                         .setSelection(selectMenuIndexArray);
             }
         });
+    
+        btnBottomCustomRecycleView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                BottomDialog.build()
+                        .setCustomView(new OnBindView<BottomDialog>(R.layout.layout_custom_recycleview) {
+                            @Override
+                            public void onBind(BottomDialog dialog, View v) {
+                                List<CustomRecycleViewAdapter.Data> fruitList = new ArrayList<>();
+                                fruitList.add(new CustomRecycleViewAdapter.Data("Item Text 1"));
+                                fruitList.add(new CustomRecycleViewAdapter.Data("Item Text 2"));
+                                fruitList.add(new CustomRecycleViewAdapter.Data("Item Text 3"));
+                                fruitList.add(new CustomRecycleViewAdapter.Data("Item Text 4"));
+                                fruitList.add(new CustomRecycleViewAdapter.Data("Item Text 5"));
+                                fruitList.add(new CustomRecycleViewAdapter.Data("Item Text 6"));
+                                fruitList.add(new CustomRecycleViewAdapter.Data("Item Text 7"));
+                                fruitList.add(new CustomRecycleViewAdapter.Data("Item Text 8"));
+                                RecyclerView recyclerView = (RecyclerView) v;
+                                LinearLayoutManager layoutManager = new LinearLayoutManager(me);
+                                recyclerView.setLayoutManager(layoutManager);
+                                CustomRecycleViewAdapter adapter = new CustomRecycleViewAdapter(fruitList);
+                                recyclerView.setAdapter(adapter);
+                            }
+                        })
+                        .show();
+            }
+        });
     }
     
     private void initFullScreenLoginDemo(final FullScreenDialog fullScreenDialog) {

+ 94 - 0
app/src/main/java/com/kongzue/dialogxdemo/custom/CustomRecycleView.java

@@ -0,0 +1,94 @@
+package com.kongzue.dialogxdemo.custom;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.MotionEvent;
+import android.view.View;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.kongzue.dialogx.interfaces.ScrollController;
+
+/**
+ * 自定义滑动布局范例。此处以 RecyclerView 为主要例子
+ * 请注意实现 ScrollController,BottomDialog 需要根据此接口给出的数据进行滑动事件拦截的处理和判断
+ *
+ * @author: Kongzue
+ * @github: https://github.com/kongzue/
+ * @homepage: http://kongzue.com/
+ * @mail: myzcxhh@live.cn
+ * @createTime: 2021/8/5 9:23
+ */
+public class CustomRecycleView extends RecyclerView implements ScrollController {
+    
+    public CustomRecycleView(@NonNull Context context) {
+        super(context);
+    }
+    
+    public CustomRecycleView(@NonNull Context context, @Nullable AttributeSet attrs) {
+        super(context, attrs);
+    }
+    
+    public CustomRecycleView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+    }
+    
+    /**
+     * 滑动锁定判断依据,若此标记被置为 true,则意味着滑动由父布局处理,请勿进行任何滚动操作。
+     * 具体请参考 {@link #onTouchEvent(MotionEvent)} 的处理方案,其他诸如 ScrollView 处理方式相同。
+     */
+    boolean lockScroll;
+    
+    @Override
+    public boolean isLockScroll() {
+        return lockScroll;
+    }
+    
+    @Override
+    public void lockScroll(boolean lockScroll) {
+        this.lockScroll = lockScroll;
+    }
+    
+    @Override
+    public boolean onTouchEvent(MotionEvent ev) {
+        if (lockScroll) {
+            return false;
+        }
+        return super.onTouchEvent(ev);
+    }
+    
+    /**
+     * 是否可以滑动判断依据,若当前滑动布局内容高度小于布局高度则为不可滑动。
+     * 此处列举的是 RecycleView 的判断依据编写方法,
+     * ScrollView 的范例请参考 {@link com.kongzue.dialogx.util.views.BottomDialogScrollView#isCanScroll()}
+     *
+     * @return 是否可滑动
+     */
+    @Override
+    public boolean isCanScroll() {
+        LinearLayoutManager layoutManager = (LinearLayoutManager) getLayoutManager();
+        RecyclerView.Adapter adapter = getAdapter();
+        if (layoutManager == null || adapter == null) return false;
+        return layoutManager.findLastCompletelyVisibleItemPosition() < adapter.getItemCount() - 1;
+    }
+    
+    /**
+     * 此处请给出已滑动距离值,BottomDialog 需要根据此值判断当子布局滑动过程中,父布局是否需要介入滑动流程。
+     * 此处列举的是 RecycleView 的判断依据编写方法,
+     * ScrollView 的范例请参考 {@link com.kongzue.dialogx.util.views.BottomDialogScrollView#getScrollDistance()}
+     *
+     * @return 已滑动距离
+     */
+    public int getScrollDistance() {
+        LinearLayoutManager layoutManager = (LinearLayoutManager) getLayoutManager();
+        View firstVisibleItem = this.getChildAt(0);
+        int firstItemPosition = layoutManager.findFirstVisibleItemPosition();
+        int itemHeight = firstVisibleItem.getHeight();
+        int firstItemBottom = layoutManager.getDecoratedBottom(firstVisibleItem);
+        return (firstItemPosition + 1) * itemHeight - firstItemBottom;
+    }
+    
+}

+ 81 - 0
app/src/main/java/com/kongzue/dialogxdemo/custom/CustomRecycleViewAdapter.java

@@ -0,0 +1,81 @@
+package com.kongzue.dialogxdemo.custom;
+
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import androidx.annotation.NonNull;
+import androidx.recyclerview.widget.RecyclerView;
+
+import com.kongzue.dialogxdemo.R;
+
+import java.util.List;
+
+/**
+ * 自定义 RecycleView 相关适配器、数据、Holder布局的 Demo
+ *
+ * @author: Kongzue
+ * @github: https://github.com/kongzue/
+ * @homepage: http://kongzue.com/
+ * @mail: myzcxhh@live.cn
+ * @createTime: 2021/8/5 9:32
+ */
+public class CustomRecycleViewAdapter extends RecyclerView.Adapter<CustomRecycleViewAdapter.ViewHolder> {
+    
+    public CustomRecycleViewAdapter(List<Data> mDataList) {
+        this.mDataList = mDataList;
+    }
+    
+    private List<Data> mDataList;
+    
+    @NonNull
+    @Override
+    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_custom_recycleview, parent, false);
+        ViewHolder holder = new ViewHolder(view);
+        return holder;
+    }
+    
+    @Override
+    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
+        Data data = mDataList.get(position);
+        holder.getTxtItem().setText(data.getText());
+    }
+    
+    @Override
+    public int getItemCount() {
+        return mDataList.size();
+    }
+    
+    public static class Data {
+        
+        private String text;
+        
+        public Data(String text) {
+            this.text = text;
+        }
+        
+        public String getText() {
+            return text;
+        }
+        
+        public Data setText(String text) {
+            this.text = text;
+            return this;
+        }
+    }
+    
+    public static class ViewHolder extends RecyclerView.ViewHolder {
+        TextView txtItem;
+        
+        public ViewHolder(@NonNull View itemView) {
+            super(itemView);
+            txtItem = itemView.findViewById(R.id.txt_item);
+        }
+    
+        public TextView getTxtItem() {
+            return txtItem;
+        }
+    }
+}

+ 21 - 0
app/src/main/res/layout/activity_main.xml

@@ -581,6 +581,27 @@
 
                 </LinearLayout>
 
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:orientation="horizontal">
+
+                    <TextView
+                        android:id="@+id/btn_bottom_custom_recycleView"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_margin="5dp"
+                        android:background="@drawable/rect_button"
+                        android:paddingLeft="15dp"
+                        android:paddingTop="10dp"
+                        android:paddingRight="15dp"
+                        android:paddingBottom="10dp"
+                        android:text="底部自定义滑动布局 RecycleView"
+                        android:textColor="@color/white"
+                        android:textSize="13dp"
+                        android:textStyle="bold" />
+                </LinearLayout>
+
                 <TextView
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"

+ 13 - 0
app/src/main/res/layout/item_custom_recycleview.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <TextView
+        android:id="@+id/txt_item"
+        android:layout_width="match_parent"
+        android:gravity="center"
+        android:textSize="20dp"
+        android:layout_height="100dp"/>
+
+</RelativeLayout>

+ 8 - 0
app/src/main/res/layout/layout_custom_recycleview.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.kongzue.dialogxdemo.custom.CustomRecycleView xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/recycleView"
+    android:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+</com.kongzue.dialogxdemo.custom.CustomRecycleView>

+ 1 - 1
gradle.properties

@@ -18,5 +18,5 @@ android.useAndroidX=true
 # Automatically convert third-party libraries to use AndroidX
 android.enableJetifier=true
 
-BUILD_VERSION=0.0.41.beta13
+BUILD_VERSION=0.0.41.beta14
 BUILD_VERSION_INT=40