添加图片默认背景切换功能

- 工具栏添加背景切换按钮,点击弹出对话框
- 支持三种背景模式:灰白相间、全白、全黑
- 背景设置持久化保存,应用重启后保持原设置
- 切换背景时保持当前浏览的图片位置
This commit is contained in:
2026-04-25 19:47:32 +08:00
parent e26df437c5
commit ffbecaa31d
9 changed files with 125 additions and 8 deletions

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Sat Apr 25 19:16:31 CST 2026 #Sat Apr 25 19:42:01 CST 2026
stageCount=3 stageCount=3
libraryProject= libraryProject=
baseVersion=15.0 baseVersion=15.0
publishVersion=15.0.2 publishVersion=15.0.2
buildCount=4 buildCount=8
baseBetaVersion=15.0.3 baseBetaVersion=15.0.3

View File

@@ -16,10 +16,25 @@ import cc.winboll.studio.libappbase.LogUtils;
public class ImagePagerAdapter extends PagerAdapter { public class ImagePagerAdapter extends PagerAdapter {
public static final String TAG = "ImagePagerAdapter"; public static final String TAG = "ImagePagerAdapter";
private ArrayList<Uri> imageUrls; private ArrayList<Uri> imageUrls;
private int bgType;
public ImagePagerAdapter(ArrayList<Uri> imageUrls) { public ImagePagerAdapter(ArrayList<Uri> imageUrls, int bgType) {
this.imageUrls = imageUrls; this.imageUrls = imageUrls;
LogUtils.d(TAG, "ImagePagerAdapter created with " + imageUrls.size() + " images"); 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;
}
} }
@Override @Override
@@ -32,6 +47,7 @@ public class ImagePagerAdapter extends PagerAdapter {
public Object instantiateItem(@NonNull ViewGroup container, int position) { public Object instantiateItem(@NonNull ViewGroup container, int position) {
View view = LayoutInflater.from(container.getContext()) View view = LayoutInflater.from(container.getContext())
.inflate(R.layout.item_image_pager, container, false); .inflate(R.layout.item_image_pager, container, false);
view.setBackgroundResource(getBgRes());
ImageView imageView = view.findViewById(R.id.image); ImageView imageView = view.findViewById(R.id.image);
Glide.with(imageView.getContext()) Glide.with(imageView.getContext())

View File

@@ -33,8 +33,11 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
private ImageButton btnDelete; private ImageButton btnDelete;
private ImageButton btnShare; private ImageButton btnShare;
private ImageButton btnInfo; private ImageButton btnInfo;
private ImageButton btnBg;
private int bgType = 0;
private GestureDetector gestureDetector; private GestureDetector gestureDetector;
private TrashManager trashManager; private TrashManager trashManager;
private Preferences prefs;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@@ -49,6 +52,8 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
currentPosition = getIntent().getIntExtra(EXTRA_POSITION, 0); currentPosition = getIntent().getIntExtra(EXTRA_POSITION, 0);
trashManager = new TrashManager(this); trashManager = new TrashManager(this);
prefs = new Preferences(this);
bgType = prefs.getBgType();
viewPager = findViewById(R.id.view_pager); viewPager = findViewById(R.id.view_pager);
toolbar = findViewById(R.id.toolbar); toolbar = findViewById(R.id.toolbar);
@@ -56,8 +61,11 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
btnDelete = findViewById(R.id.btn_delete); btnDelete = findViewById(R.id.btn_delete);
btnShare = findViewById(R.id.btn_share); btnShare = findViewById(R.id.btn_share);
btnInfo = findViewById(R.id.btn_info); btnInfo = findViewById(R.id.btn_info);
btnBg = findViewById(R.id.btn_bg);
ImagePagerAdapter adapter = new ImagePagerAdapter(imageUrls); applyBg();
ImagePagerAdapter adapter = new ImagePagerAdapter(imageUrls, bgType);
viewPager.setAdapter(adapter); viewPager.setAdapter(adapter);
viewPager.setCurrentItem(currentPosition); viewPager.setCurrentItem(currentPosition);
viewPager.addOnPageChangeListener(this); viewPager.addOnPageChangeListener(this);
@@ -104,6 +112,13 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
showImageInfo(); showImageInfo();
} }
}); });
btnBg.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switchBg();
}
});
} }
private void toggleToolbar() { private void toggleToolbar() {
@@ -114,6 +129,52 @@ 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 String[] bgNames = {"灰白相间", "全白", "全黑"};
final int[] bgResources = {R.drawable.bg_checkerboard, R.drawable.bg_white, R.drawable.bg_black};
new AlertDialog.Builder(this)
.setTitle("选择背景")
.setSingleChoiceItems(bgNames, bgType, new android.content.DialogInterface.OnClickListener() {
@Override
public void onClick(android.content.DialogInterface dialog, 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.dismiss();
}
})
.setNegativeButton("取消", null)
.show();
}
private void showDeleteDialog() { private void showDeleteDialog() {
new AlertDialog.Builder(this) new AlertDialog.Builder(this)
.setMessage("Delete to trash?") .setMessage("Delete to trash?")
@@ -178,7 +239,7 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
if (currentPosition >= imageUrls.size()) { if (currentPosition >= imageUrls.size()) {
currentPosition = imageUrls.size() - 1; currentPosition = imageUrls.size() - 1;
} }
viewPager.setAdapter(new ImagePagerAdapter(imageUrls)); viewPager.setAdapter(new ImagePagerAdapter(imageUrls, bgType));
viewPager.setCurrentItem(currentPosition); viewPager.setCurrentItem(currentPosition);
} }
} }

