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);
|
}
|
|
}
|