package com.application.zhangshi_app_android.widget; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.constraintlayout.utils.widget.ImageFilterView; 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 java.util.HashMap; import java.util.Map; /** * @author Ljj * @date 2023.08.12. 1:19 * @desc 家族导图 自定义布局 */ public class HomeMindMapLayout extends FrameLayout { boolean isAutoLayout = true;// 是否自动布局 private Paint linePaint; private HomeRootBean rootMember;// 根节点成员 private Node rootNode;// 根节点 private int width, height;// 当前布局的宽高 private int minHeight, minWidth;// 当前布局的最小宽高 private int padding = 100;//内容矩形 与 FrameLayout矩形 的padding private OnItemClickListener onItemClickListener;// 点击事件 public HomeMindMapLayout(@NonNull Context context) { this(context, null); } public HomeMindMapLayout(@NonNull Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(); } private void init() { linePaint = new Paint(); linePaint.setColor(Color.parseColor("#FFEBA4AA")); linePaint.setStrokeWidth(ScreenSizeUtils.dip2px(2f)); linePaint.setStyle(Paint.Style.STROKE); linePaint.setStrokeJoin(Paint.Join.ROUND); linePaint.setStrokeMiter(10); linePaint.setAntiAlias(true); // 设置ViewGroup默认调用onDraw方法 setWillNotDraw(false); } public void setRootMember(HomeRootBean root) { //等待布局加载完成后再设置数据 post(new Runnable() { @Override public void run() { setRootMemberReal(root); } }); } private void setRootMemberReal(HomeRootBean root) { this.rootMember = root; if (rootMember != null) { // 绘制根节点 if (rootMember.getSpouse() == null){ rootNode = new SimpleNode(getContext(),rootMember); }else { rootNode = new DoubleNode(getContext(),rootMember); } rootNode.setPosition(padding,padding); //把所有节点的view添加到viewGroup中 addNodeView(rootNode); requestLayout(); if (onItemClickListener != null){ rootNode.setOnItemClickListener(onItemClickListener); } } } public void setOnItemClickListener(OnItemClickListener listener){ this.onItemClickListener = listener; if (rootNode != null){ rootNode.setOnItemClickListener(onItemClickListener); } } private void addNodeView(Node rootNode) { for (View view : rootNode.viewList) { addView(view); } if (rootNode.getChildren() != null && rootNode.getChildren().size() > 0) { for (Node child : rootNode.getChildren()) { addNodeView(child); } } } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if(rootNode != null){ // 是否自适应布局 if (isAutoLayout) { //需要随着内容的显示内容动态显示view rootNode.setPosition(padding, padding); width = rootNode.getAllVisibleWidth() + padding * 2; height = rootNode.getAllVisibleHeight() + padding * 2; } else { //不需要随着内容的显示内容动态显示view width = rootNode.getAllWidth() + padding * 2; height = rootNode.getAllHeight() + padding * 2; } } setMeasuredDimension(Math.max(minWidth,width),Math.max(minHeight,height)); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (rootNode != null) { drawNodeLine(canvas, rootNode); } } private void drawNodeLine(Canvas canvas, Node rootNode) { //根据根节点的可见性判断是否绘制线条 if (rootNode.isVisible()){ if (rootNode.nextPathList != null) { for (Path path : rootNode.nextPathList) { canvas.drawPath(path, linePaint); } } if (rootNode.prePathList != null) { for (Path path : rootNode.prePathList) { canvas.drawPath(path, linePaint); } } if (rootNode.isExpand){ if (rootNode.forkPathList != null) { for (Path path : rootNode.forkPathList) { canvas.drawPath(path, linePaint); } } } } if (rootNode.getChildren() != null && rootNode.getChildren().size() > 0) { for (Node child : rootNode.getChildren()) { drawNodeLine(canvas, child); } } } public void setMinSize(int minWidth, int minHeight) { this.minWidth = minWidth; this.minHeight = minHeight; } public interface OnItemClickListener{ void onItemClick(View view,HomeRootBean member,boolean isFamily); } }