Compare commits

...

29 Commits

Author SHA1 Message Date
74ab06448f feat: 添加剪裁背景相关组件及版本更新
- 新增BackgroundRadioButton自定义单选按钮组件
- 新增CustomApplicationBackground应用背景管理类
- 更新build.properties版本构建号(0->19)
- 完善封面剪裁背景修改功能相关基础设施
2026-05-02 10:49:36 +08:00
6cf5ac2034 feat: 添加CropBackgroundUtils工具类及封面剪裁背景修改功能
- 创建CropBackgroundUtils工具类,实现与BackgroundUtils类似的背景管理功能
- 在封面剪裁窗口(CropActivity)添加"修改剪裁背景颜色"按钮
- 按钮点击后弹出Toast提示信息
- 使用独立的偏好设置存储(crop_background_prefs)
2026-05-02 10:48:28 +08:00
a2884122aa 实现主窗口背景颜色修改功能。 2026-05-02 10:40:22 +08:00
03ae37dc91 fix: BackgroundUtils初始化时自动保存配置至SP
- initFromResource 和 initFromColor 增加自动调用 saveToPreferences()
- 优化 initFromPreferences 默认逻辑,避免重复调用保存方法
2026-05-02 10:32:58 +08:00
aea9f1d745 feat: 增强BackgroundUtils属性获取功能
- 新增 getAttributeValueType() 函数,返回当前属性值类型
- 新增 getResId() 和 getColor() 公共函数,用于获取具体的属性值
2026-05-02 10:15:03 +08:00
0786d69ad6 refactor: 调整主窗口背景设置逻辑与布局透明度
- MainActivity: 将背景设置逻辑从 onCreate 移至 onPostCreate
- activity_main.xml: RecyclerView 背景颜色修改为透明
2026-05-02 10:05:26 +08:00
1585ff7eed feat: 重构背景管理系统,移除选择背景对话框并添加BackgroundUtils工具类
- 移除 BgSelectorDialog 对话框及 dialog_bg_selector 布局文件
- 移除 ImageViewerActivity 中的背景选择按钮及相关方法(switchBg/applyBg)
- 移除 CropActivity 中的背景颜色预览视图及 showBgDialog 方法
- 移除 ImagePagerAdapter 中的 bgType 参数,背景固定为黑色
- 新增 BackgroundUtils 单例工具类,支持:
  - 通过资源ID或颜色值创建背景Drawable
  - DrawableType枚举记录创建方式
  - SharedPreferences持久化存储背景配置
  - 首次启动默认使用绿色背景并保存
- 在 GlobalWinBoLLApplication 中初始化BackgroundUtils
- 在 MainActivity 中应用BackgroundUtils设置的背景
- 主窗口菜单添加修改背景颜色选项
2026-05-02 09:54:48 +08:00
91b2b1b480 处理AIDE Pro编译提示问题 2026-05-02 02:53:05 +08:00
bef3f3ce81 <gallery>APK 15.0.15 release Publish. 2026-05-01 21:09:33 +08:00
c0da46e0fd 为preview_image添加单击事件,随机改变容器背景色
- 为preview_image的父级LinearLayout添加id标识(preview_image_container)
- 实现单击preview_image时随机生成颜色并改变容器背景
- 添加必要的import语句(LinearLayout, Random)
2026-05-01 21:05:23 +08:00
72ca11a1af 剪裁信息对话框,预览图片时添加一个边框。 2026-05-01 20:52:33 +08:00
5decb2f8d9 <gallery>APK 15.0.14 release Publish. 2026-05-01 10:29:10 +08:00
29e7cfe985 refactor: 抽象背景选择对话框为独立的BgSelectorDialog类
- 新增BgSelectorDialog对话框类,继承Dialog
- 新增dialog_bg_selector.xml布局文件定义对话框视图
- 重构ImageViewerActivity.switchBg()使用新的BgSelectorDialog
- 重构CropActivity.showBgDialog()使用新的BgSelectorDialog
- 统一两个Activity的背景选择交互方式
2026-05-01 10:25:45 +08:00
6d521fefdb <gallery>APK 15.0.13 release Publish. 2026-05-01 09:21:07 +08:00
f7932c134f 编译调试 2026-05-01 09:18:40 +08:00
93c59b0424 feat: 封面剪裁窗口使用与图片浏览窗口一致的背景颜色设置
- CropCanvasView: 将画布背景从固定的 Color.BLUE 改为支持 3 种背景类型
  (灰白棋盘格 / 全白 / 全黑),与 ImageViewerActivity 保持一致
  - 新增 bgType 字段、setBackgroundType() / getBackgroundType() 方法
  - 新增 drawBackground() 统一绘制方法,用于 onDraw() 和 getCanvasBitmap()
  - 棋盘格使用 Drawable.draw() 渲染 Vector 到 Bitmap,再通过 BitmapShader 平铺

- CropActivity: 从 Preferences 读取保存的 bgType 并应用到画布
  - 将颜色拾取按钮替换为背景选择按钮 (ic_bg),弹出单选对话框切换背景
  - 切换时调用 prefs.setBgType() 保存,与图片浏览窗口共享同一数据源
  - 工具栏颜色指示器随背景类型更新
  - 剪裁信息对话框改为显示背景类型名称
