Compare commits

..

18 Commits

Author SHA1 Message Date
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
5a700a0808 <gallery>优化裁剪功能:更新颜色拾取逻辑、同步工具栏图标、调整布局文件 2026-04-28 19:46:23 +08:00
dad179c15f 完善剪裁窗口颜色拾取功能,工具栏图标同步更新 2026-04-28 18:31:16 +08:00
1b62ff288f <gallery>APK 15.0.9 release Publish. 2026-04-28 17:21:55 +08:00
87ad6668a4 更新 gallery 模块 libappbase 依赖到 15.15.21 2026-04-28 17:18:30 +08:00
139083c22f <gallery>APK 15.0.8 release Publish. 2026-04-28 13:58:56 +08:00
c49e68d7f1 添加裁剪信息窗口功能
- 添加信息按钮和对话框,显示画布、颜色、裁剪信息
- 显示裁剪结果预览图和拾取坐标
- 松开手指时重置拾取按钮状态
2026-04-28 13:56:08 +08:00
b035d461aa 优化剪裁窗口颜色拾取功能
- 按下手指时预览颜色,放开时确认拾取
- 拖动时实时跟随手指位置更新颜色
- 分离颜色预览和确认拾取的回调接口
2026-04-28 13:06:45 +08:00
474ddcbb3b 添加剪裁窗口颜色拾取功能
- 在工具栏添加颜色图标显示当前背景颜色
- 添加背景颜色变化监听器
- 修复画布放大时颜色拾取坐标计算
- 拾取颜色后自动退出拾取模式
2026-04-28 12:35:55 +08:00
22 changed files with 463 additions and 26 deletions

View File