View File

@@ -8,6 +8,8 @@ public class Preferences {
public static final String TAG = "Preferences"; public static final String TAG = "Preferences";
private static final String PREF_NAME = "gallery_prefs"; private static final String PREF_NAME = "gallery_prefs";
private static final String KEY_FOLDER_PATH = "folder_path"; private static final String KEY_FOLDER_PATH = "folder_path";
private static final String KEY_BG_TYPE = "bg_type";
private static final int DEFAULT_BG_TYPE = 0;
private static final String DEFAULT_PATH = "/storage/emulated/0/Pictures/Gallery/owner"; private static final String DEFAULT_PATH = "/storage/emulated/0/Pictures/Gallery/owner";
public static String getDefaultPath() { public static String getDefaultPath() {
@@ -30,4 +32,13 @@ public class Preferences {
LogUtils.d(TAG, "setFolderPath: " + path); LogUtils.d(TAG, "setFolderPath: " + path);
prefs.edit().putString(KEY_FOLDER_PATH, path).apply(); prefs.edit().putString(KEY_FOLDER_PATH, path).apply();
} }
public int getBgType() {
return prefs.getInt(KEY_BG_TYPE, DEFAULT_BG_TYPE);
}
public void setBgType(int type) {
LogUtils.d(TAG, "setBgType: " + type);
prefs.edit().putInt(KEY_BG_TYPE, type).apply();
}
} }

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#000000"/>
</shape>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#FFFFFF"/>
</shape>

View File

@@ -0,0 +1,12 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFF"
android:pathData="M4,4h7v7h-7z M13,4h7v7h-7z M4,13h7v7h-7z M13,13h7v7h-7z"/>
<path
android:fillColor="#808080"
android:pathData="M11,4h2v7h-2z M4,11h7v2h-7z M13,11h7v2h-7z M11,13h2v7h-2z M13,4h2v7h-2z M4,13h7v2h-7z"/>
</vector>

View File

@@ -52,6 +52,14 @@
android:src="@drawable/ic_info" android:src="@drawable/ic_info"
android:contentDescription="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 <ImageButton
android:id="@+id/btn_delete" android:id="@+id/btn_delete"
android:layout_width="48dp" android:layout_width="48dp"

View File

@@ -2,8 +2,7 @@
<FrameLayout <FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
android:background="@drawable/bg_checkerboard">
<ImageView <ImageView
android:id="@+id/image" android:id="@+id/image"