2026-05-01 09:15:30 +08:00
fe248349df <gallery>APK 15.0.12 release Publish. 2026-05-01 08:34:01 +08:00
4790238343 更新图片浏览窗口工具栏Gallery按钮图标
- 将ImageViewerActivity工具栏中的btn_gallery图标从ic_cover替换为ic_view_gallery_outline
- 修改ic_view_gallery_outline的fillColor从黑色(#ff000000)改为白色(#FFFFFF),与工具栏其他图标颜色保持一致
2026-05-01 08:31:11 +08:00
f144d91bb6 添加ic_view_gallery_outline图标 2026-05-01 08:22:37 +08:00
9c0e56462e <gallery>APK 15.0.11 release Publish. 2026-05-01 04:09:20 +08:00
4d977646e6 Merge remote-tracking branch 'origin/gallery' into gallery 2026-05-01 03:59:54 +08:00
2d912abf92 feat: 重构主窗口菜单,将系统相册入口移至图片浏览窗口
- MainActivity: 移除 action_gallery 按钮,替换为 action_mi_gallery (小米相册)
- MainActivity: 移除 action_reset_gallery 按钮及响应代码
- ImageViewerActivity: 新增 btn_gallery 按钮,点击当前浏览图片打开相册选择器
- menu_main: 删除 action_gallery 和 action_reset_gallery 菜单项
- drawable: ic_cover 颜色改为白色以适配暗色工具栏
- drawable: 新增 ic_mi_gallery (小米相册图标),删除 ic_cover_reset
- strings: 新增 mi_gallery 字符串资源
2026-05-01 03:56:03 +08:00
f764de4077 <gallery>APK 15.0.10 release Publish. 2026-04-30 23:01:42 +08:00
0788a52652 feat: 添加系统相册入口及重置默认打开方式功能
【功能更新】
1. 系统相册按钮:
   - 工具栏新增“系统相册”菜单项 (ic_cover)。
   - 点击后通过 Intent 调用系统默认相册。

2. 重置按钮:
   - 工具栏新增“重置”菜单项 (ic_cover_reset)。
   - 清除图库 ACTION_VIEW 的默认打开记录,恢复应用选择框。
   - 兼容处理:API <= 30 自动清除,API > 30 提示适配限制说明。

【代码变更】
- MainActivity.java: 新增 action_gallery 与 action_reset_gallery 响应逻辑,包含异常捕获。
- menu_main.xml: 注册两个新菜单项。
- strings.xml: 新增 "system_gallery", "reset_gallery" 字符串资源。

【其他新增】
- 新增 ColorPaletteDialog 类及 dialog_color_palette.xml 布局。
- 新增 styles.xml 样式 ColorPaletteDialog。
- 新增重置图标资源 ic_cover_reset.xml。
- 更新 build.properties 版本配置。
2026-04-30 22:54:44 +08:00
ffea383a4e feat: 添加封面裁剪窗口标题
- 在关闭按钮后添加标题 TextView
- 标题文本:封面裁剪
- 样式配置:
  * 文字颜色:白色
  * 文字大小:18sp
  * 居中对齐
  * 布局权重:1(占据剩余空间)
  * 结束边距:8dp
- 提升窗口语义化,符合 Android 设计规范
2026-04-29 11:54:29 +08:00
9c1e08a88b style: 统一封面剪裁窗口工具栏按钮尺寸与间距
- 关闭按钮 (btn_close): 由 48dp x 48dp+12dp padding 改为 40dp x 40dp+5dp padding
- 颜色拾取按钮 (btn_color_pick): 由 48dp x 48dp+12dp padding 改为 40dp x 40dp+5dp padding
- 信息按钮 (btn_info): 由 48dp x 48dp+12dp padding 改为 40dp x 40dp+5dp padding
- 完成按钮 (btn_done): 由 48dp x 48dp+12dp padding 改为 40dp x 40dp+5dp padding

统一使用 40dp 标准尺寸,减小 padding 至 5dp 增强点击区域。
2026-04-29 11:11:26 +08:00
abb28b766a 修复AIDE Pro 编辑器的编译提示问题。处理函数固定赋值传递问题。 2026-04-29 01:31:17 +08:00
b6cd91c298 安卓手机端使用AIDE Pro应用的Gradle方式编译成功。 2026-04-29 00:11:09 +08:00
61c2bab83e OpenCode 使用 WINBOT 模型编译调试成功 2026-04-29 00:06:26 +08:00
25 changed files with 731 additions and 268 deletions

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Tue Apr 28 19:41:44 CST 2026 #Sat May 02 10:32:03 CST 2026
stageCount=10 stageCount=16
libraryProject= libraryProject=
baseVersion=15.0 baseVersion=15.0
publishVersion=15.0.9 publishVersion=15.0.15
buildCount=11 buildCount=19
baseBetaVersion=15.0.10 baseBetaVersion=15.0.16

View File

@@ -130,7 +130,7 @@ public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.ViewHolder>
private void showContextMenu(View view, final Album album) { private void showContextMenu(View view, final Album album) {
android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(view.getContext()); android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(view.getContext());
builder.setTitle(album.getName()); builder.setTitle(album.getName());
boolean isPinned = pinnedDbHelper != null && pinnedDbHelper.isPinned(album.getPath()); final boolean isPinned = pinnedDbHelper != null && pinnedDbHelper.isPinned(album.getPath());
String[] items = isPinned ? new String[]{"取消置顶"} : new String[]{"置顶"}; String[] items = isPinned ? new String[]{"取消置顶"} : new String[]{"置顶"};
builder.setItems(items, new android.content.DialogInterface.OnClickListener() { builder.setItems(items, new android.content.DialogInterface.OnClickListener() {
@Override @Override

View File

@@ -3,7 +3,6 @@ package cc.winboll.studio.gallery;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.graphics.RectF; import android.graphics.RectF;
import android.graphics.drawable.GradientDrawable;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.content.DialogInterface; import android.content.DialogInterface;
@@ -19,6 +18,7 @@ import android.widget.ImageView;
import android.widget.ScrollView; import android.widget.ScrollView;
import android.widget.SeekBar; import android.widget.SeekBar;
import android.widget.TextView; import android.widget.TextView;
import android.widget.LinearLayout;
import android.widget.Toast; import android.widget.Toast;
import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
@@ -26,6 +26,7 @@ import cc.winboll.studio.libappbase.LogUtils;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.Random;
public class CropActivity extends AppCompatActivity { public class CropActivity extends AppCompatActivity {
public static final String TAG = "CropActivity"; public static final String TAG = "CropActivity";
@@ -43,6 +44,7 @@ public class CropActivity extends AppCompatActivity {
private int cropWidth = 240; private int cropWidth = 240;
private int cropHeight = 120; private int cropHeight = 120;
private float cropRatio = 2.0f; private float cropRatio = 2.0f;
private Preferences prefs;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@@ -54,7 +56,8 @@ public class CropActivity extends AppCompatActivity {
cropWidth = getIntent().getIntExtra(EXTRA_CROP_WIDTH, 240); cropWidth = getIntent().getIntExtra(EXTRA_CROP_WIDTH, 240);
cropHeight = getIntent().getIntExtra(EXTRA_CROP_HEIGHT, 120); cropHeight = getIntent().getIntExtra(EXTRA_CROP_HEIGHT, 120);
Preferences prefs = new Preferences(this); prefs = new Preferences(this);
int bgType = prefs.getBgType();
if (cropWidth > 0 && cropHeight > 0) { if (cropWidth > 0 && cropHeight > 0) {
cropRatio = (float) cropWidth / cropHeight; cropRatio = (float) cropWidth / cropHeight;
} else { } else {
@@ -70,16 +73,6 @@ public class CropActivity extends AppCompatActivity {
} }
}); });
final ImageView btnColorPick = findViewById(R.id.btn_color_pick);
btnColorPick.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
boolean pickMode = !cropCanvasView.isColorPickMode();
cropCanvasView.setColorPickMode(pickMode);
btnColorPick.setAlpha(pickMode ? 0.5f : 1.0f);
}
});
findViewById(R.id.btn_done).setOnClickListener(new View.OnClickListener() { findViewById(R.id.btn_done).setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
@@ -94,6 +87,13 @@ public class CropActivity extends AppCompatActivity {
} }
}); });
findViewById(R.id.btn_change_bg).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(CropActivity.this, "修改剪裁背景颜色", Toast.LENGTH_SHORT).show();
}
});
zoomContainer = findViewById(R.id.zoom_container); zoomContainer = findViewById(R.id.zoom_container);
SeekBar seekBarZoom = findViewById(R.id.seekbar_zoom); SeekBar seekBarZoom = findViewById(R.id.seekbar_zoom);
@@ -115,38 +115,14 @@ public class CropActivity extends AppCompatActivity {
cropCanvasView = findViewById(R.id.crop_canvas_view); cropCanvasView = findViewById(R.id.crop_canvas_view);
final View colorView = findViewById(R.id.color_view); cropCanvasView.setBackgroundType(bgType);
final GradientDrawable colorDrawable = (GradientDrawable) colorView.getBackground();
cropCanvasView.setOnBackgroundColorChangedListener(new CropCanvasView.OnBackgroundColorChangedListener() { cropCanvasView.setOnBackgroundColorChangedListener(new CropCanvasView.OnBackgroundColorChangedListener() {
@Override @Override
public void onBackgroundColorChanged(int color) { public void onBackgroundColorChanged(int color) {
colorDrawable.setColor(color);
} }
}); });
cropCanvasView.setOnColorPickedListener(new CropCanvasView.OnColorPickedListener() {
@Override
public void onColorPicked(int color) {
int pickX = cropCanvasView.getLastPickImageX();
int pickY = cropCanvasView.getLastPickImageY();
colorDrawable.setColor(color);
Toast.makeText(CropActivity.this,
"颜色已拾取: #" + String.format("%06X", color & 0xFFFFFF) +
" (" + pickX + "," + pickY + ")",
Toast.LENGTH_SHORT).show();
}
});
cropCanvasView.setOnColorPickEndListener(new CropCanvasView.OnColorPickEndListener() {
@Override
public void onColorPickEnd() {
cropCanvasView.setColorPickMode(false);
btnColorPick.setAlpha(1.0f);
}
});
colorDrawable.setColor(cropCanvasView.getBackgroundColor());
loadImage(); loadImage();
} }
@@ -261,7 +237,9 @@ public class CropActivity extends AppCompatActivity {
info.append("画布宽度: ").append(cropCanvasView.getCanvasWidth()).append("px\n"); info.append("画布宽度: ").append(cropCanvasView.getCanvasWidth()).append("px\n");
info.append("画布高度: ").append(cropCanvasView.getCanvasHeight()).append("px\n"); info.append("画布高度: ").append(cropCanvasView.getCanvasHeight()).append("px\n");
info.append("\n=== 拾取颜色 ===\n"); info.append("\n=== 背景类型 ===\n");
String[] bgNames = {"灰白相间", "全白", "全黑"};
info.append("背景: ").append(bgNames[cropCanvasView.getBackgroundType()]).append("\n");
int bgColor = cropCanvasView.getBackgroundColor(); int bgColor = cropCanvasView.getBackgroundColor();
info.append("背景颜色: #").append(String.format("%06X", bgColor & 0xFFFFFF)).append("\n"); info.append("背景颜色: #").append(String.format("%06X", bgColor & 0xFFFFFF)).append("\n");
info.append("拾取坐标: ").append(cropCanvasView.getLastPickImageX()).append(",") info.append("拾取坐标: ").append(cropCanvasView.getLastPickImageX()).append(",")
@@ -295,10 +273,18 @@ public class CropActivity extends AppCompatActivity {
View dialogView = getLayoutInflater().inflate(R.layout.dialog_crop_info, null); View dialogView = getLayoutInflater().inflate(R.layout.dialog_crop_info, null);
TextView infoText = dialogView.findViewById(R.id.info_text); TextView infoText = dialogView.findViewById(R.id.info_text);
ImageView previewImage = dialogView.findViewById(R.id.preview_image); ImageView previewImage = dialogView.findViewById(R.id.preview_image);
final LinearLayout previewImageContainer = dialogView.findViewById(R.id.preview_image_container);
infoText.setText(info.toString()); infoText.setText(info.toString());
if (previewBitmap != null) { if (previewBitmap != null) {
previewImage.setImageBitmap(previewBitmap); previewImage.setImageBitmap(previewBitmap);
} }
previewImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int randomColor = 0xFF000000 | new Random().nextInt(0x00FFFFFF);
previewImageContainer.setBackgroundColor(randomColor);
}
});
AlertDialog dialog = new AlertDialog.Builder(this) AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle("裁剪信息") .setTitle("裁剪信息")

