Browse Source

0.0.50.beta27
- 优化 BottomMenu 在大量菜单显示时的性能问题;

Kongzue 3 months ago
parent
commit
078885ccd1

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

@@ -512,14 +512,17 @@ public class BottomMenu extends BottomDialog {
             } else {
                 listView = new DialogListView(getDialogImpl(), getOwnActivity());
             }
+            listView.setTag("ScrollController");
             listView.setOverScrollMode(OVER_SCROLL_NEVER);
             listView.setDivider(getResources().getDrawable(dividerDrawableResId));
             listView.setDividerHeight(dividerHeight);
+            getDialogImpl().scrollView = listView;
 
             listView.setBottomMenuListViewTouchEvent(new BottomMenuListViewTouchEvent() {
                 @Override
                 public void down(MotionEvent event) {
-                    touchDownY = getDialogImpl().bkg.getY();
+                    touchDownY = getDialogImpl().boxBkg.getY();
+                    log("#TouchDown: " + touchDownY);
                 }
             });
 
@@ -533,7 +536,8 @@ public class BottomMenu extends BottomDialog {
                     long currentTime = System.currentTimeMillis();
                     if (currentTime - lastClickTime > ITEM_CLICK_DELAY) {
                         lastClickTime = currentTime;
-                        float deltaY = Math.abs(touchDownY - getDialogImpl().bkg.getY());
+                        float deltaY = Math.abs(touchDownY - getDialogImpl().boxBkg.getY());
+                        log("#Click:deltaY= " + deltaY);
                         if (deltaY > dip2px(15)) {
                             return;
                         }

+ 74 - 66
DialogX/src/main/java/com/kongzue/dialogx/util/views/DialogListView.java

@@ -3,7 +3,9 @@ package com.kongzue.dialogx.util.views;
 import android.content.Context;
 import android.content.res.Resources;
 import android.util.AttributeSet;
+import android.util.Log;
 import android.view.MotionEvent;
+import android.view.View;
 import android.widget.ListAdapter;
 import android.widget.ListView;
 
@@ -11,6 +13,7 @@ import androidx.appcompat.view.ContextThemeWrapper;
 
 import com.kongzue.dialogx.interfaces.BottomMenuListViewTouchEvent;
 import com.kongzue.dialogx.interfaces.DialogConvertViewInterface;
+import com.kongzue.dialogx.interfaces.ScrollController;
 
 /**
  * @author: Kongzue
@@ -19,103 +22,108 @@ import com.kongzue.dialogx.interfaces.DialogConvertViewInterface;
  * @mail: myzcxhh@live.cn
  * @createTime: 2020/10/6 23:42
  */
-public class DialogListView extends ListView {
-    
+public class DialogListView extends ListView implements ScrollController {
+
     private BottomMenuListViewTouchEvent bottomMenuListViewTouchEvent;
-    
+
     public DialogListView(Context context) {
         super(context);
     }
-    
+
     public DialogListView(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
-    
+
     public DialogListView(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
     }
-    
+
     private DialogConvertViewInterface dialogImpl;
-    
+
     public DialogListView(DialogConvertViewInterface dialog, Context context) {
         super(context);
         dialogImpl = dialog;
         setVerticalScrollBarEnabled(false);
     }
-    
+
     public DialogListView(DialogConvertViewInterface dialog, Context context, int theme) {
-        super(new ContextThemeWrapper(context,theme));
+        super(new ContextThemeWrapper(context, theme));
         dialogImpl = dialog;
         setVerticalScrollBarEnabled(false);
     }
-    
-    @Override
-    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-        int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
-        super.onMeasure(widthMeasureSpec, expandSpec);
-    }
-    
-    private int dip2px(float dpValue) {
-        final float scale = Resources.getSystem().getDisplayMetrics().density;
-        return (int) (dpValue * scale + 0.5f);
-    }
-    
-    private int mPosition;
-    private float touchDownY;
-    
+
+//    private int dip2px(float dpValue) {
+//        final float scale = Resources.getSystem().getDisplayMetrics().density;
+//        return (int) (dpValue * scale + 0.5f);
+//    }
+//
+//    private int mPosition;
+//    private float touchDownY;
+//
     @Override
     public boolean dispatchTouchEvent(MotionEvent ev) {
         final int actionMasked = ev.getActionMasked() & MotionEvent.ACTION_MASK;
-        
-        if (actionMasked == MotionEvent.ACTION_DOWN) {
-            touchDownY = ev.getY();
-            if (bottomMenuListViewTouchEvent != null) {
-                bottomMenuListViewTouchEvent.down(ev);
-            }
-            mPosition = pointToPosition((int) ev.getX(), (int) ev.getY());
-            return super.dispatchTouchEvent(ev);
-        }
-        
-        if (actionMasked == MotionEvent.ACTION_MOVE) {
-            if (bottomMenuListViewTouchEvent != null) {
-                bottomMenuListViewTouchEvent.move(ev);
-            }
-            if (Math.abs(touchDownY - ev.getY()) > dip2px(5)) {
-                ev.setAction(MotionEvent.ACTION_CANCEL);
-                dispatchTouchEvent(ev);
-                return false;
-            }
-            return true;
-        }
-        if (actionMasked == MotionEvent.ACTION_UP || actionMasked == MotionEvent.ACTION_CANCEL) {
-            if (bottomMenuListViewTouchEvent != null) {
-                bottomMenuListViewTouchEvent.up(ev);
-            }
-            if (pointToPosition((int) ev.getX(), (int) ev.getY()) == mPosition) {
-                super.dispatchTouchEvent(ev);
-            } else {
-                setPressed(false);
-                invalidate();
-            }
+        switch (actionMasked){
+            case MotionEvent.ACTION_DOWN:
+                if (bottomMenuListViewTouchEvent != null) {
+                    bottomMenuListViewTouchEvent.down(ev);
+                }
+                break;
+            case MotionEvent.ACTION_MOVE:
+                if (bottomMenuListViewTouchEvent != null) {
+                    bottomMenuListViewTouchEvent.move(ev);
+                }
+                break;
+            case MotionEvent.ACTION_UP:
+                if (bottomMenuListViewTouchEvent != null) {
+                    bottomMenuListViewTouchEvent.up(ev);
+                }
+                break;
         }
-        
         return super.dispatchTouchEvent(ev);
     }
-    
+
     public BottomMenuListViewTouchEvent getBottomMenuListViewTouchEvent() {
         return bottomMenuListViewTouchEvent;
     }
-    
-    private int size = 1;
-    
-    @Override
-    public void setAdapter(ListAdapter adapter) {
-        size = adapter.getCount();
-        super.setAdapter(adapter);
-    }
-    
+
     public DialogListView setBottomMenuListViewTouchEvent(BottomMenuListViewTouchEvent bottomMenuListViewTouchEvent) {
         this.bottomMenuListViewTouchEvent = bottomMenuListViewTouchEvent;
         return this;
     }
+
+    @Override
+    public int getScrollDistance() {
+        View c = getChildAt(0);
+        if (c == null) {
+            return 0;
+        }
+        int firstVisiblePosition = getFirstVisiblePosition();
+        int top = c.getTop();
+        int scrollY = -top + firstVisiblePosition * c.getHeight();
+        return scrollY;
+    }
+
+    @Override
+    public boolean isCanScroll() {
+        return true;
+    }
+
+    boolean lockScroll;
+
+    @Override
+    public void lockScroll(boolean lockScroll) {
+        this.lockScroll = lockScroll;
+    }
+
+    @Override
+    public boolean onTouchEvent(MotionEvent event) {
+        if (lockScroll) return false;
+        return super.onTouchEvent(event);
+    }
+
+    @Override
+    public boolean isLockScroll() {
+        return lockScroll;
+    }
 }

+ 5 - 6
DialogX/src/main/res/layout/layout_dialogx_bottom_material.xml

@@ -54,7 +54,6 @@
                     android:id="@+id/scrollView"
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"
-                    android:layout_weight="1"
                     android:overScrollMode="never"
                     android:scrollbars="vertical">
 
@@ -81,15 +80,15 @@
                             android:layout_width="match_parent"
                             android:layout_height="wrap_content" />
 
-                        <FrameLayout
-                            android:id="@+id/box_list"
-                            android:layout_width="match_parent"
-                            android:layout_height="wrap_content" />
-
                     </LinearLayout>
 
                 </com.kongzue.dialogx.util.views.DialogScrollView>
 
+                <FrameLayout
+                    android:id="@+id/box_list"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content" />
+
                 <LinearLayout
                     android:layout_width="match_parent"
                     android:layout_height="wrap_content"

+ 2 - 0
app/src/main/java/com/kongzue/dialogxdemo/activity/MainActivity.java

@@ -744,6 +744,8 @@ public class MainActivity extends BaseActivity {
                 if (rdoMaterial.isChecked()) {
                     //Material 可滑动展开 BottomMenu 演示
                     BottomMenu.build()
+                            .setTitle("title")
+                            .setMessage("message")
                             .setBottomDialogMaxHeight(0.6f)
                             .setMenuList(new String[]{"添加", "查看", "编辑", "删除", "分享", "评论", "下载", "收藏", "赞!", "不喜欢", "所属专辑", "复制链接", "类似推荐", "添加", "查看", "编辑", "删除", "分享", "评论", "下载", "收藏", "赞!", "不喜欢", "所属专辑", "复制链接", "类似推荐"}).setOnIconChangeCallBack(new OnIconChangeCallBack<BottomMenu>(true) {
                         @Override

+ 0 - 25
app/src/main/res/layout/layout_test1.xml

@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent">
-
-    <EditText
-        android:id="@+id/edit_userName"
-        android:layout_width="match_parent"
-        android:layout_height="50dp"
-        android:layout_marginHorizontal="15dp"
-        android:layout_marginTop="10dp"
-        android:background="@drawable/ios_edit_box_bkg"
-        android:gravity="center"
-        android:hint="请输入账号"
-        android:inputType="textEmailAddress" />
-
-    <com.kongzue.dialogxdemo.custom.recycleview.CustomRecycleView
-        android:id="@+id/recycleView"
-        android:tag="ScrollController"
-        android:orientation="vertical"
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"/>
-
-</LinearLayout>

+ 1 - 1
gradle.properties

@@ -19,7 +19,7 @@ android.useAndroidX=true
 # Automatically convert third-party libraries to use AndroidX
 android.enableJetifier=true
 
-BUILD_VERSION=0.0.50.beta26
+BUILD_VERSION=0.0.50.beta27
 BUILD_VERSION_INT=50
 DIALOGX_STYLE_VERSION=5
 android.nonTransitiveRClass=true