feat: 重构背景管理系统,移除选择背景对话框并添加BackgroundUtils工具类

- 移除 BgSelectorDialog 对话框及 dialog_bg_selector 布局文件
- 移除 ImageViewerActivity 中的背景选择按钮及相关方法(switchBg/applyBg)
- 移除 CropActivity 中的背景颜色预览视图及 showBgDialog 方法
- 移除 ImagePagerAdapter 中的 bgType 参数,背景固定为黑色
- 新增 BackgroundUtils 单例工具类,支持:
  - 通过资源ID或颜色值创建背景Drawable
  - DrawableType枚举记录创建方式
  - SharedPreferences持久化存储背景配置
  - 首次启动默认使用绿色背景并保存
- 在 GlobalWinBoLLApplication 中初始化BackgroundUtils
- 在 MainActivity 中应用BackgroundUtils设置的背景
- 主窗口菜单添加修改背景颜色选项
This commit is contained in:
2026-05-02 09:54:48 +08:00
parent 91b2b1b480
commit 1585ff7eed
11 changed files with 138 additions and 262 deletions

View File

@@ -1,64 +0,0 @@
package cc.winboll.studio.gallery;
import android.app.Dialog;
import android.content.Context;
import android.view.View;
import android.widget.RadioButton;
import android.widget.RadioGroup;
public class BgSelectorDialog extends Dialog {
public interface OnBgSelectedListener {
void onBgSelected(int bgType);
}
private int currentBgType;
private OnBgSelectedListener listener;
public BgSelectorDialog(Context context, int currentBgType) {
super(context);
this.currentBgType = currentBgType;
setContentView(R.layout.dialog_bg_selector);
initViews();
}
private void initViews() {
RadioGroup radioGroup = findViewById(R.id.radio_group_bg);
RadioButton radioCheckerboard = findViewById(R.id.radio_checkerboard);
RadioButton radioWhite = findViewById(R.id.radio_white);
RadioButton radioBlack = findViewById(R.id.radio_black);
switch (currentBgType) {
case 0:
radioCheckerboard.setChecked(true);
break;
case 1:
radioWhite.setChecked(true);
break;
case 2:
radioBlack.setChecked(true);
break;
}
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
int which = 0;
if (checkedId == R.id.radio_white) {
which = 1;
} else if (checkedId == R.id.radio_black) {
which = 2;
}
if (listener != null) {
listener.onBgSelected(which);
}
dismiss();
}
});
}
public void setOnBgSelectedListener(OnBgSelectedListener listener) {
this.listener = listener;
}
}

View File