View File

@@ -2,11 +2,14 @@ package cc.winboll.studio.gallery;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas; import android.graphics.Canvas;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.Matrix; import android.graphics.Matrix;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.RectF; import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.View; import android.view.View;
@@ -71,6 +74,10 @@ public class CropCanvasView extends View {
private Bitmap displayBitmap; private Bitmap displayBitmap;
private RectF initialSpanRect; private RectF initialSpanRect;
private float initialSpan; private float initialSpan;
private int bgType = 2;
private Bitmap tileBitmap;
private BitmapShader tileShader;
private Paint bgPaint;
private int backgroundColor = Color.BLUE; private int backgroundColor = Color.BLUE;
private boolean colorPickMode = false; private boolean colorPickMode = false;
private int previewColor = 0; private int previewColor = 0;
@@ -111,6 +118,60 @@ public class CropCanvasView extends View {
cornerPaint = new Paint(); cornerPaint = new Paint();
cornerPaint.setColor(Color.WHITE); cornerPaint.setColor(Color.WHITE);
cornerPaint.setStyle(Paint.Style.FILL); cornerPaint.setStyle(Paint.Style.FILL);
bgType = 2;
bgPaint = new Paint();
initTileBitmap();
}
private void initTileBitmap() {
if (tileBitmap != null && !tileBitmap.isRecycled()) {
tileBitmap.recycle();
tileBitmap = null;
}
tileShader = null;
if (bgType == 0) {
Drawable drawable = getContext().getDrawable(R.drawable.bg_checkerboard);
if (drawable != null) {
int w = drawable.getIntrinsicWidth();
int h = drawable.getIntrinsicHeight();
if (w <= 0) w = 10;
if (h <= 0) h = 10;
tileBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(tileBitmap);
drawable.setBounds(0, 0, w, h);
drawable.draw(c);
tileShader = new BitmapShader(tileBitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
}
}
}
public void setBackgroundType(int type) {
if (bgType != type) {
bgType = type;
initTileBitmap();
invalidate();
}
}
public int getBackgroundType() {
return bgType;
}
private void drawBackground(Canvas canvas) {
if (bgType == 0 && tileShader != null) {
bgPaint.setShader(tileShader);
canvas.drawRect(canvasBounds, bgPaint);
} else if (bgType == 1) {
bgPaint.setShader(null);
bgPaint.setColor(Color.WHITE);
canvas.drawRect(canvasBounds, bgPaint);
} else {
bgPaint.setShader(null);
bgPaint.setColor(Color.BLACK);
canvas.drawRect(canvasBounds, bgPaint);
}
} }
public void setImageBitmap(Bitmap bitmap) { public void setImageBitmap(Bitmap bitmap) {
@@ -175,7 +236,7 @@ public class CropCanvasView extends View {
} }
Bitmap canvasBmp = Bitmap.createBitmap(canvasWidth, canvasHeight, Bitmap.Config.ARGB_8888); Bitmap canvasBmp = Bitmap.createBitmap(canvasWidth, canvasHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(canvasBmp); Canvas canvas = new Canvas(canvasBmp);
canvas.drawColor(backgroundColor); drawBackground(canvas);
if (displayBitmap != null && !displayBitmap.isRecycled()) { if (displayBitmap != null && !displayBitmap.isRecycled()) {
if (displayBitmap == originalBitmap) { if (displayBitmap == originalBitmap) {
canvas.drawBitmap(displayBitmap, imageBounds.left, imageBounds.top, imagePaint); canvas.drawBitmap(displayBitmap, imageBounds.left, imageBounds.top, imagePaint);
@@ -409,7 +470,7 @@ public class CropCanvasView extends View {
getDisplayMatrix(matrix); getDisplayMatrix(matrix);
canvas.concat(matrix); canvas.concat(matrix);
canvas.drawColor(backgroundColor); drawBackground(canvas);
if (displayBitmap == originalBitmap) { if (displayBitmap == originalBitmap) {
canvas.drawBitmap(displayBitmap, imageBounds.left, imageBounds.top, imagePaint); canvas.drawBitmap(displayBitmap, imageBounds.left, imageBounds.top, imagePaint);
@@ -523,7 +584,7 @@ public class CropCanvasView extends View {
if (imageBounds.contains(imgX, imgY)) { if (imageBounds.contains(imgX, imgY)) {
previewColor = getImageColorAt(x, y); previewColor = getImageColorAt(x, y);
} else if (canvasBounds.contains(x, y)) { } else if (canvasBounds.contains(x, y)) {
previewColor = backgroundColor; previewColor = (bgType == 1) ? Color.WHITE : Color.BLACK;
} else { } else {
previewColor = Color.TRANSPARENT; previewColor = Color.TRANSPARENT;
} }
@@ -545,7 +606,7 @@ public class CropCanvasView extends View {
pickedColor = colorAtPoint; pickedColor = colorAtPoint;
backgroundColor = colorAtPoint; backgroundColor = colorAtPoint;
} else { } else {
pickedColor = backgroundColor; pickedColor = (bgType == 1) ? Color.WHITE : Color.BLACK;
} }
if (colorPickedListener != null) { if (colorPickedListener != null) {
colorPickedListener.onColorPicked(pickedColor); colorPickedListener.onColorPicked(pickedColor);

View File

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

View File

@@ -118,7 +118,7 @@ public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ViewHolder>
notifyDataSetChanged(); notifyDataSetChanged();
} }
private void showContextMenu(View view, final int position) { private void showContextMenu(final View view, final int position) {
final String imagePath = imagePaths.get(position); final String imagePath = imagePaths.get(position);
final Uri imageUri = imageUrls.get(position); final Uri imageUri = imageUrls.get(position);
final boolean[] isPinned = {pinnedDbHelper != null && pinnedDbHelper.isPinned(imagePath)}; final boolean[] isPinned = {pinnedDbHelper != null && pinnedDbHelper.isPinned(imagePath)};

View File

@@ -16,25 +16,10 @@ 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, int bgType) { public ImagePagerAdapter(ArrayList<Uri> imageUrls) {
this.imageUrls = imageUrls; this.imageUrls = imageUrls;
this.bgType = bgType; LogUtils.d(TAG, "ImagePagerAdapter created with " + imageUrls.size() + " images");
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
@@ -47,7 +32,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()); view.setBackgroundResource(R.color.black);
ImageView imageView = view.findViewById(R.id.image); ImageView imageView = view.findViewById(R.id.image);
Glide.with(imageView.getContext()) Glide.with(imageView.getContext())

View File

@@ -12,6 +12,7 @@ import android.view.View;
import android.view.View.OnTouchListener; import android.view.View.OnTouchListener;
import android.view.WindowManager; import android.view.WindowManager;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.Toast;
import androidx.viewpager.widget.ViewPager; import androidx.viewpager.widget.ViewPager;
import java.io.File; import java.io.File;
import java.util.ArrayList; import java.util.ArrayList;
@@ -33,8 +34,7 @@ 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 ImageButton btnGallery;
private int bgType = 0;
private GestureDetector gestureDetector; private GestureDetector gestureDetector;
private TrashManager trashManager; private TrashManager trashManager;
private Preferences prefs; private Preferences prefs;
@@ -53,7 +53,6 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
trashManager = new TrashManager(this); trashManager = new TrashManager(this);
prefs = new Preferences(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);
@@ -61,11 +60,10 @@ 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);
applyBg(); btnGallery = findViewById(R.id.btn_gallery);
ImagePagerAdapter adapter = new ImagePagerAdapter(imageUrls, bgType); ImagePagerAdapter adapter = new ImagePagerAdapter(imageUrls);
viewPager.setAdapter(adapter); viewPager.setAdapter(adapter);
viewPager.setCurrentItem(currentPosition); viewPager.setCurrentItem(currentPosition);
viewPager.addOnPageChangeListener(this); viewPager.addOnPageChangeListener(this);
@@ -113,10 +111,17 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
} }
}); });
btnBg.setOnClickListener(new View.OnClickListener() { btnGallery.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
switchBg(); Toast.makeText(ImageViewerActivity.this, "Gallery", Toast.LENGTH_SHORT).show();
if (imageUrls != null && currentPosition >= 0 && currentPosition < imageUrls.size()) {
Uri imageUri = imageUrls.get(currentPosition);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(imageUri, "image/*");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(Intent.createChooser(intent, "打开相册"));
}
} }
}); });
} }
@@ -129,52 +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 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?")
@@ -239,7 +198,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, bgType)); viewPager.setAdapter(new ImagePagerAdapter(imageUrls));
viewPager.setCurrentItem(currentPosition); viewPager.setCurrentItem(currentPosition);
} }
} }

