From 076a0c3dd66274013a05f65506e9ab0d610669b9 Mon Sep 17 00:00:00 2001 From: niushuai233 Date: Mon, 15 Apr 2024 17:42:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20:seat:=20icon=E9=80=89=E6=8B=A9?= =?UTF-8?q?=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/setting/icon/IconFragment.java | 3 +- .../icon/recycle/IconRecycleAdapter.java | 52 +++-- .../setting/project/NewProjectActivity.java | 178 +++++++++++++++--- app/src/main/res/layout/fragment_icon.xml | 15 +- .../main/res/layout/fragment_icon_dialog.xml | 36 ++++ app/src/main/res/layout/icon_grid_item.xml | 6 +- app/src/main/res/values/colors.xml | 1 + 7 files changed, 244 insertions(+), 47 deletions(-) create mode 100644 app/src/main/res/layout/fragment_icon_dialog.xml diff --git a/app/src/main/java/cc/niushuai/dididone/ui/setting/icon/IconFragment.java b/app/src/main/java/cc/niushuai/dididone/ui/setting/icon/IconFragment.java index b968625..5ce0eb5 100644 --- a/app/src/main/java/cc/niushuai/dididone/ui/setting/icon/IconFragment.java +++ b/app/src/main/java/cc/niushuai/dididone/ui/setting/icon/IconFragment.java @@ -18,6 +18,7 @@ import androidx.recyclerview.widget.DividerItemDecoration; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; +import com.mikepenz.community_material_typeface_library.CommunityMaterial; import com.mikepenz.fontawesome_typeface_library.FontAwesome; import java.util.ArrayList; @@ -108,7 +109,7 @@ public class IconFragment extends Fragment implements InitAndSetListener { LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity()); binding.iconsRecyclerView.setLayoutManager(layoutManager); - iconRecycleAdapter = new IconRecycleAdapter(getActivity(), FontAwesome.Icon.class); + iconRecycleAdapter = new IconRecycleAdapter(getActivity(), CommunityMaterial.Icon.class); binding.iconsRecyclerView.setAdapter(iconRecycleAdapter); } diff --git a/app/src/main/java/cc/niushuai/dididone/ui/setting/icon/recycle/IconRecycleAdapter.java b/app/src/main/java/cc/niushuai/dididone/ui/setting/icon/recycle/IconRecycleAdapter.java index 2ec7206..38ea374 100644 --- a/app/src/main/java/cc/niushuai/dididone/ui/setting/icon/recycle/IconRecycleAdapter.java +++ b/app/src/main/java/cc/niushuai/dididone/ui/setting/icon/recycle/IconRecycleAdapter.java @@ -1,6 +1,8 @@ package cc.niushuai.dididone.ui.setting.icon.recycle; -import android.content.Context; +import android.app.Activity; +import android.graphics.Color; +import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; @@ -12,31 +14,36 @@ import androidx.recyclerview.widget.RecyclerView; import com.mikepenz.iconics.IconicsDrawable; import com.mikepenz.iconics.typeface.IIcon; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Predicate; import java.util.stream.Collectors; -import cc.niushuai.dididone.MainActivity; import cc.niushuai.dididone.R; import cc.niushuai.dididone.biz.entity.SavedIcon; +import cc.niushuai.dididone.databinding.IconGridItemBinding; +import cc.niushuai.dididone.util.XLog; public class IconRecycleAdapter extends RecyclerView.Adapter { public static final Map> ICON_MAP = new HashMap<>(); private Class iconClass; private List savedIconList; + private Activity activity; - private Context context; + private String selectedIcon; - public IconRecycleAdapter(Context context, Class iconClass) { - this.context = context; + public IconRecycleAdapter(Activity activity, Class iconClass) { + this.activity = activity; this.iconClass = iconClass; change(getIconClassName(iconClass), item -> true); } + public String getSelectedIcon() { + return selectedIcon; + } + public void change(String name, Predicate filter) { if (null == name) { name = getIconClassName(iconClass); @@ -54,10 +61,13 @@ public class IconRecycleAdapter extends RecyclerView.Adapter { + lastSelectedPosition = selectedPosition; + selectedPosition = holder.getBindingAdapterPosition(); + notifyItemChanged(lastSelectedPosition); + notifyItemChanged(selectedPosition); + }); + if (selectedPosition == holder.getBindingAdapterPosition()) { + holder.binding.iconsGridLayout.setBackgroundColor(activity.getColor(R.color.theme_color_primary)); + } else { + holder.binding.iconsGridLayout.setBackgroundColor(Color.WHITE); + } + + selectedIcon = icon.getIcon(); + XLog.d("onItemClick position: {}, icon: {}, selectedIcon: {}", position, icon.getIcon(), selectedIcon); } /** @@ -87,17 +112,22 @@ public class IconRecycleAdapter extends RecyclerView.Adapter item.getIcon().contains(s.toString())); + } + }); + } + + private void initIconDialogRecyclerView(View iconDialogView) { + RecyclerView iconDialogRecyclerView = iconDialogView.findViewById(R.id.icons_dialog_recyclerView); + + iconDialogRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL)); + DefaultItemAnimator itemAnimator = new DefaultItemAnimator(); + itemAnimator.setAddDuration(1000); + itemAnimator.setRemoveDuration(1000); + iconDialogRecyclerView.setItemAnimator(itemAnimator); + + LinearLayoutManager layoutManager = new LinearLayoutManager(this); + iconDialogRecyclerView.setLayoutManager(layoutManager); + + iconRecycleAdapter = new IconRecycleAdapter(this, CommunityMaterial.Icon.class); + iconDialogRecyclerView.setAdapter(iconRecycleAdapter); + } + + private void initIconDialogSpinner(View iconDialogView) { + Set keySet = IconRecycleAdapter.ICON_MAP.keySet(); + ArrayList keys = new ArrayList<>(keySet); + Collections.sort(keys); + + Spinner iconDialogSpinner = iconDialogView.findViewById(R.id.icons_dialog_select); + iconDialogSpinner.setAdapter(new ArrayAdapter(this, com.necer.R.layout.support_simple_spinner_dropdown_item, keys)); + iconDialogSpinner.setSelection(0); + + iconDialogSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + String key = keys.get(position); + String str = ((TextView) iconDialogView.findViewById(R.id.icons_dialog_search)).getText().toString(); + Predicate filter = item -> true; + if (null != str && str.length() > 0) { + filter = item -> item.getIcon().contains(str); + } + iconRecycleAdapter.change(key, filter); + } + + @Override + public void onNothingSelected(AdapterView parent) { + } + }); + } + @Override protected void setListeners() { // icon选择器 - binding.npIconFill.setOnClickListener(view -> { - }); + iconClickListener(); // 颜色选择器 + colorPickListener(); + + // 返回按钮 + binding.npButtonBack.setOnClickListener(view -> finish()); + + // 确定按钮 + binding.npButtonConfirm.setOnClickListener(view -> { + // 三种属性 + Intent data = new Intent(); + // 名称 + String projectName = binding.npProjectNameTxt.getText().toString(); + if (StrUtil.isEmpty(projectName)) { + Toasts.shortShow(this, "{}未填", getResources().getString(R.string.np_project_name)); + } + data.putExtra(BizGlobal.PROJECT_NAME, projectName); + // 图标 + data.putExtra(BizGlobal.PROJECT_ICON, selectedIcon); + // 颜色 + data.putExtra(BizGlobal.PROJECT_ICON_COLOR, selectedColor); + // 放置结果数据 + setResult(BizGlobal.REQUEST_CODE_GENERAL, data); + finish(); + }); + } + + private void colorPickListener() { binding.npColorPicker.setOnClickListener(view -> { ColorPickerDialog.Builder builder = new ColorPickerDialog.Builder(this); @@ -81,7 +203,8 @@ public class NewProjectActivity extends BaseActivity { XLog.d("选择的颜色:{} {} {}, fromUser: {}", envelope.getColor(), envelope.getArgb(), envelope.getHexCode(), fromUser); selectedColor = envelope.getColor(); - changeIconColor(envelope.getColor()); + // 改变图标以及颜色 + changeIcon(null, selectedColor); } }) .setNegativeButton(getString(R.string.cancel), (dialogInterface, i) -> { @@ -94,33 +217,40 @@ public class NewProjectActivity extends BaseActivity { builder.create().show(); }); + } - // 返回按钮 - binding.npButtonBack.setOnClickListener(view -> finish()); + private void iconClickListener() { - // 确定按钮 - binding.npButtonConfirm.setOnClickListener(view -> { - // 三种属性 - Intent data = new Intent(); - // 名称 - String projectName = binding.npProjectNameTxt.getText().toString(); - if (StrUtil.isEmpty(projectName)) { - Toasts.shortShow(this, "{}未填", getResources().getString(R.string.np_project_name)); - } - data.putExtra(BizGlobal.PROJECT_NAME, projectName); - // 图标 - data.putExtra(BizGlobal.PROJECT_ICON, binding.npProjectNameTxt.getText().toString()); - // 颜色 - data.putExtra(BizGlobal.PROJECT_ICON_COLOR, binding.npProjectNameTxt.getText().toString()); - // 放置结果数据 - setResult(BizGlobal.REQUEST_CODE_GENERAL, data); - finish(); + binding.npIconFill.setOnClickListener(view -> { + + View iconDialogView = View.inflate(this, R.layout.fragment_icon_dialog, null); + // 初始化 并且添加监听事件 + initIconDialogView(iconDialogView); + + AlertDialog.Builder builder = new AlertDialog.Builder(this).setTitle("选择一个图标"); + AlertDialog alertDialog = builder.setView(iconDialogView) + .setNegativeButton("返回", (dialog, which) -> dialog.dismiss()) + .setPositiveButton("选择该图标", (dialog, which) -> { + selectedIcon = iconRecycleAdapter.getSelectedIcon(); + changeIcon(selectedIcon, selectedColor); + }).create(); + + alertDialog.show(); }); } - private void changeIconColor(int color) { + /** + * 改变图标以及颜色 + * + * @param icon 图标 + * @param color 颜色 + */ + private void changeIcon(String icon, int color) { + if (StrUtil.isEmpty(icon)) { + icon = ReflectUtil.getFieldValue(binding.npIconFill.getDrawable(), "mIcon").toString(); + } binding.npIconFill.setImageDrawable(new IconicsDrawable(this) - .icon(ReflectUtil.getFieldValue(binding.npIconFill.getDrawable(), "mIcon").toString()) + .icon(icon) .color(color) .sizeDp(50) ); diff --git a/app/src/main/res/layout/fragment_icon.xml b/app/src/main/res/layout/fragment_icon.xml index f93d002..96c91dd 100644 --- a/app/src/main/res/layout/fragment_icon.xml +++ b/app/src/main/res/layout/fragment_icon.xml @@ -12,8 +12,7 @@ + android:layout_height="35dp" /> + android:inputType="text" + android:lines="1" + android:scrollHorizontally="true" /> + android:scrollbars="vertical" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_icon_dialog.xml b/app/src/main/res/layout/fragment_icon_dialog.xml new file mode 100644 index 0000000..5a72d41 --- /dev/null +++ b/app/src/main/res/layout/fragment_icon_dialog.xml @@ -0,0 +1,36 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/icon_grid_item.xml b/app/src/main/res/layout/icon_grid_item.xml index b62082d..6d946eb 100644 --- a/app/src/main/res/layout/icon_grid_item.xml +++ b/app/src/main/res/layout/icon_grid_item.xml @@ -1,9 +1,9 @@ + android:layout_height="wrap_content" + android:padding="20dp"> #FFFFFFFF #FFFF0000 + #F0B82B #333333 #666666 #F8FF26