baseItemViewList = new ArrayList<>();
+ private OnItemClick onItemClick;
+ private View clickView;
+ /**
+ * 弹窗宽度
+ */
+ private static int dialogWidth = 150;
+
+ private AlertDialog dialog;
+ private Activity context;
+ private View angleView;
+
+ /**
+ * 弹窗方向 默认向下
+ */
+ private int direction = Direction.TOP;
+
+ /**
+ * 弹窗距离屏幕边距
+ */
+ private int padding = 20;
+
+ /**
+ * 弹出的view距离
+ */
+ private int marging = 0;
+
+ /**
+ * 点击selector
+ */
+ private boolean selector = true;
+
+ /**
+ * 主题颜色
+ */
+ private @Theme
+ int theme = Theme.LIGHT;
+
+ public static class Builder {
+ private BubbleWindow bubbleWindow;
+
+ public Builder(Activity context) {
+ bubbleWindow = new BubbleWindow();
+ bubbleWindow.context = context;
+ }
+
+ //弹窗距离屏幕距离
+ public Builder setPadding(int padding) {
+ bubbleWindow.padding = padding;
+ return this;
+ }
+
+ //弹窗距离弹出的view距离
+ public Builder setMargining(int marging) {
+ bubbleWindow.marging = marging;
+ return this;
+ }
+
+ //弹窗方向
+ public Builder setDirection(@Direction int direction) {
+ bubbleWindow.direction = direction;
+ return this;
+ }
+
+ //添加子item
+ public Builder setItemView(BaseItemView itemView) {
+ itemView.setView();
+ bubbleWindow.baseItemViewList.add(itemView);
+ return this;
+ }
+
+ //弹窗item点击事件
+ public Builder setOnItemClick(OnItemClick onItemClick) {
+ bubbleWindow.onItemClick = onItemClick;
+ return this;
+ }
+
+ //弹窗主题白色黑色
+ public Builder setTheme(@Theme int theme) {
+ bubbleWindow.theme = theme;
+ return this;
+ }
+
+ //弹窗点击selector
+ public Builder setSelector(Boolean selector) {
+ bubbleWindow.selector = selector;
+ return this;
+ }
+
+ public BubbleWindow build() {
+ bubbleWindow.setBubbleWindow();
+ return bubbleWindow;
+ }
+ }
+
+ private void setBubbleWindow() {
+ AlertDialog.Builder builder = new AlertDialog.Builder(context, R.style.bubble_dialog_style);
+ dialog = builder.create();
+ View dialogView = View.inflate(context, R.layout.bubble_layout, null);
+ if (direction == Direction.BOTTOM) {
+ angleView = dialogView.findViewById(R.id.bubble_angle_top);
+ dialogView.findViewById(R.id.bottom_rl).setVisibility(View.GONE);
+ if (theme == Theme.DARK) {
+ angleView.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_angle_top_dark));
+ }
+ } else if (direction == Direction.TOP) {
+ angleView = dialogView.findViewById(R.id.bubble_angle_bottom);
+ dialogView.findViewById(R.id.top_rl).setVisibility(View.GONE);
+ if (theme == Theme.DARK) {
+ angleView.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_angle_bottom_dark));
+ }
+ }
+
+ LinearLayout linearLayout = dialogView.findViewById(R.id.bubble_layout);
+ if (baseItemViewList.size() > 0) {
+ //设置item的selector
+ switch (baseItemViewList.size()) {
+ case 1:
+ if (theme == Theme.LIGHT) {
+ if (selector) {
+ baseItemViewList.get(0).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_one_selector));
+ } else {
+ baseItemViewList.get(0).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_background));
+ }
+ } else {
+ baseItemViewList.get(0).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_background_dark));
+ }
+ break;
+ default:
+ if (theme == Theme.LIGHT) {
+ if (selector) {
+ baseItemViewList.get(0).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_top_selector));
+ baseItemViewList.get(baseItemViewList.size() - 1).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_bottom_selector));
+ } else {
+ baseItemViewList.get(0).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_item_top));
+ baseItemViewList.get(baseItemViewList.size() - 1).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_item_bottom));
+ }
+ } else {
+ baseItemViewList.get(0).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_item_top_dark));
+ baseItemViewList.get(baseItemViewList.size() - 1).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_item_bottom_dark));
+ }
+
+
+ if (baseItemViewList.size() > 2) {
+ for (int i = 1; i < baseItemViewList.size() - 1; i++) {
+ if (theme == Theme.LIGHT) {
+ if (selector) {
+ baseItemViewList.get(i).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_center_selector));
+ } else {
+ baseItemViewList.get(i).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_item_center));
+ }
+ } else {
+ baseItemViewList.get(i).view.setBackground(ContextCompat.getDrawable(context, R.drawable.bubblewindow_item_center_dark));
+ }
+ }
+ }
+ break;
+ }
+ //设置角的selector
+ if (direction == Direction.BOTTOM && selector && theme == Theme.LIGHT) {
+ baseItemViewList.get(0).view.setOnTouchListener((v, event) -> {
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ angleView.setPressed(true);
+ baseItemViewList.get(0).view.setPressed(true);
+ break;
+ case MotionEvent.ACTION_MOVE:
+ if (!isTouchPointInView(baseItemViewList.get(0).view, event.getRawX(), event.getRawY())) {
+ angleView.setPressed(false);
+ baseItemViewList.get(0).view.setPressed(false);
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ if (baseItemViewList.get(0).view.isPressed()) {
+ angleView.setPressed(false);
+ baseItemViewList.get(0).view.setPressed(false);
+ if (onItemClick != null) {
+ onItemClick.onClick(baseItemViewList.get(0).tag, 0, BubbleWindow.this);
+ }
+ }
+ break;
+ }
+ return true;
+ });
+ }
+ if (direction == Direction.TOP && selector && theme == Theme.LIGHT) {
+ baseItemViewList.get(baseItemViewList.size() - 1).view.setOnTouchListener((v, event) -> {
+ switch (event.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ angleView.setPressed(true);
+ baseItemViewList.get(baseItemViewList.size() - 1).view.setPressed(true);
+ break;
+ case MotionEvent.ACTION_MOVE:
+ if (!isTouchPointInView(baseItemViewList.get(baseItemViewList.size() - 1).view, event.getRawX(), event.getRawY())) {
+ angleView.setPressed(false);
+ baseItemViewList.get(baseItemViewList.size() - 1).view.setPressed(false);
+ }
+ break;
+ case MotionEvent.ACTION_UP:
+ if (baseItemViewList.get(baseItemViewList.size() - 1).view.isPressed()) {
+ angleView.setPressed(false);
+ baseItemViewList.get(baseItemViewList.size() - 1).view.setPressed(false);
+ if (onItemClick != null) {
+ onItemClick.onClick(baseItemViewList.get(baseItemViewList.size() - 1).tag, baseItemViewList.size() - 1, BubbleWindow.this);
+ }
+ }
+ break;
+ }
+ return true;
+ });
+ }
+
+
+ //设置点击事件以及item
+ for (int i = 0; i < baseItemViewList.size(); i++) {
+ //设置点击事件
+ if (onItemClick != null) {
+ int finalI = i;
+ baseItemViewList.get(i).view.setOnClickListener(v -> {
+ if (AntiShakeUtil.getAntiShakeStateByView(v)) {
+ onItemClick.onClick(baseItemViewList.get(finalI).tag, finalI, BubbleWindow.this);
+ }
+ });
+ }
+ //添加view
+ linearLayout.addView(baseItemViewList.get(i).view, LinearLayout.LayoutParams.MATCH_PARENT, ScreenUtil.dp2px(context, 50));
+ if (i != baseItemViewList.size() - 1) {
+ linearLayout.addView(lineView(), LinearLayout.LayoutParams.MATCH_PARENT, ScreenUtil.dp2px(context, 0.5f));
+ }
+
+ }
+ }
+ dialog.setView(dialogView);
+ }
+
+ private View lineView() {
+ View view = new View(context);
+ view.setBackgroundColor(ContextCompat.getColor(context, R.color.color_DDDDDD));
+ return view;
+ }
+
+ //设置dialog位置
+ private void setPosition(View view) {
+ Window window = dialog.getWindow();
+ window.setGravity(Gravity.TOP | Gravity.LEFT);
+ WindowManager.LayoutParams lp = window.getAttributes();
+ int[] windowLocation = new int[2];
+ view.getLocationOnScreen(windowLocation);
+ if (direction == Direction.TOP) {
+ int commonX = (int) (windowLocation[0] + view.getWidth() / 2 - ScreenUtil.dp2px(context, dialogWidth / 2));
+ int commonY = 0;
+ if (context instanceof AppCompatActivity && ((AppCompatActivity) context).getSupportActionBar() != null) {
+ if (((AppCompatActivity) context).getSupportActionBar().isShowing()) {
+ commonY = (int) windowLocation[1] - ScreenUtil.getStatusBarHeight(context) + ScreenUtil.getActionBarHeight(context) - getDialogHeight() - ScreenUtil.dp2px(context, marging);
+ }
+ } else {
+ commonY = (int) windowLocation[1] - ScreenUtil.getStatusBarHeight(context) - getDialogHeight() - ScreenUtil.dp2px(context, marging);
+ }
+ //X方向限制
+ if (commonX < ScreenUtil.dp2px(context, padding)) {
+ lp.x = ScreenUtil.dp2px(context, padding);
+ } else if ((int) (windowLocation[0] + ScreenUtil.dp2px(context, dialogWidth)) > ScreenUtil.getScreenWidth(context)) {
+ lp.x = ScreenUtil.getScreenWidth(context) - ScreenUtil.dp2px(context, padding) - ScreenUtil.dp2px(context, dialogWidth);
+ } else {
+ lp.x = commonX;
+ }
+ //Y方向限制
+ if (commonY < ScreenUtil.dp2px(context, padding)) {
+ lp.y = ScreenUtil.dp2px(context, padding);
+ } else {
+ lp.y = commonY;
+ }
+ //移动角的位置
+ float commonMove = windowLocation[0] + view.getWidth() / 2 - (lp.x + ScreenUtil.dp2px(context, dialogWidth / 2));
+ if (commonMove > ScreenUtil.dp2px(context, dialogWidth / 2) - ScreenUtil.dp2px(context, 20)) {
+ angleView.setTranslationX(ScreenUtil.dp2px(context, dialogWidth / 2) - ScreenUtil.dp2px(context, 20));
+ } else if (commonMove < -(ScreenUtil.dp2px(context, dialogWidth / 2) - ScreenUtil.dp2px(context, 10))) {
+ angleView.setTranslationX(-(ScreenUtil.dp2px(context, dialogWidth / 2) - ScreenUtil.dp2px(context, 20)));
+ } else {
+ angleView.setTranslationX(commonMove);
+ }
+ } else if (direction == Direction.BOTTOM) {
+ int commonX = (int) (windowLocation[0] + view.getWidth() / 2 - ScreenUtil.dp2px(context, dialogWidth / 2));
+ int commonY = 0;
+ if (context instanceof AppCompatActivity && ((AppCompatActivity) context).getSupportActionBar() != null) {
+ if (((AppCompatActivity) context).getSupportActionBar().isShowing()) {
+ commonY = (int) windowLocation[1] - ScreenUtil.getStatusBarHeight(context) + ScreenUtil.getActionBarHeight(context) + view.getHeight() - ScreenUtil.dp2px(context, marging);
+ }
+ } else {
+ commonY = (int) windowLocation[1] - ScreenUtil.getStatusBarHeight(context) + view.getHeight() - ScreenUtil.dp2px(context, marging);
+ }
+ //X方向限制
+ if (commonX < ScreenUtil.dp2px(context, padding)) {
+ lp.x = ScreenUtil.dp2px(context, padding);
+ } else if ((int) (windowLocation[0] + ScreenUtil.dp2px(context, dialogWidth)) > ScreenUtil.getScreenWidth(context)) {
+ lp.x = ScreenUtil.getScreenWidth(context) - ScreenUtil.dp2px(context, padding) - ScreenUtil.dp2px(context, dialogWidth);
+ } else {
+ lp.x = commonX;
+ }
+ //Y方向限制
+ if (commonY > ScreenUtil.getScreenHeight(context) - getDialogHeight()) {
+ lp.y = ScreenUtil.getScreenHeight(context) - ScreenUtil.dp2px(context, padding) - getDialogHeight();
+ } else {
+ lp.y = commonY;
+ }
+ //移动角的位置
+ float commonMove = windowLocation[0] + view.getWidth() / 2 - (lp.x + ScreenUtil.dp2px(context, dialogWidth / 2));
+ if (commonMove > ScreenUtil.dp2px(context, dialogWidth / 2) - ScreenUtil.dp2px(context, 20)) {
+ angleView.setTranslationX(ScreenUtil.dp2px(context, dialogWidth / 2) - ScreenUtil.dp2px(context, 20));
+ } else if (commonMove < -(ScreenUtil.dp2px(context, dialogWidth / 2) - ScreenUtil.dp2px(context, 10))) {
+ angleView.setTranslationX(-(ScreenUtil.dp2px(context, dialogWidth / 2) - ScreenUtil.dp2px(context, 20)));
+ } else {
+ angleView.setTranslationX(commonMove);
+ }
+ }
+
+ window.setAttributes(lp);
+ dialog.show();
+ }
+
+ /**
+ * 弹窗的高度
+ *
+ * @return
+ */
+ private int getDialogHeight() {
+ return ScreenUtil.dp2px(context, (float) (50 * baseItemViewList.size() + 0.5 * (baseItemViewList.size() - 1) + 16 + marging));
+ }
+
+ /**
+ * 判断是否点击到view内
+ *
+ * @param view 需要判断的view
+ * @param x 点击的x坐标 event.getRawX()
+ * @param y 点击的y坐标 event.getRawY()
+ * @return true在view内
+ */
+
+ private boolean isTouchPointInView(View view, float x, float y) {
+ int location[] = new int[2];
+ view.getLocationOnScreen(location);
+ int left = location[0];
+ int top = location[1];
+ int right = left + view.getMeasuredWidth();
+ int bottom = top + view.getMeasuredHeight();
+ return y >= top && y <= bottom && x >= left && x <= right;
+ }
+
+ /**
+ * 弹窗实现类
+ */
+ private void setWindowInternal() {
+
+ }
+
+ /**
+ * 显示弹窗
+ */
+ public void show(View view) {
+ if (baseItemViewList.size() > 0) {
+ clickView = view;
+ setPosition(view);
+ }
+ }
+
+ /**
+ * 返回点击的View
+ *
+ * @return view
+ */
+ @Nullable
+ public View getView() {
+ return clickView;
+ }
+
+ public void show() {
+
+ }
+
+ /**
+ * 隐藏弹窗
+ */
+ public void dismiss() {
+ dialog.cancel();
+ }
+}
diff --git a/app/src/main/java/com/skipping/view/bubblewindow/Direction.java b/app/src/main/java/com/skipping/view/bubblewindow/Direction.java
new file mode 100644
index 0000000..ff8ab4b
--- /dev/null
+++ b/app/src/main/java/com/skipping/view/bubblewindow/Direction.java
@@ -0,0 +1,18 @@
+package com.skipping.view.bubblewindow;
+
+import androidx.annotation.IntDef;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Created by Ming
+ * 2020-08-14
+ */
+
+@Retention(RetentionPolicy.SOURCE)
+@IntDef({Direction.TOP, Direction.BOTTOM})
+public @interface Direction {
+ int TOP = 0;
+ int BOTTOM = 1;
+}
diff --git a/app/src/main/java/com/skipping/view/bubblewindow/OnItemClick.java b/app/src/main/java/com/skipping/view/bubblewindow/OnItemClick.java
new file mode 100644
index 0000000..12bd0fd
--- /dev/null
+++ b/app/src/main/java/com/skipping/view/bubblewindow/OnItemClick.java
@@ -0,0 +1,10 @@
+package com.skipping.view.bubblewindow;
+
+
+/**
+ * Created by Ming
+ * 2020-08-11
+ */
+public interface OnItemClick {
+ void onClick(String tag, int position, BubbleWindow bubbleWindow);
+}
diff --git a/app/src/main/java/com/skipping/view/bubblewindow/Theme.java b/app/src/main/java/com/skipping/view/bubblewindow/Theme.java
new file mode 100644
index 0000000..1efa6cb
--- /dev/null
+++ b/app/src/main/java/com/skipping/view/bubblewindow/Theme.java
@@ -0,0 +1,17 @@
+package com.skipping.view.bubblewindow;
+
+import androidx.annotation.IntDef;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Created by Ming
+ * 12/29/20
+ */
+@Retention(RetentionPolicy.SOURCE)
+@IntDef({Theme.LIGHT, Theme.DARK})
+public @interface Theme {
+ int LIGHT = 0;
+ int DARK = 1;
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/skipping/view/bubblewindow/itemview/BaseItemView.java b/app/src/main/java/com/skipping/view/bubblewindow/itemview/BaseItemView.java
new file mode 100644
index 0000000..25204bb
--- /dev/null
+++ b/app/src/main/java/com/skipping/view/bubblewindow/itemview/BaseItemView.java
@@ -0,0 +1,23 @@
+package com.skipping.view.bubblewindow.itemview;
+
+import android.content.Context;
+import android.view.View;
+
+
+/**
+ * Created by Ming
+ * 2020-08-11
+ */
+public abstract class BaseItemView {
+
+ public View view;
+ public String tag;
+ public Context context;
+
+ public BaseItemView(Context context, String tag){
+ this.tag = tag;
+ this.context = context;
+ }
+
+ public abstract void setView();
+}
diff --git a/app/src/main/java/com/skipping/view/bubblewindow/itemview/ImageTextItemView.java b/app/src/main/java/com/skipping/view/bubblewindow/itemview/ImageTextItemView.java
new file mode 100644
index 0000000..0d3ef5d
--- /dev/null
+++ b/app/src/main/java/com/skipping/view/bubblewindow/itemview/ImageTextItemView.java
@@ -0,0 +1,40 @@
+package com.skipping.view.bubblewindow.itemview;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import androidx.annotation.DrawableRes;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.core.content.ContextCompat;
+
+import com.skipping.R;
+
+
+/**
+ * Created by Ming
+ * 2020-08-11
+ */
+public class ImageTextItemView extends BaseItemView {
+ private String text;
+ private int img;
+
+ public ImageTextItemView(@NonNull Context context, @Nullable String tag, @Nullable String text, @DrawableRes int img) {
+ super(context, tag);
+ this.text = text;
+ this.img = img;
+ }
+
+ @Override
+ public void setView() {
+ View itemView = LayoutInflater.from(context).inflate(R.layout.bubble_item_layout_imgtext, null);
+ TextView textView = itemView.findViewById(R.id.list_item_tv);
+ ImageView imageView = itemView.findViewById(R.id.list_item_img);
+ textView.setText(text);
+ imageView.setImageDrawable(ContextCompat.getDrawable(context, img));
+ view = itemView;
+ }
+}
diff --git a/app/src/main/java/com/skipping/view/bubblewindow/itemview/TextItemView.java b/app/src/main/java/com/skipping/view/bubblewindow/itemview/TextItemView.java
new file mode 100644
index 0000000..87eb6ca
--- /dev/null
+++ b/app/src/main/java/com/skipping/view/bubblewindow/itemview/TextItemView.java
@@ -0,0 +1,30 @@
+package com.skipping.view.bubblewindow.itemview;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.TextView;
+
+import com.skipping.R;
+
+
+/**
+ * Created by Ming
+ * 2020-08-11
+ */
+public class TextItemView extends BaseItemView {
+ private String text;
+
+ public TextItemView(Context context, String tag, String text) {
+ super(context, tag);
+ this.text = text;
+ }
+
+ @Override
+ public void setView() {
+ View itemView = LayoutInflater.from(context).inflate(R.layout.bubble_item_layout_text, null);
+ TextView textView = itemView.findViewById(R.id.list_item_tv);
+ textView.setText(text);
+ view = itemView;
+ }
+}
diff --git a/app/src/main/res/drawable/bubblewindow_angle_bottom.xml b/app/src/main/res/drawable/bubblewindow_angle_bottom.xml
new file mode 100644
index 0000000..70f3260
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_angle_bottom.xml
@@ -0,0 +1,16 @@
+
+
+ -
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bubblewindow_angle_bottom_clicked.xml b/app/src/main/res/drawable/bubblewindow_angle_bottom_clicked.xml
new file mode 100644
index 0000000..085718e
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_angle_bottom_clicked.xml
@@ -0,0 +1,16 @@
+
+
+ -
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bubblewindow_angle_bottom_dark.xml b/app/src/main/res/drawable/bubblewindow_angle_bottom_dark.xml
new file mode 100644
index 0000000..2eda75f
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_angle_bottom_dark.xml
@@ -0,0 +1,16 @@
+
+
+ -
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bubblewindow_angle_bottom_selector.xml b/app/src/main/res/drawable/bubblewindow_angle_bottom_selector.xml
new file mode 100644
index 0000000..95225e2
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_angle_bottom_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bubblewindow_angle_top.xml b/app/src/main/res/drawable/bubblewindow_angle_top.xml
new file mode 100644
index 0000000..7f552db
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_angle_top.xml
@@ -0,0 +1,16 @@
+
+
+ -
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bubblewindow_angle_top_clicked.xml b/app/src/main/res/drawable/bubblewindow_angle_top_clicked.xml
new file mode 100644
index 0000000..20adc72
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_angle_top_clicked.xml
@@ -0,0 +1,16 @@
+
+
+ -
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bubblewindow_angle_top_dark.xml b/app/src/main/res/drawable/bubblewindow_angle_top_dark.xml
new file mode 100644
index 0000000..aa016eb
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_angle_top_dark.xml
@@ -0,0 +1,16 @@
+
+
+ -
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bubblewindow_angle_top_selector.xml b/app/src/main/res/drawable/bubblewindow_angle_top_selector.xml
new file mode 100644
index 0000000..af36a27
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_angle_top_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bubblewindow_background.xml b/app/src/main/res/drawable/bubblewindow_background.xml
new file mode 100644
index 0000000..61d658a
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_background.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bubblewindow_background_dark.xml b/app/src/main/res/drawable/bubblewindow_background_dark.xml
new file mode 100644
index 0000000..ffdc596
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_background_dark.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bubblewindow_bottom_selector.xml b/app/src/main/res/drawable/bubblewindow_bottom_selector.xml
new file mode 100644
index 0000000..61eee97
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_bottom_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bubblewindow_center_selector.xml b/app/src/main/res/drawable/bubblewindow_center_selector.xml
new file mode 100644
index 0000000..d530ccf
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_center_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bubblewindow_item_bottom.xml b/app/src/main/res/drawable/bubblewindow_item_bottom.xml
new file mode 100644
index 0000000..f2b43a4
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_item_bottom.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bubblewindow_item_bottom_clicked.xml b/app/src/main/res/drawable/bubblewindow_item_bottom_clicked.xml
new file mode 100644
index 0000000..de5fd88
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_item_bottom_clicked.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bubblewindow_item_bottom_dark.xml b/app/src/main/res/drawable/bubblewindow_item_bottom_dark.xml
new file mode 100644
index 0000000..53ea6fc
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_item_bottom_dark.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bubblewindow_item_center.xml b/app/src/main/res/drawable/bubblewindow_item_center.xml
new file mode 100644
index 0000000..417ef1a
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_item_center.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bubblewindow_item_center_clicked.xml b/app/src/main/res/drawable/bubblewindow_item_center_clicked.xml
new file mode 100644
index 0000000..a1b66f3
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_item_center_clicked.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bubblewindow_item_center_dark.xml b/app/src/main/res/drawable/bubblewindow_item_center_dark.xml
new file mode 100644
index 0000000..e84c4e1
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_item_center_dark.xml
@@ -0,0 +1,4 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bubblewindow_item_clicked.xml b/app/src/main/res/drawable/bubblewindow_item_clicked.xml
new file mode 100644
index 0000000..2d755be
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_item_clicked.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bubblewindow_item_top.xml b/app/src/main/res/drawable/bubblewindow_item_top.xml
new file mode 100644
index 0000000..052ed43
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_item_top.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bubblewindow_item_top_clicked.xml b/app/src/main/res/drawable/bubblewindow_item_top_clicked.xml
new file mode 100644
index 0000000..a17f95b
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_item_top_clicked.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bubblewindow_item_top_dark.xml b/app/src/main/res/drawable/bubblewindow_item_top_dark.xml
new file mode 100644
index 0000000..778bb29
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_item_top_dark.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bubblewindow_one_selector.xml b/app/src/main/res/drawable/bubblewindow_one_selector.xml
new file mode 100644
index 0000000..2e03071
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_one_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/bubblewindow_top_selector.xml b/app/src/main/res/drawable/bubblewindow_top_selector.xml
new file mode 100644
index 0000000..6827c7d
--- /dev/null
+++ b/app/src/main/res/drawable/bubblewindow_top_selector.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/cancel.xml b/app/src/main/res/drawable/cancel.xml
new file mode 100644
index 0000000..e491b64
--- /dev/null
+++ b/app/src/main/res/drawable/cancel.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/grid_chengji.xml b/app/src/main/res/drawable/grid_chengji.xml
new file mode 100644
index 0000000..9d3523f
--- /dev/null
+++ b/app/src/main/res/drawable/grid_chengji.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/grid_item_bg.xml b/app/src/main/res/drawable/grid_item_bg.xml
new file mode 100644
index 0000000..d1a8df5
--- /dev/null
+++ b/app/src/main/res/drawable/grid_item_bg.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/grid_left.xml b/app/src/main/res/drawable/grid_left.xml
new file mode 100644
index 0000000..e81b8bc
--- /dev/null
+++ b/app/src/main/res/drawable/grid_left.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/grid_right.xml b/app/src/main/res/drawable/grid_right.xml
new file mode 100644
index 0000000..dc7e8b8
--- /dev/null
+++ b/app/src/main/res/drawable/grid_right.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ic_menu_camera.xml b/app/src/main/res/drawable/ic_menu_camera.xml
new file mode 100644
index 0000000..634fe92
--- /dev/null
+++ b/app/src/main/res/drawable/ic_menu_camera.xml
@@ -0,0 +1,12 @@
+
+
+
+
diff --git a/app/src/main/res/drawable/ic_menu_gallery.xml b/app/src/main/res/drawable/ic_menu_gallery.xml
new file mode 100644
index 0000000..03c7709
--- /dev/null
+++ b/app/src/main/res/drawable/ic_menu_gallery.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/ic_menu_slideshow.xml b/app/src/main/res/drawable/ic_menu_slideshow.xml
new file mode 100644
index 0000000..5e9e163
--- /dev/null
+++ b/app/src/main/res/drawable/ic_menu_slideshow.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/drawable/left_clicked.xml b/app/src/main/res/drawable/left_clicked.xml
new file mode 100644
index 0000000..06bf55d
--- /dev/null
+++ b/app/src/main/res/drawable/left_clicked.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/left_unclicked.xml b/app/src/main/res/drawable/left_unclicked.xml
new file mode 100644
index 0000000..81d7397
--- /dev/null
+++ b/app/src/main/res/drawable/left_unclicked.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/ok.xml b/app/src/main/res/drawable/ok.xml
new file mode 100644
index 0000000..79000cc
--- /dev/null
+++ b/app/src/main/res/drawable/ok.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/right_clicked.xml b/app/src/main/res/drawable/right_clicked.xml
new file mode 100644
index 0000000..99aad2d
--- /dev/null
+++ b/app/src/main/res/drawable/right_clicked.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/right_unclicked.xml b/app/src/main/res/drawable/right_unclicked.xml
new file mode 100644
index 0000000..97b14cc
--- /dev/null
+++ b/app/src/main/res/drawable/right_unclicked.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/side_nav_bar.xml b/app/src/main/res/drawable/side_nav_bar.xml
new file mode 100644
index 0000000..6d81870
--- /dev/null
+++ b/app/src/main/res/drawable/side_nav_bar.xml
@@ -0,0 +1,9 @@
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/splash_preview.xml b/app/src/main/res/drawable/splash_preview.xml
index 94ff8a8..350e798 100644
--- a/app/src/main/res/drawable/splash_preview.xml
+++ b/app/src/main/res/drawable/splash_preview.xml
@@ -5,7 +5,7 @@
-
diff --git a/app/src/main/res/layout/activity_home.xml b/app/src/main/res/layout/activity_home.xml
index 31b0956..8d1d137 100644
--- a/app/src/main/res/layout/activity_home.xml
+++ b/app/src/main/res/layout/activity_home.xml
@@ -1,52 +1,323 @@
-
+ android:orientation="vertical">
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ android:fitsSystemWindows="true" >
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+ android:layout_marginLeft="60dp"
+ android:layout_marginTop="20dp"
+ android:text="每组学生数量"
+ android:textColor="@color/color_70_E6E6E6"
+ android:textSize="20dp" />
-
-
-
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_perform.xml b/app/src/main/res/layout/activity_perform.xml
new file mode 100644
index 0000000..3b8c8b6
--- /dev/null
+++ b/app/src/main/res/layout/activity_perform.xml
@@ -0,0 +1,204 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/bubble_item_layout_imgtext.xml b/app/src/main/res/layout/bubble_item_layout_imgtext.xml
new file mode 100644
index 0000000..0c59a27
--- /dev/null
+++ b/app/src/main/res/layout/bubble_item_layout_imgtext.xml
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/bubble_item_layout_text.xml b/app/src/main/res/layout/bubble_item_layout_text.xml
new file mode 100644
index 0000000..c30e6f5
--- /dev/null
+++ b/app/src/main/res/layout/bubble_item_layout_text.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/bubble_layout.xml b/app/src/main/res/layout/bubble_layout.xml
new file mode 100644
index 0000000..a524c2f
--- /dev/null
+++ b/app/src/main/res/layout/bubble_layout.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/grid_item.xml b/app/src/main/res/layout/grid_item.xml
new file mode 100644
index 0000000..a52823c
--- /dev/null
+++ b/app/src/main/res/layout/grid_item.xml
@@ -0,0 +1,149 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/perform_item.xml b/app/src/main/res/layout/perform_item.xml
new file mode 100644
index 0000000..190b06c
--- /dev/null
+++ b/app/src/main/res/layout/perform_item.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-mdpi/down.png b/app/src/main/res/mipmap-mdpi/down.png
new file mode 100644
index 0000000..25275c5
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/down.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/down.png b/app/src/main/res/mipmap-xhdpi/down.png
new file mode 100644
index 0000000..25275c5
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/down.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/right.png b/app/src/main/res/mipmap-xhdpi/right.png
new file mode 100644
index 0000000..422af55
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/right.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/down.png b/app/src/main/res/mipmap-xxhdpi/down.png
new file mode 100644
index 0000000..25275c5
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/down.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/right.png b/app/src/main/res/mipmap-xxhdpi/right.png
new file mode 100644
index 0000000..422af55
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/right.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/down.png b/app/src/main/res/mipmap-xxxhdpi/down.png
new file mode 100644
index 0000000..25275c5
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/down.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/right.png b/app/src/main/res/mipmap-xxxhdpi/right.png
new file mode 100644
index 0000000..422af55
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/right.png differ
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index d8da60e..19f9209 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -7,7 +7,7 @@
#FF018786
#FF000000
#FFFFFFFF
- #ffc20e
+ #2C2C2C
#ffc20e
#2C2C2C
#F7FFF300
@@ -24,4 +24,8 @@
#D9D9D9
#F4EA2A
#00FF55
+ #80D8D8D8
+ #4DE6E6E6
+ #8C2C2C2C
+ #1296DB
\ No newline at end of file
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..4ab4520
--- /dev/null
+++ b/app/src/main/res/values/dimens.xml
@@ -0,0 +1,8 @@
+
+
+ 16dp
+ 16dp
+ 8dp
+ 176dp
+ 16dp
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 47ffdae..9497779 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1,3 +1,14 @@
Skipping
+ MainActivity
+ Open navigation drawer
+ Close navigation drawer
+ Android Studio
+ android.studio@android.com
+ Navigation header
+ Settings
+
+ Home
+ Gallery
+ Slideshow
\ No newline at end of file
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 4c5ceed..b96698b 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -8,4 +8,12 @@
- true
- @drawable/splash_preview
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index d7ab5ca..ede9044 100644
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -26,4 +26,13 @@
- @drawable/splash_preview
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index 7971f3b..8271376 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,5 +1,8 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
+ ext {
+ kotlin_version = '1.4.31'
+ }
repositories {
google()
mavenCentral()
diff --git a/libs/src/main/java/com/libs/fragment/BaseActivity.java b/libs/src/main/java/com/libs/fragment/BaseActivity.java
index a18a73f..dda6ca5 100644
--- a/libs/src/main/java/com/libs/fragment/BaseActivity.java
+++ b/libs/src/main/java/com/libs/fragment/BaseActivity.java
@@ -26,7 +26,6 @@ import java.util.concurrent.Callable;
import java.util.concurrent.Future;
-
/**
* Created by Ming
* 2020-08-20
@@ -53,7 +52,9 @@ public abstract class BaseActivity extends RxFragmentAc
method = "onCreate";
super.onCreate(savedInstanceState);
initStart();
- setContentView(getContentViewResId());
+ if (getContentViewResId() != null) {
+ setContentView(getContentViewResId());
+ }
toolBar = searchToolBar(findViewById(android.R.id.content));
initView();
initData();
@@ -62,7 +63,7 @@ public abstract class BaseActivity
extends RxFragmentAc
/**
* 获取布局
*/
- protected abstract int getContentViewResId();
+ protected abstract Integer getContentViewResId();
/**
* 初始化P层
@@ -124,9 +125,11 @@ public abstract class BaseActivity
extends RxFragmentAc
/**
* 加载布局前
*/
- public void initStart(){
+ public void initStart() {
- };
+ }
+
+ ;
/**
* 初始布局
diff --git a/libs/src/main/java/com/libs/network/Concise.java b/libs/src/main/java/com/libs/network/Concise.java
index 90a0e42..7dacb09 100644
--- a/libs/src/main/java/com/libs/network/Concise.java
+++ b/libs/src/main/java/com/libs/network/Concise.java
@@ -104,10 +104,6 @@ public class Concise {
public Concise build() {
- Type s = getClass().getGenericSuperclass();
- LogUtil.e(s);
- ParameterizedType p = (ParameterizedType) s;
- Class t = (Class) p.getActualTypeArguments()[0];
Class tClass = (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
api = new Retrofit.Builder()
.client(createClient())