Compare commits
14 Commits
gallery-v1
...
gallery-v1
| Author | SHA1 | Date | |
|---|---|---|---|
| bef3f3ce81 | |||
| c0da46e0fd | |||
| 72ca11a1af | |||
| 5decb2f8d9 | |||
| 29e7cfe985 | |||
| 6d521fefdb | |||
| f7932c134f | |||
| 93c59b0424 | |||
| fe248349df | |||
| 4790238343 | |||
| f144d91bb6 | |||
| 9c0e56462e | |||
| 4d977646e6 | |||
| 2d912abf92 |
@@ -1,8 +1,8 @@
|
||||
#Created by .winboll/winboll_app_build.gradle
|
||||
#Thu Apr 30 23:01:42 HKT 2026
|
||||
stageCount=11
|
||||
#Fri May 01 21:09:33 HKT 2026
|
||||
stageCount=16
|
||||
libraryProject=
|
||||
baseVersion=15.0
|
||||
publishVersion=15.0.10
|
||||
publishVersion=15.0.15
|
||||
buildCount=0
|
||||
baseBetaVersion=15.0.11
|
||||
baseBetaVersion=15.0.16
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,7 @@ import android.widget.ImageView;
|
||||
import android.widget.ScrollView;
|
||||
import android.widget.SeekBar;
|
||||
import android.widget.TextView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.Toast;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
@@ -26,6 +27,7 @@ import cc.winboll.studio.libappbase.LogUtils;
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.Random;
|
||||
|
||||
public class CropActivity extends AppCompatActivity {
|
||||
public static final String TAG = "CropActivity";
|
||||
@@ -43,6 +45,7 @@ public class CropActivity extends AppCompatActivity {
|
||||
private int cropWidth = 240;
|
||||
private int cropHeight = 120;
|
||||
private float cropRatio = 2.0f;
|
||||
private Preferences prefs;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
@@ -54,7 +57,8 @@ public class CropActivity extends AppCompatActivity {
|
||||
cropWidth = getIntent().getIntExtra(EXTRA_CROP_WIDTH, 240);
|
||||
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) {
|
||||
cropRatio = (float) cropWidth / cropHeight;
|
||||
} else {
|
||||
@@ -70,13 +74,12 @@ public class CropActivity extends AppCompatActivity {
|
||||
}
|
||||
});
|
||||
|
||||
final ImageView btnColorPick = findViewById(R.id.btn_color_pick);
|
||||
btnColorPick.setOnClickListener(new View.OnClickListener() {
|
||||
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) {
|
||||
boolean pickMode = !cropCanvasView.isColorPickMode();
|
||||
cropCanvasView.setColorPickMode(pickMode);
|
||||
btnColorPick.setAlpha(pickMode ? 0.5f : 1.0f);
|
||||
showBgDialog();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -117,39 +120,51 @@ public class CropActivity extends AppCompatActivity {
|
||||
|
||||
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
|
||||
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();
|
||||
}
|
||||
|
||||
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()) {
|
||||
@@ -261,7 +276,9 @@ public class CropActivity extends AppCompatActivity {
|
||||
info.append("画布宽度: ").append(cropCanvasView.getCanvasWidth()).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();
|
||||
info.append("背景颜色: #").append(String.format("%06X", bgColor & 0xFFFFFF)).append("\n");
|
||||
info.append("拾取坐标: ").append(cropCanvasView.getLastPickImageX()).append(",")
|
||||
@@ -295,10 +312,18 @@ public class CropActivity extends AppCompatActivity {
|
||||
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);
|
||||
LinearLayout previewImageContainer = dialogView.findViewById(R.id.preview_image_container);
|
||||
infoText.setText(info.toString());
|
||||
if (previewBitmap != null) {
|
||||
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)
|
||||
.setTitle("裁剪信息")
|
||||
|
||||
@@ -2,11 +2,14 @@ package cc.winboll.studio.gallery;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.BitmapShader;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Matrix;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.RectF;
|
||||
import android.graphics.Shader;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
@@ -71,6 +74,10 @@ public class CropCanvasView extends View {
|
||||
private Bitmap displayBitmap;
|
||||
private RectF initialSpanRect;
|
||||
private float initialSpan;
|
||||
private int bgType = 2;
|
||||
private Bitmap tileBitmap;
|
||||
private BitmapShader tileShader;
|
||||
private Paint bgPaint;
|
||||
private int backgroundColor = Color.BLUE;
|
||||
private boolean colorPickMode = false;
|
||||
private int previewColor = 0;
|
||||
@@ -111,6 +118,60 @@ public class CropCanvasView extends View {
|
||||
cornerPaint = new Paint();
|
||||
cornerPaint.setColor(Color.WHITE);
|
||||
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) {
|
||||
@@ -175,7 +236,7 @@ public class CropCanvasView extends View {
|
||||
}
|
||||
Bitmap canvasBmp = Bitmap.createBitmap(canvasWidth, canvasHeight, Bitmap.Config.ARGB_8888);
|
||||
Canvas canvas = new Canvas(canvasBmp);
|
||||
canvas.drawColor(backgroundColor);
|
||||
drawBackground(canvas);
|
||||
if (displayBitmap != null && !displayBitmap.isRecycled()) {
|
||||
if (displayBitmap == originalBitmap) {
|
||||
canvas.drawBitmap(displayBitmap, imageBounds.left, imageBounds.top, imagePaint);
|
||||
@@ -409,7 +470,7 @@ public class CropCanvasView extends View {
|
||||
getDisplayMatrix(matrix);
|
||||
canvas.concat(matrix);
|
||||
|
||||
canvas.drawColor(backgroundColor);
|
||||
drawBackground(canvas);
|
||||
|
||||
if (displayBitmap == originalBitmap) {
|
||||
canvas.drawBitmap(displayBitmap, imageBounds.left, imageBounds.top, imagePaint);
|
||||
@@ -523,7 +584,7 @@ public class CropCanvasView extends View {
|
||||
if (imageBounds.contains(imgX, imgY)) {
|
||||
previewColor = getImageColorAt(x, y);
|
||||
} else if (canvasBounds.contains(x, y)) {
|
||||
previewColor = backgroundColor;
|
||||
previewColor = (bgType == 1) ? Color.WHITE : Color.BLACK;
|
||||
} else {
|
||||
previewColor = Color.TRANSPARENT;
|
||||
}
|
||||
@@ -545,7 +606,7 @@ public class CropCanvasView extends View {
|
||||
pickedColor = colorAtPoint;
|
||||
backgroundColor = colorAtPoint;
|
||||
} else {
|
||||
pickedColor = backgroundColor;
|
||||
pickedColor = (bgType == 1) ? Color.WHITE : Color.BLACK;
|
||||
}
|
||||
if (colorPickedListener != null) {
|
||||
colorPickedListener.onColorPicked(pickedColor);
|
||||
|
||||
@@ -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() {
|
||||
@@ -151,28 +169,24 @@ public class ImageViewerActivity extends Activity implements ViewPager.OnPageCha
|
||||
}
|
||||
|
||||
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();
|
||||
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]);
|
||||
}
|
||||
})
|
||||
.setNegativeButton("取消", null)
|
||||
.show();
|
||||
viewPager.setAdapter(new ImagePagerAdapter(imageUrls, bgType));
|
||||
viewPager.setCurrentItem(currentItem);
|
||||
}
|
||||
});
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
private void showDeleteDialog() {
|
||||
|
||||
@@ -289,31 +289,12 @@ private void loadAlbums() {
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
||||
int id = item.getItemId();
|
||||
if (id == R.id.action_gallery) {
|
||||
Intent intent = new Intent(Intent.ACTION_VIEW, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
|
||||
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_reset_gallery) {
|
||||
// 清除 图库/ACTION_VIEW 图片 Uri 的默认打开记录
|
||||
PackageManager pm = getPackageManager();
|
||||
|
||||
// 构建和你跳转一模一样的 Intent
|
||||
Intent clearIntent = new Intent(Intent.ACTION_VIEW, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
|
||||
|
||||
try {
|
||||
// 仅在 API <= 30 时执行重置操作
|
||||
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) {
|
||||
String mimeType = clearIntent.resolveType(getContentResolver());
|
||||
pm.clearPackagePreferredActivities(mimeType);
|
||||
Toast.makeText(this, "已清除默认打开方式", Toast.LENGTH_SHORT).show();
|
||||
} else {
|
||||
// API > 30 时,弹出提示说明适配限制
|
||||
Toast.makeText(this, "应用开发资源有限,本应用适配目标安卓版本为 (" + Build.VERSION_CODES.R + ")。", Toast.LENGTH_LONG).show();
|
||||
}
|
||||
} catch (SecurityException e) {
|
||||
Toast.makeText(this, "需要授予重置默认应用权限,请在系统设置中开启", Toast.LENGTH_LONG).show();
|
||||
}
|
||||
return true;
|
||||
} else if (id == R.id.action_settings) {
|
||||
startActivity(new Intent(this, SettingsActivity.class));
|
||||
return true;
|
||||
|
||||
@@ -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>
|
||||
@@ -1,21 +0,0 @@
|
||||
<?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="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:pathData="M9,12l2,2l4,-4l1.5,1.5L11,17l-3,-3z"/>
|
||||
|
||||
<!-- 上层 纯白色逆时针箭头 -->
|
||||
<path
|
||||
android:fillColor="#FFFFFFFF"
|
||||
android:pathData="M12.63,2C18.16,2 22.64,6.5 22.64,12C22.64,17.5 18.16,22 12.63,22C9.12,22 6.05,20.18 4.26,17.43L5.84,16.18C7.25,18.47 9.76,20 12.64,20A8,8 0,0 0,20.64 12A8,8 0,0 0,12.64 4C8.56,4 5.2,7.06 4.71,11H7.47L3.73,14.73L0,11H2.69C3.19,5.95 7.45,2 12.63,2"/>
|
||||
|
||||
</vector>
|
||||
16
gallery/src/main/res/drawable/ic_mi_gallery.xml
Normal file
16
gallery/src/main/res/drawable/ic_mi_gallery.xml
Normal 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>
|
||||
11
gallery/src/main/res/drawable/ic_view_gallery_outline.xml
Normal file
11
gallery/src/main/res/drawable/ic_view_gallery_outline.xml
Normal 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>
|
||||
@@ -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_view_gallery_outline"
|
||||
android:contentDescription="Gallery"/>
|
||||
|
||||
<ImageButton
|
||||
android:id="@+id/btn_share"
|
||||
android:layout_width="48dp"
|
||||
|
||||
45
gallery/src/main/res/layout/dialog_bg_selector.xml
Normal file
45
gallery/src/main/res/layout/dialog_bg_selector.xml
Normal file
@@ -0,0 +1,45 @@
|
||||
<?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>
|
||||
@@ -1,26 +1,36 @@
|
||||
<?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">
|
||||
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"
|
||||
android:gravity="center_horizontal">
|
||||
|
||||
<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"/>
|
||||
<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
|
||||
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
|
||||
android:id="@+id/preview_image"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:scaleType="fitCenter"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</LinearLayout>
|
||||
@@ -3,17 +3,11 @@
|
||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
|
||||
<item
|
||||
android:id="@+id/action_gallery"
|
||||
android:title="@string/system_gallery"
|
||||
android:icon="@drawable/ic_cover"
|
||||
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_reset_gallery"
|
||||
android:title="@string/reset_gallery"
|
||||
android:icon="@drawable/ic_cover_reset"
|
||||
app:showAsAction="ifRoom"/>
|
||||
|
||||
<item
|
||||
android:id="@+id/action_trash"
|
||||
android:title="@string/trash"
|
||||
|
||||
@@ -19,5 +19,6 @@
|
||||
<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>
|
||||
|
||||
Reference in New Issue
Block a user