admin
2021-07-06 abce02c7a61820f5d580f87364d542e817be429c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package com.app.hubert.guide.model;
 
import android.graphics.RectF;
import androidx.annotation.IntDef;
import androidx.annotation.LayoutRes;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
 
import com.app.hubert.guide.core.Controller;
import com.app.hubert.guide.util.LogUtil;
 
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
 
/**
 * Created by hubert on 2018/6/28.
 */
public class RelativeGuide {
 
    @IntDef({android.view.Gravity.LEFT, android.view.Gravity.TOP,
            android.view.Gravity.RIGHT, android.view.Gravity.BOTTOM})
    @Retention(RetentionPolicy.SOURCE)
    @interface LimitGravity {
 
    }
 
    public static class MarginInfo {
        public int leftMargin;
        public int topMargin;
        public int rightMargin;
        public int bottomMargin;
        public int gravity;
 
        @Override
        public String toString() {
            return "MarginInfo{" +
                    "leftMargin=" + leftMargin +
                    ", topMargin=" + topMargin +
                    ", rightMargin=" + rightMargin +
                    ", bottomMargin=" + bottomMargin +
                    ", gravity=" + gravity +
                    '}';
        }
    }
 
    public HighLight highLight;
    @LayoutRes
    public int layout;
    public int padding;
    public int gravity;
 
    public RelativeGuide(@LayoutRes int layout, @LimitGravity int gravity) {
        this.layout = layout;
        this.gravity = gravity;
    }
 
    /**
     * @param layout  相对位置引导布局
     * @param gravity 仅限left top right bottom
     * @param padding 与高亮view的padding,单位px
     */
    public RelativeGuide(@LayoutRes int layout, @LimitGravity int gravity, int padding) {
        this.layout = layout;
        this.gravity = gravity;
        this.padding = padding;
    }
 
    public final View getGuideLayout(ViewGroup viewGroup, Controller controller) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(layout, viewGroup, false);
        onLayoutInflated(view);
        onLayoutInflated(view, controller);
        FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) view.getLayoutParams();
        MarginInfo marginInfo = getMarginInfo(gravity, viewGroup, view);
        LogUtil.e(marginInfo.toString());
        offsetMargin(marginInfo, viewGroup, view);
        layoutParams.gravity = marginInfo.gravity;
        layoutParams.leftMargin += marginInfo.leftMargin;
        layoutParams.topMargin += marginInfo.topMargin;
        layoutParams.rightMargin += marginInfo.rightMargin;
        layoutParams.bottomMargin += marginInfo.bottomMargin;
        view.setLayoutParams(layoutParams);
        return view;
    }
 
    private MarginInfo getMarginInfo(@LimitGravity int gravity, ViewGroup viewGroup, View view) {
        MarginInfo marginInfo = new MarginInfo();
        RectF rectF = highLight.getRectF(viewGroup);
        switch (gravity) {
            case Gravity.LEFT:
                marginInfo.gravity = Gravity.RIGHT;
                marginInfo.rightMargin = (int) (viewGroup.getWidth() - rectF.left + padding);
                marginInfo.topMargin = (int) rectF.top;
                break;
            case Gravity.TOP:
                marginInfo.gravity = Gravity.BOTTOM;
                marginInfo.bottomMargin = (int) (viewGroup.getHeight() - rectF.top + padding);
                marginInfo.leftMargin = (int) rectF.left;
                break;
            case Gravity.RIGHT:
                marginInfo.leftMargin = (int) (rectF.right + padding);
                marginInfo.topMargin = (int) rectF.top;
                break;
            case Gravity.BOTTOM:
                marginInfo.topMargin = (int) (rectF.bottom + padding);
                marginInfo.leftMargin = (int) rectF.left;
                break;
        }
        return marginInfo;
    }
 
    protected void offsetMargin(MarginInfo marginInfo, ViewGroup viewGroup, View view) {
        //do nothing
    }
 
    /**
     * 复写初始化布局
     *
     * @param view inflated from layout
     * @see RelativeGuide#onLayoutInflated(View view, Controller controller)
     */
    @Deprecated
    protected void onLayoutInflated(View view) {
        //do nothing
    }
 
    /**
     * 复写初始化布局
     *
     * @param view       inflated from layout
     * @param controller controller
     */
    protected void onLayoutInflated(View view, Controller controller) {
        //do nothing
    }
}