View File

@@ -26,10 +26,12 @@ import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import cc.winboll.studio.gallery.AlbumAdapter.OnAlbumClickListener; import cc.winboll.studio.gallery.AlbumAdapter.OnAlbumClickListener;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.gallery.utils.BackgroundUtils;
import cc.winboll.studio.libappbase.LogActivity; import cc.winboll.studio.libappbase.LogActivity;
import cc.winboll.studio.libappbase.LogUtils;
import com.a4455jkjh.colorpicker.ColorPickerDialog;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import java.io.File; import java.io.File;
import java.io.FileFilter; import java.io.FileFilter;
import java.io.FilenameFilter; import java.io.FilenameFilter;
@@ -50,6 +52,11 @@ public class MainActivity extends AppCompatActivity {
setContentView(R.layout.activity_main); setContentView(R.layout.activity_main);
LogUtils.d(TAG, "onCreate"); 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); Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
@@ -162,7 +169,7 @@ public class MainActivity extends AppCompatActivity {
} }
} }
private void loadAlbums() { private void loadAlbums() {
LogUtils.d(TAG, "loadAlbums"); LogUtils.d(TAG, "loadAlbums");
String folderPath = prefs.getFolderPath(); String folderPath = prefs.getFolderPath();
File baseFolder = new File(folderPath); File baseFolder = new File(folderPath);
@@ -289,7 +296,40 @@ private void loadAlbums() {
@Override @Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) { public boolean onOptionsItemSelected(@NonNull MenuItem item) {
int id = item.getItemId(); int id = item.getItemId();
if (id == R.id.action_settings) { if (id == R.id.action_mi_gallery) {
Toast.makeText(this, "Gallery clicked", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(Intent.ACTION_MAIN);
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();
if (BackgroundUtils.DrawableType.COLOR == BackgroundUtils.getInstance().getDrawableType()) {
ColorPickerDialog dlg = new ColorPickerDialog(this, BackgroundUtils.getInstance().getColor());
dlg.setOnColorChangedListener(new com.a4455jkjh.colorpicker.view.OnColorChangedListener() {
@Override
public void beforeColorChanged() {
}
@Override
public void onColorChanged(int color) {
BackgroundUtils.getInstance().initFromColor(MainActivity.this, color);
View content = findViewById(android.R.id.content);
if (content != null) {
content.setBackground(BackgroundUtils.getInstance().getDrawable());
}
}
@Override
public void afterColorChanged() {
}
});
dlg.show();
}
return true;
} else if (id == R.id.action_settings) {
startActivity(new Intent(this, SettingsActivity.class)); startActivity(new Intent(this, SettingsActivity.class));
return true; return true;
} else if (id == R.id.action_about) { } else if (id == R.id.action_about) {

View File

@@ -0,0 +1,44 @@
package cc.winboll.studio.gallery.dialog;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.WindowManager;
import android.widget.TextView;
import androidx.annotation.NonNull;
import cc.winboll.studio.gallery.R;
/**
* 颜色表对话框
* 继承于普通对话框类,使用视图文件
*/
public class ColorPaletteDialog extends Dialog {
public ColorPaletteDialog(@NonNull Context context) {
super(context, R.style.ColorPaletteDialog);
}
public ColorPaletteDialog(@NonNull Context context, int themeResId) {
super(context, themeResId);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_color_palette);
TextView titleText = findViewById(R.id.title_text);
WindowManager.LayoutParams params = getWindow().getAttributes();
params.width = WindowManager.LayoutParams.MATCH_PARENT;
getWindow().setAttributes(params);
}
public void setTitle(String title) {
}
public interface OnColorItemClick {
void onColorClick(int color);
}
}

View File

@@ -0,0 +1,129 @@
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);
utils.saveToPreferences();
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);
utils.saveToPreferences();
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);
}
// 默认情况initFromColor 内部已经调用了 saveToPreferences()
return initFromColor(appContext, 0xFF00FF00);
}
}
public Drawable getDrawable() {
return drawable;
}
public DrawableType getDrawableType() {
return drawableType;
}
public DrawableType getAttributeValueType() {
return drawableType;
}
public int getResId() {
return resId;
}
public int getColor() {
return color;
}
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

