From 42ea59771a54d2591df0a6dd3936dda669be99ae Mon Sep 17 00:00:00 2001
From: gs <3129367635@qq.com>
Date: 星期一, 08 七月 2024 12:23:48 +0800
Subject: [PATCH] 会议统计接入增加,删除,修改接口

---
 app/src/main/java/com/application/zhangshi_app_android/widget/Node.java |  144 ++++++++++++++++++++++++++++++++---------------
 1 files changed, 98 insertions(+), 46 deletions(-)

diff --git a/app/src/main/java/com/application/zhangshi_app_android/widget/Node.java b/app/src/main/java/com/application/zhangshi_app_android/widget/Node.java
index 47f0894..26f2acc 100644
--- a/app/src/main/java/com/application/zhangshi_app_android/widget/Node.java
+++ b/app/src/main/java/com/application/zhangshi_app_android/widget/Node.java
@@ -1,6 +1,9 @@
 package com.application.zhangshi_app_android.widget;
 
+import android.content.Context;
+import android.graphics.Color;
 import android.graphics.Path;
+import android.graphics.Typeface;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -9,12 +12,16 @@
 import android.widget.TextView;
 
 import androidx.constraintlayout.utils.widget.ImageFilterView;
+import androidx.core.content.res.ResourcesCompat;
+import androidx.databinding.DataBindingUtil;
 
 import com.android.app_base.manager.AppManager;
+import com.android.app_base.manager.UserManager;
 import com.android.app_base.utils.GlideUtil;
 import com.android.app_base.utils.ScreenSizeUtils;
 import com.application.zhangshi_app_android.R;
 import com.application.zhangshi_app_android.bean.HomeRootBean;
+import com.application.zhangshi_app_android.databinding.ItemFamilyMemberBinding;
 
 import java.util.ArrayList;
 import java.util.LinkedList;
