Skip to content

Commit 87f2a4e

Browse files
committed
popup 箭头上下
1 parent 8035876 commit 87f2a4e

File tree

6 files changed

+74
-62
lines changed

6 files changed

+74
-62
lines changed

app/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ android {
44
compileSdkVersion rootProject.ext.android.compileSdkVersion
55
defaultConfig {
66
applicationId "com.mylhyl.circledialog.sample"
7-
minSdkVersion 16
7+
minSdkVersion rootProject.ext.android.minSdkVersion
88
targetSdkVersion rootProject.ext.android.targetSdkVersion
99
versionCode rootProject.ext.android.versionCode
1010
versionName rootProject.ext.publish.version

app/src/main/java/com/mylhyl/circledialog/sample/MainActivity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ protected void onCreate(Bundle savedInstanceState) {
6464
recyclerView.setLayoutManager(new GridLayoutManager(this, 2));
6565
List<String> listData = Arrays.asList(new String[]{"提示框", "确定框", "换头像", "输入框"
6666
, "进度框", "等待框", "动态改变内容"
67-
, "自定义dialog", "list中使用", "倒计时", "三个按钮", "自定义List adapter(多选)"
67+
, "自定义dialog", "popup", "倒计时", "三个按钮", "自定义List adapter(多选)"
6868
, "Rv换头像", "自定义Rv adapter", "自定义List adapter(单选)", "自定义内容视图"
6969
, "lottie动画框", "仿微博分享", "Rv Vertical", "Rv Horizontal"});
7070
BaseQuickAdapter adapter = new BaseQuickAdapter<String, BaseViewHolder>(android.R.layout.simple_list_item_1

app/src/main/java/com/mylhyl/circledialog/sample/list/ListViewActivity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ protected void onCreate(Bundle savedInstanceState) {
4141
@Override
4242
public void onClick(View v) {
4343
new CircleDialog.Builder()
44-
.setPopupArrow(PopupParams.DIRECTION_TOP, PopupParams.GRAVITY_RIGHT)
44+
.setPopupArrow(PopupParams.DIRECTION_BOTTOM, PopupParams.GRAVITY_RIGHT)
4545
.setPopup(new String[]{"1", "2", "3", "4"}
4646
, new OnRvItemClickListener() {
4747
@Override

circledialog/src/main/java/com/mylhyl/circledialog/AbsBaseCircleDialog.java

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import android.view.LayoutInflater;
1919
import android.view.View;
2020
import android.view.ViewGroup;
21+
import android.view.ViewTreeObserver;
2122
import android.view.Window;
2223
import android.view.WindowManager;
2324
import android.widget.FrameLayout;
@@ -26,8 +27,6 @@
2627
import com.mylhyl.circledialog.res.values.CircleDimen;
2728
import com.mylhyl.circledialog.scale.ScaleUtils;
2829

29-
import java.lang.ref.WeakReference;
30-
3130
/**
3231
* Created by hupei on 2017/3/29.
3332
*/
@@ -48,6 +47,7 @@ public abstract class AbsBaseCircleDialog extends DialogFragment {
4847
private static final String SAVED_X = "circle:baseX";
4948
private static final String SAVED_Y = "circle:baseY";
5049
private static final String SAVED_ABSOLUTE_WIDTH = "circle:baseAbsoluteWidth";
50+
5151
private int mGravity = Gravity.CENTER;//对话框的位置
5252
private boolean mCanceledOnTouchOutside = true;//是否触摸外部关闭
5353
private boolean mCanceledBack = true;//是否返回键关闭
@@ -60,7 +60,6 @@ public abstract class AbsBaseCircleDialog extends DialogFragment {
6060
private int mRadius = CircleDimen.DIALOG_RADIUS;//对话框的圆角半径
6161
private float mAlpha = CircleDimen.DIALOG_ALPHA;//对话框透明度,范围:0-1;1不透明
6262
private int mX, mY, mAbsoluteWidth;
63-
private WeakReference<View> mAnchor;
6463

6564
public AbsBaseCircleDialog() {
6665
}
@@ -83,17 +82,16 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa
8382
public void onViewCreated(final View view, @Nullable Bundle savedInstanceState) {
8483
super.onViewCreated(view, savedInstanceState);
8584
if (mMaxHeight > 0) {
86-
view.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
85+
view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
8786
@Override
88-
public void onLayoutChange(View v, int left, int top, int right, int bottom
89-
, int oldLeft, int oldTop, int oldRight, int oldBottom) {
90-
int height = v.getHeight();
87+
public void onGlobalLayout() {
88+
int height = view.getHeight();
9189
DisplayMetrics dm = getDisplayMetrics();
9290
int maxHeight = (int) (dm.heightPixels * mMaxHeight);
9391
if (height > maxHeight) {
92+
view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
9493
view.setLayoutParams(new FrameLayout.LayoutParams(
9594
FrameLayout.LayoutParams.MATCH_PARENT, maxHeight));
96-
view.removeOnLayoutChangeListener(this);
9795
}
9896
}
9997
});
@@ -182,12 +180,18 @@ private void setDialogGravity(Dialog dialog) {
182180
.scaleValue(padding[1]), ScaleUtils.scaleValue(padding[2]), ScaleUtils
183181
.scaleValue(padding[3]));
184182
}
183+
window.setAttributes(wlp);
185184
//动画
186-
if (mAnimStyle != 0) window.setWindowAnimations(mAnimStyle);
185+
if (mAnimStyle != 0) {
186+
window.setWindowAnimations(mAnimStyle);
187+
}
187188

188-
if (isDimEnabled) window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
189-
else window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
190-
window.setAttributes(wlp);
189+
//背景灰暗
190+
if (isDimEnabled) {
191+
window.addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
192+
} else {
193+
window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
194+
}
191195
}
192196

193197
@Override

circledialog/src/main/java/com/mylhyl/circledialog/view/BuildViewPopupImpl.java

Lines changed: 54 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -35,62 +35,70 @@ public ItemsView getBodyView() {
3535

3636
@Override
3737
public void buildBodyView() {
38+
mParams.dialogParams.absoluteWidth = LinearLayout.LayoutParams.WRAP_CONTENT;
39+
40+
final PopupParams popupParams = mParams.popupParams;
41+
final int arrowDirection = popupParams.arrowDirection;
42+
3843
LinearLayout rootLinearLayout = buildLinearLayout();
44+
//箭头在左右情况,布局改为水平
45+
if (arrowDirection == PopupParams.DIRECTION_LEFT || arrowDirection == PopupParams.DIRECTION_RIGHT) {
46+
rootLinearLayout.setOrientation(LinearLayout.HORIZONTAL);
47+
}
3948
mRoot = rootLinearLayout;
40-
if (mItemsView == null) {
41-
mParams.dialogParams.absoluteWidth = LinearLayout.LayoutParams.WRAP_CONTENT;
4249

43-
final PopupParams popupParams = mParams.popupParams;
44-
final View arrowView = new View(mContext);
45-
mRoot.addView(arrowView);
50+
final View arrowView = new View(mContext);
51+
int backgroundColor = popupParams.backgroundColor != 0
52+
? popupParams.backgroundColor : mParams.dialogParams.backgroundColor;
53+
Drawable arrowDrawable = new TriangleArrowDrawable(arrowDirection, backgroundColor);
54+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
55+
arrowView.setBackground(arrowDrawable);
56+
} else {
57+
arrowView.setBackgroundDrawable(arrowDrawable);
58+
}
4659

47-
final int arrowDirection = popupParams.arrowDirection;
48-
int backgroundColor = popupParams.backgroundColor != 0
49-
? popupParams.backgroundColor : mParams.dialogParams.backgroundColor;
50-
Drawable arrowDrawable = new TriangleArrowDrawable(arrowDirection, backgroundColor);
51-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
52-
arrowView.setBackground(arrowDrawable);
53-
} else {
54-
arrowView.setBackgroundDrawable(arrowDrawable);
55-
}
60+
CardView cardView = buildCardView();
61+
mItemsView = new BodyRecyclerView(mContext, mParams.popupParams
62+
, mParams.dialogParams, mParams.rvItemListener);
63+
final View itemsViewView = mItemsView.getView();
64+
cardView.addView(itemsViewView);
5665

57-
CardView cardView = buildCardView();
66+
if (arrowDirection == PopupParams.DIRECTION_LEFT
67+
|| arrowDirection == PopupParams.DIRECTION_TOP) {
68+
mRoot.addView(arrowView);
5869
mRoot.addView(cardView);
70+
} else {
71+
mRoot.addView(cardView);
72+
mRoot.addView(arrowView);
73+
}
5974

60-
mItemsView = new BodyRecyclerView(mContext, mParams.popupParams
61-
, mParams.dialogParams, mParams.rvItemListener);
62-
final View itemsViewView = mItemsView.getView();
63-
cardView.addView(itemsViewView);
64-
65-
itemsViewView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
66-
@Override
67-
public void onLayoutChange(View v, int left, int top, int right, int bottom
68-
, int oldLeft, int oldTop, int oldRight, int oldBottom) {
69-
mParams.dialogParams.absoluteWidth = v.getWidth();
70-
int arrowViewWidth = (int) (v.getWidth() * ARROW_WEIGHT);
71-
LayoutParams arrowViewLayoutParams = (LayoutParams) arrowView.getLayoutParams();
72-
if (arrowViewLayoutParams == null) {
73-
arrowViewLayoutParams = new LayoutParams(arrowViewWidth, arrowViewWidth);
75+
mRoot.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
76+
@Override
77+
public void onLayoutChange(View v, int left, int top, int right, int bottom
78+
, int oldLeft, int oldTop, int oldRight, int oldBottom) {
79+
mParams.dialogParams.absoluteWidth = itemsViewView.getWidth();
80+
int arrowViewWidth = (int) (itemsViewView.getWidth() * ARROW_WEIGHT);
81+
LayoutParams arrowViewLayoutParams = (LayoutParams) arrowView.getLayoutParams();
82+
if (arrowViewLayoutParams == null) {
83+
arrowViewLayoutParams = new LayoutParams(arrowViewWidth, arrowViewWidth);
84+
} else {
85+
arrowViewLayoutParams.width = arrowViewWidth;
86+
arrowViewLayoutParams.height = arrowViewWidth;
87+
}
88+
if (bottom != 0 && oldBottom != 0
89+
&& bottom == oldBottom) {
90+
if (popupParams.arrowGravity == PopupParams.GRAVITY_CENTER) {
91+
arrowViewLayoutParams.leftMargin = (mParams.dialogParams.absoluteWidth / 2) - (arrowViewWidth / 2);
92+
} else if (popupParams.arrowGravity == PopupParams.GRAVITY_RIGHT) {
93+
arrowViewLayoutParams.leftMargin = (int) (mParams.dialogParams.absoluteWidth * (1 - ARROW_WEIGHT)) - arrowViewWidth;
7494
} else {
75-
arrowViewLayoutParams.width = arrowViewWidth;
76-
arrowViewLayoutParams.height = arrowViewWidth;
95+
arrowViewLayoutParams.leftMargin = arrowViewWidth;
7796
}
78-
if ((bottom != 0 && oldBottom != 0 && bottom == oldBottom)
79-
|| (top != 0 && oldTop != 0 && top == oldTop)) {
80-
switch (arrowDirection) {
81-
case PopupParams.DIRECTION_TOP:
82-
if (popupParams.arrowGravity == PopupParams.GRAVITY_RIGHT) {
83-
int offset = arrowViewWidth / 2;
84-
arrowViewLayoutParams.leftMargin = (int) (mParams.dialogParams.absoluteWidth * (1 - ARROW_WEIGHT)) - offset;
85-
}
86-
break;
87-
}
88-
itemsViewView.removeOnLayoutChangeListener(this);
89-
}
90-
arrowView.setLayoutParams(arrowViewLayoutParams);
97+
itemsViewView.removeOnLayoutChangeListener(this);
9198
}
92-
});
93-
}
99+
arrowView.setLayoutParams(arrowViewLayoutParams);
100+
}
101+
});
94102
}
95103

96104
@Override

config.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
ext {
22
android = [
33
compileSdkVersion: 27,
4-
minSdkVersion : 15,
4+
minSdkVersion : 16,
55
targetSdkVersion : 27,
66
versionCode : 1,
77
versionName : "20180705"

0 commit comments

Comments
 (0)