@@ -0,0 +1,124 @@
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 CropBackgroundUtils {
public enum DrawableType {
RESOURCE_ID,
COLOR
}
private static volatile CropBackgroundUtils instance;
private static final String PREF_NAME = "crop_background_prefs";
private static final String KEY_TYPE = "crop_bg_type";
private static final String KEY_RES_ID = "crop_bg_res_id";
private static final String KEY_COLOR = "crop_bg_color";
private Context context;
private Drawable drawable;
private DrawableType drawableType;
private int resId;
private int color;
private CropBackgroundUtils() {
}
public static CropBackgroundUtils getInstance() {
if (instance == null) {
synchronized (CropBackgroundUtils.class) {
if (instance == null) {
instance = new CropBackgroundUtils();
}
}
}
return instance;
}
public static CropBackgroundUtils initFromResource(Context context, @DrawableRes int resId) {
synchronized (CropBackgroundUtils.class) {
CropBackgroundUtils utils = getInstance();
utils.context = context.getApplicationContext();
utils.drawableType = DrawableType.RESOURCE_ID;
utils.resId = resId;
utils.drawable = ContextCompat.getDrawable(utils.context, resId);
utils.saveToPreferences();
return utils;
}
}
public static CropBackgroundUtils initFromColor(Context context, @ColorInt int color) {
synchronized (CropBackgroundUtils.class) {
CropBackgroundUtils utils = getInstance();
utils.context = context.getApplicationContext();
utils.drawableType = DrawableType.COLOR;
utils.color = color;
utils.drawable = new ColorDrawable(color);
utils.saveToPreferences();
return utils;
}
}
public static CropBackgroundUtils initFromPreferences(Context context) {
synchronized (CropBackgroundUtils.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);
}
return initFromColor(appContext, 0xFF00FF00);
}
}
public Drawable getDrawable() {
return drawable;
}
public DrawableType getDrawableType() {
return drawableType;
}
public int getResId() {
return resId;
}
public int getColor() {
return color;
}
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