@@ -27,10 +34,11 @@
  * @desc
  */
 public abstract class Node{
+    protected Context context;
     protected HomeRootBean member;//鎴愬憳
     protected Node parent;//鐖惰妭鐐�
     protected final List<Node> children = new ArrayList<>(); //瀛愯妭鐐�
-
+    protected HomeMindMapLayout.OnItemClickListener onItemClickListener;
     protected static final int pathLength = ScreenSizeUtils.dip2px(20);// 杩炵嚎鐨勪竴鑸暱搴�
     protected static final int  cornerRadius = ScreenSizeUtils.dip2px(5); // 杩炵嚎鎷愯 鍦嗚鍗婂緞
 
@@ -55,20 +63,20 @@
     protected final List<Path> forkPathList = new ArrayList<>();//鍒嗗弶杩炵嚎
     protected final List<View> viewList = new ArrayList<>();
 
-    public Node(HomeRootBean member){
+    public Node(Context context,HomeRootBean member){
+        this.context = context;
         this.member = member;
         if (member != null) {
             // 閫掑綊鍒涘缓瀛愯妭鐐�
             if (member.getChildList() != null && member.getChildList().size() > 0) {
-                // 鎵�鏈夊彲瑙佺殑瀛愯妭鐐归渶瑕佺殑瀹介珮鎬诲拰
                 for (HomeRootBean child : member.getChildList()) {
                     // 鏍规嵁鏄惁鏈夐厤鍋跺垱寤轰笉鍚岀殑鑺傜偣
                     if (child != null) {
                         Node node;
                         if (child.getSpouse() != null) {
-                            node = new DoubleNode(child);
+                            node = new DoubleNode(context,child);
                         } else {
-                            node = new SimpleNode(child);
+                            node = new SimpleNode(context,child);
                         }
                         node.parent = this;
                         children.add(node);
@@ -88,7 +96,7 @@
         if (this.parent!=null){
             throw new RuntimeException("鍙兘鍒濆鍖栨牴鑺傜偣");
         }
-        //鏍规嵁鍙鎬ф壘鍒版渶鍚庝竴涓涓�瀛愯妭鐐癸紝鍗虫渶涓婅竟鐨勮妭鐐�
+        //鏍规嵁鍙鎬ф壘鍒版渶鍚庝竴涓涓�瀛愯妭鐐癸紝鍗虫渶鍙充笂杈圭殑鑺傜偣
         setViewPositionRecursion(getVisibleTopNode(), this,x,y);
     }
 
@@ -96,7 +104,7 @@
      * 閫掑綊璁剧疆鎵�鏈夎妭鐐圭殑浣嶇疆
      * @param topNode 椤堕儴鑺傜偣锛岃繖棰楄妭鐐规爲鐨勬渶涓婅竟鐨勮妭鐐�
      * @param rootNode 鏍硅妭鐐癸紝杩欓鑺傜偣鏍戠殑鏍硅妭鐐�
-     *                startNode 蹇呴』鏄� topNode 绁栧厛鑺傜偣
+     *                rootNode 蹇呴』鏄� topNode 绁栧厛鑺傜偣
      * @param x 鏁撮鑺傜偣鏍戠殑x鍧愭爣
      * @param y 鏁撮鑺傜偣鏍戠殑y鍧愭爣
      */
@@ -108,12 +116,17 @@
         }
 
         //鍥犱负 y 鏄暣棰楄妭鐐规爲鐨剏鍧愭爣锛屾甯告儏鍐典笅锛寉閮戒細鏄� 椤堕儴鑺傜偣topNode 鐨剏鍧愭爣
-        //浣嗘槸 鏈変竴绉嶆儏鍐碉紝灏辨槸椤堕儴鑺傜偣topNode鍒氬ソ鏄牴鑺傜偣rootNode鐨勫敮涓�瀛愯妭鐐癸紝涓攖opNode娌℃湁閰嶅伓锛屾鏃秚opNode鐨勯珮搴︽瘮rootNode鐨勯珮搴﹀皬锛屾墍浠ユ鏃剁殑y鏄痳ootNode鐨剏鍧愭爣
-        int centerY;
-        if (rootNode.height >= topNode.height && rootNode == topNode.parent && rootNode.children.size() == 1){
-            centerY = y + rootNode.getAllVisibleHeight()/2;
-        }else {
-            centerY = y + topNode.getAllVisibleHeight()/2;
+        int centerY = y + topNode.getAllVisibleHeight()/2;
+        //浣嗘槸 鏈変竴绉嶆儏鍐碉紝灏辨槸椤堕儴鑺傜偣topNode娌℃湁閰嶅伓锛屽鏋渢opNode鐨勭鍏堣妭鐐规湁閰嶅伓锛屼笖娌℃湁澶氬瓙瀛欙紝姝ゆ椂topNode鐨勯珮搴︽瘮鏈夐厤鍋剁殑绁栧厛鑺傜偣鐨勯珮搴﹀皬锛屾墍浠ユ鏃剁殑y鏄珮搴︽渶楂樼殑绁栧厛鑺傜偣鐨剏鍧愭爣
+        if (topNode instanceof SimpleNode){
+            Node tempNode = topNode.parent;
+            while (tempNode.children.size() == 1){
+                if (tempNode.height > topNode.height){
+                    centerY = y + tempNode.getAllVisibleHeight()/2;
+                    break;
+                }
+                tempNode = tempNode.parent;
+            }
         }
         topNode.setViewPosition(x + topNode.getToSpecifyNodeWidth(rootNode) - topNode.width, centerY);
         // 鏍规嵁topNode鐨勪綅缃紝閫掑綊璁剧疆鎵�鏈夎妭鐐圭殑浣嶇疆
@@ -125,7 +138,7 @@
             for (Node child : parentNode.children) {
                 if (child == node) {
                     centerYList.add(child.centerY);
-                    currentBottom = currentBottom + node.getVisibleTopNode().top + node.getAllVisibleHeight();
+                    currentBottom = currentBottom + child.getVisibleTop() + child.getAllVisibleHeight();
                     continue;
                 }
                 if (!child.isVisible){
@@ -140,7 +153,7 @@
 
             //鍙栨渶澶у�笺�佹渶灏忓�� 鍜� 鐨勪腑闂�
             int totalCenterY = 0;
-            if (centerYList.size() > 0) {
+            if (centerYList.size() > 1) {
                 int min = centerYList.get(0);
                 int max = centerYList.get(0);
                 for (int i = 1; i < centerYList.size(); i++) {
@@ -153,6 +166,8 @@
                     }
                 }
                 totalCenterY = (min + max) / 2;
+            }else{
+                totalCenterY = centerYList.get(0);
             }
 
             if (parentNode.children.size() > 1) {
@@ -166,7 +181,21 @@
             node = parentNode;
         }
     }
+    //鑾峰彇 浠ュ綋鍓嶈妭鐐逛负鏍硅妭鐐圭殑鏍� 鐨勬渶椤堕儴鐨剏鍧愭爣
+    public int getVisibleTop(){
+        if (!isVisible){
+            return 0;
+        }
+        if (!isExpand){
+            return top;
+        }
+        if (children.size() > 0){
+            return Math.min(top,children.get(0).getVisibleTop());
+        }
+        return top;
+    }
 
+    //鑾峰彇 浠ュ綋鍓嶈妭鐐逛负鏍硅妭鐐圭殑鏍� 鐨勬渶娣变竴鑺傜偣
     public Node getVisibleTopNode(){
         Node topNode;
         if (!isVisible){
@@ -185,39 +214,56 @@
 
     // 璁剧疆瀵瑰簲绫诲瀷鑺傜偣鐨勪綅缃� 鐢卞瓙绫诲疄鐜�
     protected abstract void setViewPosition(int x, int centerY);
+    // 璁剧疆鍒嗗弶鑺傜偣鐨勪綅缃� 鐢卞瓙绫诲疄鐜�,蹇呴』鍏坰etViewPosition鎵嶈兘璋冪敤
     protected abstract void setForkYList(List<Integer> yList);
 
-    protected View createItemView(HomeRootBean bean) {
+    /**
+     *  鍒涘缓鑺傜偣item瑙嗗浘
+     * @param bean 鑺傜偣鏁版嵁
+     * @param isFamily 鏄惁鏄湰瀹舵垚鍛�
+     * @return 鑺傜偣item瑙嗗浘
+     */
+    protected View createItemView(HomeRootBean bean,boolean isFamily){
         // 浣跨敤甯冨眬濉厖鍣ㄥ姞杞借妭鐐瑰竷灞�
-        LayoutInflater inflater = LayoutInflater.from(AppManager.getAppManager().currentActivity());
-        View familyMemberView = inflater.inflate(R.layout.item_family_member, null, false);
-        familyMemberView.measure(View.MeasureSpec.makeMeasureSpec((1 << 30) - 1, View.MeasureSpec.AT_MOST),
-                View.MeasureSpec.makeMeasureSpec((1 << 30) - 1, View.MeasureSpec.AT_MOST));
+        LayoutInflater inflater = LayoutInflater.from(context);
+        ItemFamilyMemberBinding binding = DataBindingUtil.inflate(inflater, R.layout.item_family_member, null, false);
+
+        View familyMemberView = binding.getRoot();
 
         // 闃叉addView鏃讹紝鎵�鏈夎繖閲屽垱寤虹殑view鐨勯珮瀹借闄愬埗鎴愪竴鏍风殑
         ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
         familyMemberView.setLayoutParams(params);
 
-        if (bean == null) {
-            return familyMemberView;
-        }
-        // 鑾峰彇甯冨眬涓殑缁勪欢
-        TextView tv_generation = familyMemberView.findViewById(R.id.tv_generation);
-        ImageFilterView iv_avatar = familyMemberView.findViewById(R.id.iv_avatar);
-        TextView tv_name = familyMemberView.findViewById(R.id.tv_name);
+        familyMemberView.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if (onItemClickListener != null){
+                    onItemClickListener.onItemClick(familyMemberView,bean,isFamily);
+                }
+            }
+        });
+        if (bean != null) {
+            binding.setBean(bean);
+            if (!isFamily){
+                binding.tvName.setTextColor(Color.parseColor("#FF8296C5"));
+                //鑾峰彇瀛椾綋
+                Typeface typeface = ResourcesCompat.getFont(context, com.android.app_base.R.font.roboto_regular);
+                binding.tvName.setTypeface(typeface);
 
-        // 璁剧疆鑺傜偣鍐呭
-        tv_generation.setText(String.valueOf(bean.getIdentity()));
-        if (bean.getImg() != null) {
-            GlideUtil.loadImage(bean.getImg(), iv_avatar);
+            }
+            // 浣跨敤databinding鏃犳硶娴嬮噺view鐨勫甫鍐呭鐨勫噯纭楂橈紝鎵�浠ヨ繖閲屾墜鍔ㄨ缃竴涓�
+            binding.tvGeneration.setText(bean.getIdentity()+"");
+            if (bean.getNickName().equals(UserManager.getInstance().getUserName())){
+                binding.cvContainer.setCardBackgroundColor(Color.parseColor("#FFCEE4FD"));
+                binding.ivMyself.setVisibility(View.VISIBLE);
+            }
         }
-        tv_name.setText(bean.getNickName());
-        tv_name.setSelected(true);
+        familyMemberView.measure(View.MeasureSpec.makeMeasureSpec((1 << 30) - 1, View.MeasureSpec.AT_MOST),
+                View.MeasureSpec.makeMeasureSpec((1 << 30) - 1, View.MeasureSpec.AT_MOST));
         return familyMemberView;
     }
-
     protected ImageView createExpandIconView() {
-        ImageView expandView = new ImageView(AppManager.getAppManager().currentActivity());
+        ImageView expandView = new ImageView(context);
         FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(pathLength,pathLength);
         expandView.setLayoutParams(params);
         int widthMeasureSpec = View.MeasureSpec.makeMeasureSpec(pathLength, View.MeasureSpec.EXACTLY);
@@ -392,13 +438,15 @@
         }
         if (node.children.size() == 0){
             return node.height;
-        }else {
+        } else {
             int heightSum = 0;
             for (Node child : node.children) {
-                if (getNodeTreeHeightRecursion(child,considerVisible)!=0){
+                int childHeight = getNodeTreeHeightRecursion(child,considerVisible);
+                //濡傛灉鏈夊涓瓙鑺傜偣涓斿瓙鑺傜偣鏈夐珮搴︼紝閭d箞瀛愯妭鐐逛箣闂磋繕鏈夌珫鐩撮棿闅�
+                if (node.children.size() > 1 && childHeight > 0){
                     heightSum += verticalMargin;
                 }
-                heightSum += getNodeTreeHeightRecursion(child,considerVisible);
+                heightSum += childHeight;
             }
             //瀛愯妭鐐规瘡涓や釜涔嬮棿杩樻湁绔栫洿闂撮殧
             return Math.max(node.height,heightSum);
@@ -447,15 +495,11 @@
     }
 
     // 鑾峰彇 姣忎釜 itemView 鐨勫搴�
-    public int getItemViewWidth(){
-        View itemView =  createItemView(null);
-        return itemView.getMeasuredWidth();
-    }
+    public abstract int getItemViewWidth();
+
     // 鑾峰彇 姣忎釜 itemView 鐨勯珮搴�
-    public int getItemViewHeight(){
-        View itemView =  createItemView(null);
-        return itemView.getMeasuredHeight();
-    }
+    public abstract int getItemViewHeight();
+
     //鑾峰彇灞曞紑鎸夐挳鐨勫搴�
     public int getExpandIconWidth(){
         ImageView expandIconView = createExpandIconView();
@@ -466,4 +510,12 @@
     public int getViewWidth(){
         return viewBottom - viewTop;
     }
+
+    public void setOnItemClickListener(HomeMindMapLayout.OnItemClickListener onItemClickListener) {
+        this.onItemClickListener = onItemClickListener;
+        //鎵�鏈夌殑瀛愯妭鐐逛篃璁剧疆
+        for (Node child : children) {
+            child.setOnItemClickListener(onItemClickListener);
+        }
+    }
 }

--
Gitblit v1.9.1