@@ -3,7 +3,6 @@ package cc.winboll.studio.gallery;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.RectF;
import android.graphics.drawable.GradientDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.content.DialogInterface;
@@ -74,15 +73,6 @@ public class CropActivity extends AppCompatActivity {
}
});
final ImageView btnBg = findViewById(R.id.btn_color_pick);
btnBg.setImageResource(R.drawable.ic_bg);
btnBg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showBgDialog();
}
});
findViewById(R.id.btn_done).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -118,11 +108,7 @@ public class CropActivity extends AppCompatActivity {
cropCanvasView = findViewById(R.id.crop_canvas_view);
final View colorView = findViewById(R.id.color_view);
final GradientDrawable colorDrawable = (GradientDrawable) colorView.getBackground();
cropCanvasView.setBackgroundType(bgType);
updateColorView(colorDrawable, bgType);
cropCanvasView.setOnBackgroundColorChangedListener(new CropCanvasView.OnBackgroundColorChangedListener() {
@Override
@@ -133,38 +119,6 @@ public class CropActivity extends AppCompatActivity {
loadImage();
}
private void updateColorView(GradientDrawable drawable, int bgType) {
switch (bgType) {
case 0:
drawable.setColor(0xFF808080);
break;
case 1:
drawable.setColor(0xFFFFFFFF);
break;
case 2:
default:
drawable.setColor(0xFF000000);
break;
}
}
private void showBgDialog() {
final View colorView = findViewById(R.id.color_view);
final GradientDrawable colorDrawable = (GradientDrawable) colorView.getBackground();
final int currentBgType = cropCanvasView.getBackgroundType();
BgSelectorDialog dialog = new BgSelectorDialog(this, currentBgType);
dialog.setOnBgSelectedListener(new BgSelectorDialog.OnBgSelectedListener() {
@Override
public void onBgSelected(int which) {
cropCanvasView.setBackgroundType(which);
prefs.setBgType(which);
updateColorView(colorDrawable, which);
}
});
dialog.show();
}
private void loadImage() {
try {
if (imagePath != null && new File(imagePath).exists()) {

View File

@@ -4,6 +4,7 @@ import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.ToastUtils;
import cc.winboll.studio.gallery.utils.BackgroundUtils;
/**
* @Author 豆包&ZhanGSKen<zhangsken@qq.com>
@@ -23,6 +24,8 @@ public class GlobalWinBoLLApplication extends GlobalApplication {
WinBoLLActivityManager.init(this);
BackgroundUtils.initFromPreferences(this);
// 初始化 Toast 框架
ToastUtils.init(this);
// 设置 Toast 布局样式

View File

@@ -16,25 +16,10 @@ import cc.winboll.studio.libappbase.LogUtils;
public class ImagePagerAdapter extends PagerAdapter {
public static final String TAG = "ImagePagerAdapter";
private ArrayList<Uri> imageUrls;
private int bgType;
public ImagePagerAdapter(ArrayList<Uri> imageUrls, int bgType) {
public ImagePagerAdapter(ArrayList<Uri> imageUrls) {
this.imageUrls = imageUrls;
this.bgType = bgType;
LogUtils.d(TAG, "ImagePagerAdapter created with " + imageUrls.size() + " images, bgType=" + bgType);
}
private int getBgRes() {
switch (bgType) {
case 0:
return R.drawable.bg_checkerboard;
case 1:
return R.drawable.bg_white;
case 2:
return R.drawable.bg_black;
default:
return R.drawable.bg_checkerboard;
}
LogUtils.d(TAG, "ImagePagerAdapter created with " + imageUrls.size() + " images");
}
@Override
@@ -47,7 +32,7 @@ public class ImagePagerAdapter extends PagerAdapter {
public Object instantiateItem(@NonNull ViewGroup container, int position) {
View view = LayoutInflater.from(container.getContext())
.inflate(R.layout.item_image_pager, container, false);
view.setBackgroundResource(getBgRes());
view.setBackgroundResource(R.color.black);
ImageView imageView = view.findViewById(R.id.image);
Glide.with(imageView.getContext())

View File

@@ -34,9 +34,7 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
private ImageButton btnDelete;
private ImageButton btnShare;
private ImageButton btnInfo;
private ImageButton btnBg;
private ImageButton btnGallery;
private int bgType = 0;
private GestureDetector gestureDetector;
private TrashManager trashManager;
private Preferences prefs;
@@ -55,7 +53,6 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
trashManager = new TrashManager(this);
prefs = new Preferences(this);
bgType = prefs.getBgType();
viewPager = findViewById(R.id.view_pager);
toolbar = findViewById(R.id.toolbar);
@@ -63,13 +60,10 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
btnDelete = findViewById(R.id.btn_delete);
btnShare = findViewById(R.id.btn_share);
btnInfo = findViewById(R.id.btn_info);
btnBg = findViewById(R.id.btn_bg);
btnGallery = findViewById(R.id.btn_gallery);
applyBg();
ImagePagerAdapter adapter = new ImagePagerAdapter(imageUrls, bgType);
ImagePagerAdapter adapter = new ImagePagerAdapter(imageUrls);
viewPager.setAdapter(adapter);
viewPager.setCurrentItem(currentPosition);
viewPager.addOnPageChangeListener(this);
@@ -117,13 +111,6 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
}
});
btnBg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switchBg();
}
});
btnGallery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
@@ -147,48 +134,6 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
}
}
private void applyBg() {
int bgRes;
switch (bgType) {
case 0:
bgRes = R.drawable.bg_checkerboard;
break;
case 1:
bgRes = R.drawable.bg_white;
break;
case 2:
bgRes = R.drawable.bg_black;
break;
default:
bgRes = R.drawable.bg_checkerboard;
}
View container = findViewById(R.id.container);
if (container != null) {
container.setBackgroundResource(bgRes);
}
}
private void switchBg() {
final int[] bgResources = {R.drawable.bg_checkerboard, R.drawable.bg_white, R.drawable.bg_black};
BgSelectorDialog dialog = new BgSelectorDialog(this, bgType);
dialog.setOnBgSelectedListener(new BgSelectorDialog.OnBgSelectedListener() {
@Override
public void onBgSelected(int which) {
bgType = which;
prefs.setBgType(which);
int currentItem = viewPager.getCurrentItem();
View container = findViewById(R.id.container);
if (container != null) {
container.setBackgroundResource(bgResources[which]);
}
viewPager.setAdapter(new ImagePagerAdapter(imageUrls, bgType));
viewPager.setCurrentItem(currentItem);
}
});
dialog.show();
}
private void showDeleteDialog() {
new AlertDialog.Builder(this)
.setMessage("Delete to trash?")
@@ -253,7 +198,7 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
if (currentPosition >= imageUrls.size()) {
currentPosition = imageUrls.size() - 1;
}
viewPager.setAdapter(new ImagePagerAdapter(imageUrls, bgType));
viewPager.setAdapter(new ImagePagerAdapter(imageUrls));
viewPager.setCurrentItem(currentPosition);
}
}

View File

@@ -28,6 +28,7 @@ import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import cc.winboll.studio.gallery.AlbumAdapter.OnAlbumClickListener;
import cc.winboll.studio.gallery.utils.BackgroundUtils;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.LogActivity;
import java.io.File;
@@ -50,6 +51,11 @@ public class MainActivity extends AppCompatActivity {
setContentView(R.layout.activity_main);
LogUtils.d(TAG, "onCreate");
View content = findViewById(android.R.id.content);
if (content != null) {
content.setBackground(BackgroundUtils.getInstance().getDrawable());
}
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
@@ -295,6 +301,9 @@ private void loadAlbums() {
intent.addCategory(Intent.CATEGORY_APP_GALLERY);
startActivity(intent);
return true;
} else if (id == R.id.action_change_bg_color) {
Toast.makeText(this, "修改背景颜色", Toast.LENGTH_SHORT).show();
return true;
} else if (id == R.id.action_settings) {
startActivity(new Intent(this, SettingsActivity.class));
return true;

View File

@@ -0,0 +1,116 @@
package cc.winboll.studio.gallery.utils;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import androidx.annotation.ColorInt;
import androidx.annotation.DrawableRes;
import androidx.core.content.ContextCompat;
public class BackgroundUtils {
public enum DrawableType {
RESOURCE_ID,
COLOR
}
private static volatile BackgroundUtils instance;
private static final String PREF_NAME = "background_prefs";
private static final String KEY_TYPE = "bg_type";
private static final String KEY_RES_ID = "bg_res_id";
private static final String KEY_COLOR = "bg_color";
private Context context;
private Drawable drawable;
private DrawableType drawableType;
private int resId;
private int color;
private BackgroundUtils() {
}
public static BackgroundUtils getInstance() {
if (instance == null) {
synchronized (BackgroundUtils.class) {
if (instance == null) {
instance = new BackgroundUtils();
}
}
}
return instance;
}
public static BackgroundUtils initFromResource(Context context, @DrawableRes int resId) {
synchronized (BackgroundUtils.class) {
BackgroundUtils utils = getInstance();
utils.context = context.getApplicationContext();
utils.drawableType = DrawableType.RESOURCE_ID;
utils.resId = resId;
utils.drawable = ContextCompat.getDrawable(utils.context, resId);
return utils;
}
}
public static BackgroundUtils initFromColor(Context context, @ColorInt int color) {
synchronized (BackgroundUtils.class) {
BackgroundUtils utils = getInstance();
utils.context = context.getApplicationContext();
utils.drawableType = DrawableType.COLOR;
utils.color = color;
utils.drawable = new ColorDrawable(color);
return utils;
}
}
public static BackgroundUtils initFromPreferences(Context context) {
synchronized (BackgroundUtils.class) {
Context appContext = context.getApplicationContext();
SharedPreferences prefs = appContext.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
int type = prefs.getInt(KEY_TYPE, -1);
if (type == 0) {
int resId = prefs.getInt(KEY_RES_ID, 0);
if (resId != 0) {
return initFromResource(appContext, resId);
}
} else if (type == 1) {
int color = prefs.getInt(KEY_COLOR, Color.BLACK);
return initFromColor(appContext, color);
}
BackgroundUtils utils = initFromColor(appContext, 0xFF00FF00);
utils.saveToPreferences();
return utils;
}
}
public Drawable getDrawable() {
return drawable;
}
public DrawableType getDrawableType() {
return drawableType;
}
public void saveToPreferences() {
if (context == null) return;
SharedPreferences prefs = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
if (drawableType == DrawableType.RESOURCE_ID) {
editor.putInt(KEY_TYPE, 0);
editor.putInt(KEY_RES_ID, resId);
editor.remove(KEY_COLOR);
} else {
editor.putInt(KEY_TYPE, 1);
editor.putInt(KEY_COLOR, color);
editor.remove(KEY_RES_ID);
}
editor.apply();
}
public static void clearPreferences(Context context) {
SharedPreferences prefs = context.getApplicationContext().getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
prefs.edit().clear().apply();
}
}

View File

@@ -33,30 +33,6 @@
android:gravity="center"
android:layout_marginEnd="8dp"/>
<FrameLayout
android:id="@+id/color_icon_container"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginStart="8dp"
android:background="@android:color/transparent">
<View
android:id="@+id/color_view"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_gravity="center"
android:background="@drawable/bg_color_circle"/>
</FrameLayout>
<ImageView
android:id="@+id/btn_color_pick"
android:layout_width="40dp"
android:layout_height="40dp"
android:padding="5dp"
android:src="@drawable/ic_color_pick"
android:background="?attr/selectableItemBackgroundBorderless"/>
<View
android:layout_width="0dp"
android:layout_height="0dp"

View File

@@ -60,14 +60,6 @@
android:src="@drawable/ic_info"
android:contentDescription="Info"/>
<ImageButton
android:id="@+id/btn_bg"
android:layout_width="48dp"
android:layout_height="48dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:src="@drawable/ic_bg"
android:contentDescription="Background"/>
<ImageButton
android:id="@+id/btn_delete"
android:layout_width="48dp"

View File

@@ -1,45 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="选择背景"
android:textSize="20sp"
android:textStyle="bold"
android:gravity="center"
android:paddingBottom="16dp" />
<RadioGroup
android:id="@+id/radio_group_bg"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RadioButton
android:id="@+id/radio_checkerboard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="灰白相间"
android:padding="12dp" />
<RadioButton
android:id="@+id/radio_white"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="全白"
android:padding="12dp" />
<RadioButton
android:id="@+id/radio_black"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="全黑"
android:padding="12dp" />
</RadioGroup>
</LinearLayout>

View File

@@ -8,6 +8,11 @@
android:icon="@drawable/ic_mi_gallery"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/action_change_bg_color"
android:title="修改背景颜色"
app:showAsAction="never"/>
<item
android:id="@+id/action_trash"
android:title="@string/trash"