@@ -0,0 +1,34 @@
package cc.winboll.studio.gallery.views;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.RadioButton;
public class BackgroundRadioButton extends RadioButton {
CustomApplicationBackground mCustomApplicationBackground;
public BackgroundRadioButton(Context context) {
super(context);
}
public BackgroundRadioButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public BackgroundRadioButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setupCustomApplicationBackground(Context context, int resId) {
mCustomApplicationBackground = new CustomApplicationBackground(context, resId);
}
public void setCustomApplicationBackground(CustomApplicationBackground customApplicationBackground) {
mCustomApplicationBackground = customApplicationBackground;
}
public CustomApplicationBackground getCustomApplicationBackground() {
return mCustomApplicationBackground;
}
}

View File

@@ -0,0 +1,29 @@
package cc.winboll.studio.gallery.views;
import android.content.Context;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
public class CustomApplicationBackground {
Drawable mDrawable;
public CustomApplicationBackground(Drawable drawable) {
mDrawable = drawable;
}
public CustomApplicationBackground(int color) {
mDrawable = new ColorDrawable(color);
}
public CustomApplicationBackground(Context context, int resId) {
mDrawable = context.getDrawable(resId);
}
public Drawable getDrawable() {
return mDrawable;
}
public void setDrawable(Drawable drawable) {
mDrawable = drawable;
}
}