@@ -109,7 +109,7 @@ dependencies {
*/
// WinBoLL库 nexus.winboll.cc 地址
api 'cc.winboll.studio:libaes:15.15.9'
api 'cc.winboll.studio:libappbase:15.15.20'
api 'cc.winboll.studio:libappbase:15.15.21'
// WinBoLL备用库 jitpack.io 地址
//api 'com.github.ZhanGSKen:AES:aes-v15.15.7'

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle
#Tue Apr 28 10:57:44 HKT 2026
stageCount=8
#Fri May 01 04:09:20 HKT 2026
stageCount=12
libraryProject=
baseVersion=15.0
publishVersion=15.0.7
publishVersion=15.0.11
buildCount=0
baseBetaVersion=15.0.8
baseBetaVersion=15.0.12

View File

@@ -130,7 +130,7 @@ public class AlbumAdapter extends RecyclerView.Adapter<AlbumAdapter.ViewHolder>
private void showContextMenu(View view, final Album album) {
android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(view.getContext());
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[]{"置顶"};
builder.setItems(items, new android.content.DialogInterface.OnClickListener() {
@Override
@@ -252,4 +252,4 @@ private void showContextMenu(View view, final Album album) {
imageCount = itemView.findViewById(R.id.image_count);
}
}
}
}

View File

@@ -3,15 +3,24 @@ 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;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.RectF;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.widget.ImageView;
import android.widget.ScrollView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import cc.winboll.studio.libappbase.LogUtils;
import java.io.File;
@@ -78,6 +87,13 @@ public class CropActivity extends AppCompatActivity {
}
});
findViewById(R.id.btn_info).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showCropInfoDialog();
}
});
zoomContainer = findViewById(R.id.zoom_container);
SeekBar seekBarZoom = findViewById(R.id.seekbar_zoom);
@@ -98,6 +114,39 @@ 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.setOnBackgroundColorChangedListener(new CropCanvasView.OnBackgroundColorChangedListener() {
@Override
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();
}
@@ -206,6 +255,67 @@ public class CropActivity extends AppCompatActivity {
}
}
private void showCropInfoDialog() {
StringBuilder info = new StringBuilder();
info.append("=== 画布信息 ===\n");
info.append("画布宽度: ").append(cropCanvasView.getCanvasWidth()).append("px\n");
info.append("画布高度: ").append(cropCanvasView.getCanvasHeight()).append("px\n");
info.append("\n=== 拾取颜色 ===\n");
int bgColor = cropCanvasView.getBackgroundColor();
info.append("背景颜色: #").append(String.format("%06X", bgColor & 0xFFFFFF)).append("\n");
info.append("拾取坐标: ").append(cropCanvasView.getLastPickImageX()).append(",")
.append(cropCanvasView.getLastPickImageY()).append("\n");
info.append("\n=== 裁剪结果 ===\n");
RectF cropRect = cropCanvasView.getCropRect();
if (cropRect != null) {
info.append("裁剪区域: ").append((int)cropRect.left).append(",")
.append((int)cropRect.top).append(",")
.append((int)cropRect.right).append(",")
.append((int)cropRect.bottom).append("\n");
info.append("裁剪宽度: ").append((int)cropRect.width()).append("px\n");
info.append("裁剪高度: ").append((int)cropRect.height()).append("px\n");
}
Bitmap canvasBitmap = cropCanvasView.getCanvasBitmap();
final Bitmap[] previewHolder = new Bitmap[1];
if (canvasBitmap != null && !canvasBitmap.isRecycled() && cropRect != null) {
int bmpX = Math.max(0, (int) cropRect.left);
int bmpY = Math.max(0, (int) cropRect.top);
int bmpW = Math.min((int) cropRect.width(), canvasBitmap.getWidth() - bmpX);
int bmpH = Math.min((int) cropRect.height(), canvasBitmap.getHeight() - bmpY);
if (bmpW > 0 && bmpH > 0) {
previewHolder[0] = Bitmap.createBitmap(canvasBitmap, bmpX, bmpY, bmpW, bmpH);
}
}
final Bitmap previewBitmap = previewHolder[0];
View dialogView = getLayoutInflater().inflate(R.layout.dialog_crop_info, null);
TextView infoText = dialogView.findViewById(R.id.info_text);
ImageView previewImage = dialogView.findViewById(R.id.preview_image);
infoText.setText(info.toString());
if (previewBitmap != null) {
previewImage.setImageBitmap(previewBitmap);
}
AlertDialog dialog = new AlertDialog.Builder(this)
.setTitle("裁剪信息")
.setView(dialogView)
.setPositiveButton("确定", null)
.create();
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
if (previewBitmap != null && !previewBitmap.isRecycled()) {
previewBitmap.recycle();
}
}
});
dialog.show();
}
@Override
protected void onDestroy() {
super.onDestroy();

View File

@@ -12,6 +12,33 @@ import android.view.MotionEvent;
import android.view.View;
public class CropCanvasView extends View {
public interface OnBackgroundColorChangedListener {
void onBackgroundColorChanged(int color);
}
public interface OnColorPickedListener {
void onColorPicked(int color);
}
public interface OnColorPickEndListener {
void onColorPickEnd();
}
private OnBackgroundColorChangedListener backgroundColorChangedListener;
private OnColorPickedListener colorPickedListener;
private OnColorPickEndListener colorPickEndListener;
public void setOnBackgroundColorChangedListener(OnBackgroundColorChangedListener listener) {
this.backgroundColorChangedListener = listener;
}
public void setOnColorPickedListener(OnColorPickedListener listener) {
this.colorPickedListener = listener;
}
public void setOnColorPickEndListener(OnColorPickEndListener listener) {
this.colorPickEndListener = listener;
}
private Paint imagePaint;
private Paint borderPaint;
private Paint cornerPaint;
@@ -39,11 +66,16 @@ public class CropCanvasView extends View {
private RectF imageBounds = new RectF();
private RectF canvasBounds = new RectF();
private Bitmap originalBitmap;
private Bitmap canvasBitmap;
private float bitmapScale = 1.0f;
private Bitmap displayBitmap;
private RectF initialSpanRect;
private float initialSpan;
private int backgroundColor = Color.BLUE;
private boolean colorPickMode = false;
private int previewColor = 0;
private float lastPickX = 0;
private float lastPickY = 0;
private float pickX, pickY;
private float displayScale = 1.0f;
@@ -239,6 +271,9 @@ public class CropCanvasView extends View {
public void setBackgroundColor(int color) {
this.backgroundColor = color;
if (backgroundColorChangedListener != null) {
backgroundColorChangedListener.onBackgroundColorChanged(color);
}
invalidate();
}
@@ -246,6 +281,40 @@ public class CropCanvasView extends View {
return backgroundColor;
}
public int getPreviewColor() {
return previewColor;
}
public float getLastPickX() {
return lastPickX;
}
public float getLastPickY() {
return lastPickY;
}
public int getLastPickImageX() {
if (originalBitmap == null || originalBitmap.isRecycled()) {
return 0;
}
float imgX = screenToImageX(lastPickX);
float imgY = screenToImageY(lastPickY);
int bmpX = (int) ((imgX - imageBounds.left) * displayBitmapScale);
int bmpY = (int) ((imgY - imageBounds.top) * displayBitmapScale);
return Math.max(0, Math.min(bmpX, originalBitmap.getWidth() - 1));
}
public int getLastPickImageY() {
if (originalBitmap == null || originalBitmap.isRecycled()) {
return 0;
}
float imgX = screenToImageX(lastPickX);
float imgY = screenToImageY(lastPickY);
int bmpX = (int) ((imgX - imageBounds.left) * displayBitmapScale);
int bmpY = (int) ((imgY - imageBounds.top) * displayBitmapScale);
return Math.max(0, Math.min(bmpY, originalBitmap.getHeight() - 1));
}
public void setColorPickMode(boolean enable) {
this.colorPickMode = enable;
if (enable) {
@@ -447,11 +516,46 @@ public class CropCanvasView extends View {
}
if (colorPickMode) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
pickX = x;
pickY = y;
int color = getColorAt(x, y);
setBackgroundColor(color);
if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) {
if (originalBitmap != null && !originalBitmap.isRecycled()) {
float imgX = screenToImageX(x);
float imgY = screenToImageY(y);
if (imageBounds.contains(imgX, imgY)) {
previewColor = getImageColorAt(x, y);
} else if (canvasBounds.contains(x, y)) {
previewColor = backgroundColor;
} else {
previewColor = Color.TRANSPARENT;
}
lastPickX = x;
lastPickY = y;
if (backgroundColorChangedListener != null) {
backgroundColorChangedListener.onBackgroundColorChanged(previewColor);
}
}
return true;
}
if (event.getAction() == MotionEvent.ACTION_UP) {
if (canvasBounds.contains(x, y)) {
int pickedColor;
float imgX = screenToImageX(x);
float imgY = screenToImageY(y);
if (imageBounds.contains(imgX, imgY)) {
int colorAtPoint = getImageColorAt(x, y);
pickedColor = colorAtPoint;
backgroundColor = colorAtPoint;
} else {
pickedColor = backgroundColor;
}
if (colorPickedListener != null) {
colorPickedListener.onColorPicked(pickedColor);
}
}
if (colorPickEndListener != null) {
colorPickEndListener.onColorPickEnd();
}
previewColor = 0;
invalidate();
return true;
}
return true;

View File

@@ -118,7 +118,7 @@ public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ViewHolder>
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 Uri imageUri = imageUrls.get(position);
final boolean[] isPinned = {pinnedDbHelper != null && pinnedDbHelper.isPinned(imagePath)};
@@ -244,4 +244,4 @@ public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ViewHolder>
coverIcon = itemView.findViewById(R.id.cover_icon);
}
}
}
}

View File

@@ -12,6 +12,7 @@ import android.view.View;
import android.view.View.OnTouchListener;
import android.view.WindowManager;
import android.widget.ImageButton;
import android.widget.Toast;
import androidx.viewpager.widget.ViewPager;
import java.io.File;
import java.util.ArrayList;
@@ -34,6 +35,7 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
private ImageButton btnShare;
private ImageButton btnInfo;
private ImageButton btnBg;
private ImageButton btnGallery;
private int bgType = 0;
private GestureDetector gestureDetector;
private TrashManager trashManager;
@@ -63,6 +65,8 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
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);
@@ -119,6 +123,20 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
switchBg();
}
});
btnGallery.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
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, "打开相册"));
}
}
});
}
private void toggleToolbar() {

View File

@@ -289,7 +289,13 @@ private void loadAlbums() {
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
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_settings) {
startActivity(new Intent(this, SettingsActivity.class));
return true;
} 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,7 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@android:color/transparent"/>
<stroke android:width="2dp" android:color="@android:color/white"/>
<size android:width="32dp" android:height="32dp"/>
</shape>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<stroke android:width="2dp" android:color="@android:color/white"/>
<size android:width="36dp" android:height="36dp"/>
</shape>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@android:color/black"/>
<stroke android:width="2dp" android:color="@android:color/white"/>
</shape>

View File

@@ -5,9 +5,9 @@
android:viewportWidth="24"
android:viewportHeight="24">
<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"/>
<path
android:fillColor="#000000"
android:fillColor="#FFFFFF"
android:pathData="M9,12l2,2l4,-4l1.5,1.5L11,17l-3,-3z"/>
</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

@@ -15,17 +15,45 @@
<ImageView
android:id="@+id/btn_close"
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="12dp"
android:layout_width="40dp"
android:layout_height="40dp"
android:padding="5dp"
android:src="@drawable/ic_close"
android:background="?attr/selectableItemBackgroundBorderless"/>
<TextView
android:id="@+id/textview_window_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="封面剪裁"
android:textColor="@android:color/white"
android:textSize="18sp"
android:layout_gravity="center_vertical"
android:layout_weight="1"
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="48dp"
android:layout_height="48dp"
android:padding="12dp"
android:layout_width="40dp"
android:layout_height="40dp"
android:padding="5dp"
android:src="@drawable/ic_color_pick"
android:background="?attr/selectableItemBackgroundBorderless"/>
@@ -34,11 +62,19 @@
android:layout_height="0dp"
android:layout_weight="1"/>
<ImageView
android:id="@+id/btn_info"
android:layout_width="40dp"
android:layout_height="40dp"
android:padding="5dp"
android:src="@drawable/ic_info"
android:background="?attr/selectableItemBackgroundBorderless"/>
<ImageView
android:id="@+id/btn_done"
android:layout_width="48dp"
android:layout_height="48dp"
android:padding="12dp"
android:layout_width="40dp"
android:layout_height="40dp"
android:padding="5dp"
android:src="@drawable/ic_done"
android:background="?attr/selectableItemBackgroundBorderless"/>

View File

@@ -36,6 +36,14 @@
android:layout_height="0dp"
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_cover"
android:contentDescription="Gallery"/>
<ImageButton
android:id="@+id/btn_share"
android:layout_width="48dp"

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

@@ -0,0 +1,26 @@
<?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"
android:background="@drawable/bg_dialog">
<TextView
android:id="@+id/info_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="14sp"
android:fontFamily="monospace"
android:textColor="@android:color/white"/>
<ImageView
android:id="@+id/preview_image"
android:layout_width="match_parent"
android:layout_height="200dp"
android:layout_marginTop="16dp"
android:scaleType="fitCenter"
android:background="@android:color/black"/>
</LinearLayout>

View File

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="40dp"
android:layout_height="40dp">
<View
android:id="@+id/color_view"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_gravity="center"
android:background="@drawable/bg_color_circle"/>
<View
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_gravity="center"
android:background="@drawable/bg_color_circle_border"/>
</FrameLayout>

View File

@@ -2,6 +2,12 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
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_trash"
android:title="@string/trash"

View File

@@ -18,4 +18,7 @@
<string name="no">No</string>
<string name="debug_log">Debug Log</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>

View File

@@ -8,4 +8,9 @@
<item name="colorAccent">@color/colorAccent</item>
</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>