View File

@@ -5,9 +5,9 @@
android:viewportWidth="24" android:viewportWidth="24"
android:viewportHeight="24"> android:viewportHeight="24">
<path <path
android:fillColor="#000000" android:fillColor="#FFFFFF"
android:pathData="M21,3H3C1.9,3 1,3.9 1,5v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2V5C23,3.9 22.1,3 21,3zM21,19H3V5h18V19z"/> android:pathData="M21,3H3C1.9,3 1,3.9 1,5v14c0,1.1 0.9,2 2,2h18c1.1,0 2,-0.9 2,-2V5C23,3.9 22.1,3 21,3zM21,19H3V5h18V19z"/>
<path <path
android:fillColor="#000000" android:fillColor="#FFFFFF"
android:pathData="M9,12l2,2l4,-4l1.5,1.5L11,17l-3,-3z"/> android:pathData="M9,12l2,2l4,-4l1.5,1.5L11,17l-3,-3z"/>
</vector> </vector>

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<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="#000000"
android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10s10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8s8,3.59 8,8s-3.59,8 -8,8z"/>
<path
android:fillColor="#000000"
android:pathData="M12,7c-2.76,0 -5,2.24 -5,5s2.24,5 5,5s5,-2.24 5,-5s-2.24,-5 -5,-5zM12,15c-1.66,0 -3,-1.34 -3,-3s1.34,-3 3,-3s3,1.34 3,3s-1.34,3 -3,3z"/>
<path
android:fillColor="#000000"
android:pathData="M8,12l1.5,-2l2,2.5l2.5,-3l2,2.5"/>
</vector>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#FFFFFF"
android:pathData="M1,3V21H23V3H1M21,5V14H3V5H21M11,16V19H8V16H11M3,16H6V19H3V16M13,19V16H16V19H13M18,19V16H21V19H18Z"/>
</vector>

View File

@@ -15,35 +15,23 @@
<ImageView <ImageView
android:id="@+id/btn_close" android:id="@+id/btn_close"
android:layout_width="48dp" android:layout_width="40dp"
android:layout_height="48dp" android:layout_height="40dp"
android:padding="12dp" android:padding="5dp"
android:src="@drawable/ic_close" android:src="@drawable/ic_close"
android:background="?attr/selectableItemBackgroundBorderless"/> android:background="?attr/selectableItemBackgroundBorderless"/>
<FrameLayout <TextView
android:id="@+id/color_icon_container" android:id="@+id/textview_window_name"
android:layout_width="40dp" android:layout_width="wrap_content"
android:layout_height="40dp" android:layout_height="wrap_content"
android:layout_marginStart="8dp" android:text="封面剪裁"
android:background="@android:color/transparent"> android:textColor="@android:color/white"
android:textSize="18sp"
<View android:layout_gravity="center_vertical"
android:id="@+id/color_view" android:layout_weight="1"
android:layout_width="32dp" android:gravity="center"
android:layout_height="32dp" android:layout_marginEnd="8dp"/>
android:layout_gravity="center"
android:background="@drawable/bg_color_circle"/>
</FrameLayout>
<ImageView
android:id="@+id/btn_color_pick"
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="12dp"
android:src="@drawable/ic_color_pick"
android:background="?attr/selectableItemBackgroundBorderless"/>
<View <View
android:layout_width="0dp" android:layout_width="0dp"
@@ -52,17 +40,26 @@
<ImageView <ImageView
android:id="@+id/btn_info" android:id="@+id/btn_info"
android:layout_width="48dp" android:layout_width="40dp"
android:layout_height="48dp" android:layout_height="40dp"
android:padding="12dp" android:padding="5dp"
android:src="@drawable/ic_info" android:src="@drawable/ic_info"
android:background="?attr/selectableItemBackgroundBorderless"/> android:background="?attr/selectableItemBackgroundBorderless"/>
<ImageView
android:id="@+id/btn_change_bg"
android:layout_width="40dp"
android:layout_height="40dp"
android:padding="5dp"
android:src="@drawable/ic_color_pick"
android:background="?attr/selectableItemBackgroundBorderless"
android:contentDescription="修改剪裁背景颜色"/>
<ImageView <ImageView
android:id="@+id/btn_done" android:id="@+id/btn_done"
android:layout_width="48dp" android:layout_width="40dp"
android:layout_height="48dp" android:layout_height="40dp"
android:padding="12dp" android:padding="5dp"
android:src="@drawable/ic_done" android:src="@drawable/ic_done"
android:background="?attr/selectableItemBackgroundBorderless"/> android:background="?attr/selectableItemBackgroundBorderless"/>

View File

@@ -36,6 +36,14 @@
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="1"/> android:layout_weight="1"/>
<ImageButton
android:id="@+id/btn_gallery"
android:layout_width="48dp"
android:layout_height="48dp"
android:background="?attr/selectableItemBackgroundBorderless"
android:src="@drawable/ic_view_gallery_outline"
android:contentDescription="Gallery"/>
<ImageButton <ImageButton
android:id="@+id/btn_share" android:id="@+id/btn_share"
android:layout_width="48dp" android:layout_width="48dp"
@@ -52,14 +60,6 @@
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

@@ -27,7 +27,7 @@
android:id="@+id/recycler_view" android:id="@+id/recycler_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@color/black"/> android:background="@android:color/transparent"/>
</LinearLayout> </LinearLayout>

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/bg_dialog"
android:padding="16dp">
<TextView
android:id="@+id/title_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textColor="@android:color/white"
android:textStyle="bold"/>
</FrameLayout>

View File

@@ -5,7 +5,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical" android:orientation="vertical"
android:padding="16dp" android:padding="16dp"
android:background="@drawable/bg_dialog"> android:background="@drawable/bg_dialog"
android:gravity="center_horizontal">
<TextView <TextView
android:id="@+id/info_text" android:id="@+id/info_text"
@@ -15,12 +16,21 @@
android:fontFamily="monospace" android:fontFamily="monospace"
android:textColor="@android:color/white"/> android:textColor="@android:color/white"/>
<LinearLayout
android:id="@+id/preview_image_container"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="2dp"
android:background="#FFBBD505">
<ImageView <ImageView
android:id="@+id/preview_image" android:id="@+id/preview_image"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="200dp" android:layout_height="wrap_content"
android:layout_marginTop="16dp" android:scaleType="fitCenter"/>
android:scaleType="fitCenter"
android:background="@android:color/black"/> </LinearLayout>
</LinearLayout> </LinearLayout>

View File

@@ -2,6 +2,17 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android" <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_mi_gallery"
android:title="@string/mi_gallery"
android:icon="@drawable/ic_mi_gallery"
app:showAsAction="ifRoom"/>
<item
android:id="@+id/action_change_bg_color"
android:title="修改背景颜色"
app:showAsAction="never"/>
<item <item
android:id="@+id/action_trash" android:id="@+id/action_trash"
android:title="@string/trash" android:title="@string/trash"

View File

@@ -18,4 +18,7 @@
<string name="no">No</string> <string name="no">No</string>
<string name="debug_log">Debug Log</string> <string name="debug_log">Debug Log</string>
<string name="debug_message">Debug log message</string> <string name="debug_message">Debug log message</string>
<string name="system_gallery">系统相册</string>
<string name="mi_gallery">小米相册</string>
<string name="reset_gallery">重置</string>
</resources> </resources>

View File

@@ -8,4 +8,9 @@
<item name="colorAccent">@color/colorAccent</item> <item name="colorAccent">@color/colorAccent</item>
</style> </style>
<style name="ColorPaletteDialog" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowIsFloating">false</item>
</style>
</resources> </resources>