diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 523f89c..58ca742 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -15,7 +15,7 @@ android {
targetSdk = 34
versionCode = 1
versionName = "1.0.0"
- setProperty("archivesBaseName", "AR Draw Sketch_V" + versionName + "(${versionCode})_$timestamp")
+ setProperty("archivesBaseName", "AR Canvas Art_V" + versionName + "(${versionCode})_$timestamp")
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 8feeec9..53a2649 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -32,6 +32,9 @@
android:exported="false" />
+
diff --git a/app/src/main/java/com/lock/arcanvasart/Utils/Tracing.java b/app/src/main/java/com/lock/arcanvasart/Utils/Tracing.java
new file mode 100644
index 0000000..118953f
--- /dev/null
+++ b/app/src/main/java/com/lock/arcanvasart/Utils/Tracing.java
@@ -0,0 +1,13 @@
+package com.lock.arcanvasart.Utils;
+
+import android.view.MotionEvent;
+
+public class Tracing {
+
+ public static float getDistance(MotionEvent event) {
+ float dx = event.getX(1) - event.getX(0);
+ float dy = event.getY(1) - event.getY(0);
+ return (float) Math.sqrt(dx * dx + dy * dy);
+ }
+
+}
diff --git a/app/src/main/java/com/lock/arcanvasart/activity/Camera111Activity.java b/app/src/main/java/com/lock/arcanvasart/activity/Camera111Activity.java
new file mode 100644
index 0000000..5ba703f
--- /dev/null
+++ b/app/src/main/java/com/lock/arcanvasart/activity/Camera111Activity.java
@@ -0,0 +1,352 @@
+//package com.lock.arcanvasart.activity;
+//
+//import androidx.activity.result.ActivityResultLauncher;
+//import androidx.activity.result.contract.ActivityResultContracts;
+//import androidx.annotation.NonNull;
+//import androidx.appcompat.app.AppCompatActivity;
+//import androidx.camera.core.Camera;
+//import androidx.camera.core.CameraSelector;
+//import androidx.camera.core.ImageCapture;
+//import androidx.camera.core.Preview;
+//import androidx.camera.lifecycle.ProcessCameraProvider;
+//import androidx.camera.view.PreviewView;
+//import androidx.core.app.ActivityCompat;
+//import androidx.core.content.ContextCompat;
+//
+//import android.Manifest;
+//import android.app.Activity;
+//import android.content.Intent;
+//import android.content.pm.PackageManager;
+//import android.graphics.Bitmap;
+//import android.graphics.Matrix;
+//import android.graphics.Point;
+//import android.graphics.PointF;
+//import android.net.Uri;
+//import android.os.Build;
+//import android.os.Bundle;
+//import android.provider.MediaStore;
+//import android.util.Log;
+//import android.view.MotionEvent;
+//import android.view.View;
+//import android.widget.ImageView;
+//import android.widget.SeekBar;
+//import android.widget.Toast;
+//
+//import com.applovin.mediation.MaxAd;
+//import com.applovin.mediation.ads.MaxInterstitialAd;
+//import com.draw.painting.test.Adcallback;
+//import com.google.common.util.concurrent.ListenableFuture;
+//import com.draw.painting.test.PaintingApp;
+//import com.draw.painting.test.R;
+//import com.draw.painting.test.manager.Utils;
+//
+//import java.util.List;
+//
+//public class CameraActivity extends AppCompatActivity implements View.OnTouchListener, View.OnClickListener {
+// private CameraSelector cameraSelector;
+// private String[] permissions;
+// private int range;
+// private Camera camera;
+// private ImageCapture imageCapture;
+// private PreviewView previewView;
+// private ImageView imageView;
+// private SeekBar seekBar;
+//
+// private Double d;
+//
+//
+// private int MODE;//当前状态
+// public static final int MODE_NONE = 0;//无操作
+// public static final int MODE_DRAG = 1;//单指操作
+// public static final int MODE_SCALE = 2;//双指操作
+//
+// private Matrix startMatrix;
+// private Matrix endMatrix = new Matrix();//变化后的矩阵
+// private PointF startPointF = new PointF();//初始坐标
+// private float distance;//初始距离
+// private float scaleMultiple;//缩放倍数
+//
+// private ImageView flashIm, imZoom, imBack;
+// private ImageView imPhoto;
+//
+// private String curBitmapPath;
+// private boolean hasPermission = false;
+// private boolean isMain;
+// private String ismain;
+// private static List adsList;
+// private ActivityResultLauncher intentActivityResultLauncher;
+//
+// @Override
+// protected void onCreate(Bundle savedInstanceState) {
+// super.onCreate(savedInstanceState);
+// setContentView(R.layout.activity_camera);
+// Utils.setStatusBarTextColor(this, true);
+//
+// adsList = Utils.getAllAd();
+// Intent intent = getIntent();
+// isMain = intent.getBooleanExtra(PaintingApp.Key_ISMAIN, false);
+//
+//
+// showAd();
+//
+//
+// previewView = findViewById(R.id.preview);
+// imageView = findViewById(R.id.image);
+// imBack = findViewById(R.id.back);
+//
+// seekBar = findViewById(R.id.seekbar);
+// flashIm = findViewById(R.id.im_flash);
+// imPhoto = findViewById(R.id.im_photo);
+// imZoom = findViewById(R.id.im_zoom);
+//
+// curBitmapPath = getIntent().getStringExtra(PaintingApp.Key_Camera);
+//
+// intentActivityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
+// if (result.getResultCode() == Activity.RESULT_OK && result.getData() != null) {
+// Uri imageUri = result.getData().getData();
+//// Log.d("--------------tt","------bitmap-----width="+width+"-----height="+height);
+// imageView.setImageURI(imageUri);
+// }
+//
+// });
+//
+// init();
+// initClick();
+// }
+//
+// private void showAd() {
+// MaxInterstitialAd cachedAd = Utils.onCache(adsList);
+// if (cachedAd == null) {
+//
+// } else {
+// Utils.setCallBcak(cachedAd, new Adcallback() {
+// @Override
+// public void onShowFail(MaxAd ad) {
+//
+// }
+//
+// @Override
+// public void onAdHidden() {
+//
+// }
+// });
+// cachedAd.showAd(this);
+// }
+// }
+//
+// private void onInitIm(float imW, float imH) {
+// Point screen = Utils.getScreen(this);
+// float newX = screen.x / 2f - imW / 2;
+// float newY = screen.y / 2f - imH / 2;
+// startMatrix = new Matrix();
+// startMatrix.postTranslate(newX, newY);
+// imageView.setImageMatrix(startMatrix);
+//
+// Log.d("---------------tt", "------startMatrix-----x=" + newX + "------y=" + newY);
+// }
+//
+// @Override
+// public boolean onTouch(View v, MotionEvent event) {
+// switch (event.getAction() & event.getActionMasked()) {
+// case MotionEvent.ACTION_DOWN:
+//
+// startMatrix.set(imageView.getImageMatrix());
+// endMatrix.set(imageView.getImageMatrix());
+//
+// startPointF.set(event.getX(), event.getY());
+//
+//
+// Log.d("---------------tt", "------ACTION_DOWN-----x=" + event.getX() + "------y=" + event.getY());
+//
+// MODE = MODE_DRAG;
+//
+// break;
+// case MotionEvent.ACTION_POINTER_DOWN:
+//
+// startMatrix.set(endMatrix);
+//
+// distance = Utils.getDistance(event);
+//
+// MODE = MODE_SCALE;
+//
+// break;
+// case MotionEvent.ACTION_MOVE://滑动(单+双)
+// if (MODE == MODE_DRAG) {//单指滑动时
+//
+// endMatrix.set(startMatrix);
+// //向矩阵传入位移距离
+// endMatrix.postTranslate(event.getX() - startPointF.x, event.getY() - startPointF.y);
+// Log.d("---------------tt", "------ACTION_MOVE-----x=" + event.getX() + "------y=" + event.getY());
+// } else if (MODE == MODE_SCALE) {//双指滑动时
+// //计算缩放倍数
+// scaleMultiple = Utils.getDistance(event) / distance;
+// //获取初始矩阵
+// endMatrix.set(startMatrix);
+// //向矩阵传入缩放倍数
+// endMatrix.postScale(scaleMultiple, scaleMultiple, startPointF.x, startPointF.y);
+// }
+// break;
+// case MotionEvent.ACTION_UP://单指离开
+// case MotionEvent.ACTION_POINTER_UP://双指离开
+// //手指离开后,重置状态
+// MODE = MODE_NONE;
+//
+// break;
+// }
+// //事件结束后,把矩阵的变化同步到ImageView上
+// imageView.setImageMatrix(endMatrix);
+// return true;
+// }
+//
+// @Override
+// public void onClick(View v) {
+// if (v.equals(imBack)) {
+//
+// if (isMain) {
+// showAd();
+// finish();
+// } else {
+// finish();
+// }
+//
+// } else {
+// if (!hasPermission) {
+// showNoPermission();
+// return;
+// }
+// if (v.equals(flashIm)) {
+// boolean selected = flashIm.isSelected();
+// flashIm.setSelected(!selected);
+// camera.getCameraControl().enableTorch(!selected);
+// } else if (v.equals(imPhoto)) {
+// Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
+// intentActivityResultLauncher.launch(intent);
+// } else if (v.equals(imZoom)) {
+// if (seekBar.getVisibility() == View.VISIBLE) {
+// seekBar.setVisibility(View.GONE);
+// } else if (seekBar.getVisibility() == View.GONE) {
+// seekBar.setVisibility(View.VISIBLE);
+// }
+// }
+// }
+//
+// }
+//
+// private void initClick() {
+// imBack.setOnClickListener(this);
+// flashIm.setOnClickListener(this);
+// imPhoto.setOnClickListener(this);
+// imZoom.setOnClickListener(this);
+// seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
+// @Override
+// public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
+// float v = (seekBar.getMax() - progress) / 10.0f;
+// imageView.setAlpha(v);
+//
+// }
+//
+// @Override
+// public void onStartTrackingTouch(SeekBar seekBar) {
+//
+// }
+//
+// @Override
+// public void onStopTrackingTouch(SeekBar seekBar) {
+//
+// }
+// });
+// }
+//
+// private void init() {
+// cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA;
+// permissions = new String[]{Manifest.permission.CAMERA};
+// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
+// permissions = new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_MEDIA_IMAGES};
+// } else {
+// permissions = new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
+// }
+// if (!checkPermission()) {
+// hasPermission = false;
+// imageView.setOnTouchListener(null);
+// ActivityCompat.requestPermissions(this, permissions, 0);
+// } else {
+// hasPermission = true;
+// imageView.setOnTouchListener(this);
+// startCamera();
+// }
+// }
+//
+// private void startCamera() {
+// ListenableFuture future = ProcessCameraProvider.getInstance(this);
+// future.addListener(() -> {
+// try {
+// ProcessCameraProvider cameraProvider = future.get();
+//
+// Preview preview = new Preview.Builder().build();
+// cameraProvider.unbindAll();
+// ImageCapture.Builder builder1 = new ImageCapture.Builder();
+// imageCapture = builder1.build();
+// camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture);
+// range = Utils.getRange(camera);
+// preview.setSurfaceProvider(previewView.getSurfaceProvider());
+//
+// if (curBitmapPath != null) {
+// Bitmap bitmap = Utils.loadImageFromAssets(this, curBitmapPath);
+// imageView.setImageBitmap(bitmap);
+// int width = bitmap.getWidth();
+// int height = bitmap.getHeight();
+// onInitIm(width, height);
+//
+//
+// }
+//
+// } catch (Exception e) {
+// e.printStackTrace();
+// }
+// }, ContextCompat.getMainExecutor(this));
+//
+// }
+//
+// @Override
+// public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+// super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+// if (requestCode == 0) {
+// if (checkPermission()) {
+// hasPermission = true;
+// imageView.setOnTouchListener(this);
+// startCamera();
+// } else {
+// hasPermission = false;
+// imageView.setOnTouchListener(null);
+// }
+//
+// }
+// }
+//
+//
+// private boolean checkPermission() {
+// boolean result = true;
+// for (String per : permissions) {
+// if (ActivityCompat.checkSelfPermission(this, per) != PackageManager.PERMISSION_GRANTED) {
+// result = false;
+// }
+// }
+// return result;
+//
+// }
+//
+// private void showNoPermission() {
+// Toast.makeText(this, getString(R.string.permission_fail), Toast.LENGTH_SHORT).show();
+// }
+//
+// @Override
+// public void onBackPressed() {
+// super.onBackPressed();
+// if (isMain) {
+// showAd();
+// finish();
+// } else {
+// finish();
+// }
+// }
+//}
\ No newline at end of file
diff --git a/app/src/main/java/com/lock/arcanvasart/activity/CameraActivity.java b/app/src/main/java/com/lock/arcanvasart/activity/CameraActivity.java
index 27046ce..51c84d4 100644
--- a/app/src/main/java/com/lock/arcanvasart/activity/CameraActivity.java
+++ b/app/src/main/java/com/lock/arcanvasart/activity/CameraActivity.java
@@ -2,18 +2,26 @@ package com.lock.arcanvasart.activity;
import android.Manifest;
import android.content.ContentValues;
+import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
+import android.graphics.Matrix;
+import android.graphics.Point;
+import android.graphics.PointF;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
+import android.util.DisplayMetrics;
import android.util.Log;
+import android.view.MotionEvent;
import android.view.View;
+import android.view.WindowManager;
+import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.Toast;
@@ -32,13 +40,14 @@ import androidx.core.content.ContextCompat;
import com.google.common.util.concurrent.ListenableFuture;
import com.lock.arcanvasart.R;
import com.lock.arcanvasart.Utils.PermissionUtils;
+import com.lock.arcanvasart.Utils.Tracing;
import com.lock.arcanvasart.databinding.ActivityCameraBinding;
import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.ExecutionException;
-public class CameraActivity extends AppCompatActivity implements SeekBar.OnSeekBarChangeListener {
+public class CameraActivity extends AppCompatActivity implements View.OnTouchListener, SeekBar.OnSeekBarChangeListener {
// 请求码常量
private static final int CAMERA_PERMISSION_REQUEST_CODE = 200; // 相机权限请求码
@@ -47,21 +56,36 @@ public class CameraActivity extends AppCompatActivity implements SeekBar.OnSeekB
private ActivityCameraBinding binding;
+ private Matrix matrix = new Matrix(); // 当前变换矩阵
+ private Matrix savedMatrix = new Matrix(); // 保存的变换矩阵
+ private PointF startPointF = new PointF(); // 触摸起始点
+ private float initialDistance; // 初始触摸距离
+ private int mode = MODE_NONE; // 当前模式
+ private static final int MODE_NONE = 0; // 无模式
+ private static final int MODE_DRAG = 1; // 拖动模式
+ private static final int MODE_ZOOM = 2; // 缩放模式
+
private Bitmap bitmap;
private boolean isFlashOn = false; // 闪光灯状态
private boolean isReOn = false;
private Camera camera; // 相机实例
private ImageCapture imageCapture; // 拍照实例
+ private ImageView imageView;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityCameraBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
+ imageView = findViewById(R.id.image_full);
+ imageView.setOnTouchListener(this);
+
setupListeners(); // 设置监听器
checkPermissionsAndStartCamera(); // 检查权限并启动相机
+
// 接收传递的图片路径
String imagePath = getIntent().getStringExtra("imagePath");
Log.d("imagepath", "imagepath: " + imagePath);
@@ -77,8 +101,27 @@ public class CameraActivity extends AppCompatActivity implements SeekBar.OnSeekB
binding.light.setOnClickListener(v -> toggleFlash()); // 闪光灯按钮监听
binding.back.setOnClickListener(v -> finish());
binding.reversal.setOnClickListener(v -> toggleMirrorEffect());
- binding.topRightImage.setOnClickListener(v -> clearImage());
+// binding.topRightImage.setOnClickListener(v -> clearImage());
binding.play.setOnClickListener(v -> takePhoto());
+ imageView.setOnTouchListener(this);
+ }
+
+ private void checkPermissionsAndStartCamera() {
+ String[] permissions = getRequiredPermissions();
+ if (PermissionUtils.hasPermissions(this, permissions)) {
+ startCamera();
+ } else {
+ PermissionUtils.requestPermissions(this, permissions, CAMERA_PERMISSION_REQUEST_CODE);
+ }
+
+ // 请求存储权限(用于保存照片和视频)
+// String[] storagePermissions = new String[]{
+// Manifest.permission.WRITE_EXTERNAL_STORAGE,
+// Manifest.permission.READ_EXTERNAL_STORAGE
+// };
+// if (!PermissionUtils.hasPermissions(this, storagePermissions)) {
+// ActivityCompat.requestPermissions(this, storagePermissions, STORAGE_PERMISSION_REQUEST_CODE);
+// }
}
private void startCamera() {
@@ -109,6 +152,26 @@ public class CameraActivity extends AppCompatActivity implements SeekBar.OnSeekB
}, ContextCompat.getMainExecutor(this));
}
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults);
+
+ // 处理权限请求结果
+ if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) {
+ if (PermissionUtils.handlePermissionsResult(grantResults)) {
+ startCamera();
+ } else {
+ Toast.makeText(this, "相机权限被拒绝,请在设置中启用权限", Toast.LENGTH_SHORT).show();
+ }
+ } else if (requestCode == STORAGE_PERMISSION_REQUEST_CODE) {
+ if (PermissionUtils.handlePermissionsResult(grantResults)) {
+ openImagePicker();
+ } else {
+ Toast.makeText(this, "存储权限被拒绝,请在设置中启用权限", Toast.LENGTH_SHORT).show();
+ }
+ }
+ }
+
private void takePhoto() {
// 确保 imageCapture 实例已初始化
if (imageCapture == null) {
@@ -148,57 +211,19 @@ public class CameraActivity extends AppCompatActivity implements SeekBar.OnSeekB
}
private void clearImage() {
- binding.imageFull.setImageBitmap(null); // 清空当前显示的图片
+ imageView.setImageBitmap(null); // 清空当前显示的图片
// 清空图片后显示提示文字和图像
- showCenterTextAndImage(true);
+// showCenterTextAndImage(true);
}
private void toggleMirrorEffect() {
// 获取当前水平缩放值并反转
- float scaleX = binding.imageFull.getScaleX();
- binding.imageFull.setScaleX(scaleX * -1); // 将水平缩放翻转
+ float scaleX =imageView.getScaleX();
+ imageView.setScaleX(scaleX * -1); // 将水平缩放翻转
isReOn = !isReOn;
binding.reversal.setImageResource(isReOn ? R.drawable.reversal : R.drawable.un_reversal);
}
- private void checkPermissionsAndStartCamera() {
- String[] permissions = getRequiredPermissions();
- if (PermissionUtils.hasPermissions(this, permissions)) {
- startCamera();
- } else {
- PermissionUtils.requestPermissions(this, permissions, CAMERA_PERMISSION_REQUEST_CODE);
- }
-
- // 请求存储权限(用于保存照片和视频)
-// String[] storagePermissions = new String[]{
-// Manifest.permission.WRITE_EXTERNAL_STORAGE,
-// Manifest.permission.READ_EXTERNAL_STORAGE
-// };
-// if (!PermissionUtils.hasPermissions(this, storagePermissions)) {
-// ActivityCompat.requestPermissions(this, storagePermissions, STORAGE_PERMISSION_REQUEST_CODE);
-// }
- }
-
- @Override
- public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults);
-
- // 处理权限请求结果
- if (requestCode == CAMERA_PERMISSION_REQUEST_CODE) {
- if (PermissionUtils.handlePermissionsResult(grantResults)) {
- startCamera();
- } else {
- Toast.makeText(this, "相机权限被拒绝,请在设置中启用权限", Toast.LENGTH_SHORT).show();
- }
- } else if (requestCode == STORAGE_PERMISSION_REQUEST_CODE) {
- if (PermissionUtils.handlePermissionsResult(grantResults)) {
- openImagePicker();
- } else {
- Toast.makeText(this, "存储权限被拒绝,请在设置中启用权限", Toast.LENGTH_SHORT).show();
- }
- }
- }
-
private String[] getRequiredPermissions() {
// 根据 Android 版本获取所需权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
@@ -230,7 +255,7 @@ public class CameraActivity extends AppCompatActivity implements SeekBar.OnSeekB
startActivityForResult(intent, PICK_IMAGE_REQUEST_CODE);
}
- showCenterTextAndImage(false);
+// showCenterTextAndImage(false);
}
@Override
@@ -240,7 +265,7 @@ public class CameraActivity extends AppCompatActivity implements SeekBar.OnSeekB
if (requestCode == PICK_IMAGE_REQUEST_CODE && resultCode == RESULT_OK && data != null) {
Uri selectedImageUri = data.getData(); // 获取选中的图片 URI
if (selectedImageUri != null) {
- binding.imageFull.setImageURI(selectedImageUri); // 显示选中的图片
+ imageView.setImageURI(selectedImageUri); // 显示选中的图片
}
}
}
@@ -255,12 +280,18 @@ public class CameraActivity extends AppCompatActivity implements SeekBar.OnSeekB
cameraProvider.unbindAll(); // 解绑所有相机
camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview); // 绑定生命周期
+ if(bitmap!= null){
+ int width = bitmap.getWidth();
+ int height = bitmap.getHeight();
+ onInitIm(width, height); // 初始化图片位置
+ }
+
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
// 调整图片透明度
- binding.imageFull.setAlpha((100 - progress) / 100f); // 根据进度设置透明度
+ imageView.setAlpha((100 - progress) / 100f); // 根据进度设置透明度
}
@Override
@@ -282,26 +313,26 @@ public class CameraActivity extends AppCompatActivity implements SeekBar.OnSeekB
}
// 加载图片后检查是否有图片,并更新视图
- showCenterTextAndImage(false);
+// showCenterTextAndImage(false);
}
- private void showCenterTextAndImage(boolean show) {
- if (show) {
- // 显示中心提示文字和图片
- binding.centerText.setVisibility(View.VISIBLE);
- binding.centerImage.setVisibility(View.VISIBLE);
- } else {
- // 隐藏中心提示文字和图片
- binding.centerText.setVisibility(View.GONE);
- binding.centerImage.setVisibility(View.GONE);
- }
- }
+// private void showCenterTextAndImage(boolean show) {
+// if (show) {
+// // 显示中心提示文字和图片
+// binding.centerText.setVisibility(View.VISIBLE);
+// binding.centerImage.setVisibility(View.VISIBLE);
+// } else {
+// // 隐藏中心提示文字和图片
+// binding.centerText.setVisibility(View.GONE);
+// binding.centerImage.setVisibility(View.GONE);
+// }
+// }
// 从设备存储中加载图片
private void displayImageFromStorage(String imagePath) {
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
if (bitmap != null) {
- binding.imageFull.setImageBitmap(bitmap);
+ imageView.setImageBitmap(bitmap);
} else {
Toast.makeText(this, "加载图片失败", Toast.LENGTH_SHORT).show();
}
@@ -317,11 +348,79 @@ public class CameraActivity extends AppCompatActivity implements SeekBar.OnSeekB
// 将 InputStream 转换为 Bitmap
bitmap = BitmapFactory.decodeStream(inputStream);
// 显示 Bitmap
- binding.imageFull.setImageBitmap(bitmap);
+ imageView.setImageBitmap(bitmap);
} catch (IOException e) {
e.printStackTrace();
Toast.makeText(this, "加载图片失败: " + e.getMessage(), Toast.LENGTH_SHORT).show(); // 显示错误信息
}
}
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ ImageView view = (ImageView) v;
+
+ Log.d("----","--------a="+event);
+ switch (event.getActionMasked()) {
+ case MotionEvent.ACTION_DOWN:
+ savedMatrix.set(matrix); // 保存当前矩阵
+ startPointF.set(event.getX(), event.getY()); // 记录触摸起始点
+ mode = MODE_DRAG; // 设置为拖动模式
+ break;
+
+ case MotionEvent.ACTION_POINTER_DOWN:
+ initialDistance = Tracing.getDistance(event); // 计算初始距离
+ if (initialDistance > 10f) {
+ savedMatrix.set(matrix); // 保存当前矩阵
+ mode = MODE_ZOOM; // 设置为缩放模式
+ }
+ break;
+
+ case MotionEvent.ACTION_MOVE:
+ if (mode == MODE_DRAG) {
+ matrix.set(savedMatrix); // 恢复保存的矩阵
+ matrix.postTranslate(event.getX() - startPointF.x, event.getY() - startPointF.y); // 计算平移
+ } else if (mode == MODE_ZOOM) {
+ float newDistance = Tracing.getDistance(event); // 计算新的距离
+ if (newDistance > 10f) {
+ float scale = newDistance / initialDistance; // 计算缩放比例
+ matrix.set(savedMatrix); // 恢复保存的矩阵
+ matrix.postScale(scale, scale, view.getWidth() / 2f, view.getHeight() / 2f); // 应用缩放
+ }
+ }
+ break;
+
+ case MotionEvent.ACTION_UP:
+ case MotionEvent.ACTION_POINTER_UP:
+ mode = MODE_NONE; // 重置模式
+ break;
+ }
+
+ view.setImageMatrix(matrix); // 更新图片矩阵
+ return true; // 处理触摸事件
+ }
+
+ // 初始化图片的位置
+ private void onInitIm(float imW, float imH) {
+ Point screen = getScreen(); // 获取屏幕尺寸
+ float newX = screen.x / 2f - imW / 2; // 计算图片水平居中位置
+ float newY = screen.y / 2f - imH / 2; // 计算图片垂直居中位置
+ matrix.postTranslate(newX, newY); // 设置图片初始位置
+ imageView.setImageMatrix(matrix); // 应用矩阵
+
+ Log.d("---------------tt", "------startMatrix-----x=" + newX + "------y=" + newY);
+ }
+
+
+ public Point getScreen() {
+ DisplayMetrics displayMetrics = new DisplayMetrics();
+ WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
+ windowManager.getDefaultDisplay().getMetrics(displayMetrics);
+ int width = displayMetrics.widthPixels;
+ int height = displayMetrics.heightPixels;
+ Point point = new Point();
+ point.x = width;
+ point.y = height;
+ return point;
+ }
+
}
diff --git a/app/src/main/java/com/lock/arcanvasart/activity/SplashActivity.java b/app/src/main/java/com/lock/arcanvasart/activity/SplashActivity.java
new file mode 100644
index 0000000..2fe6a4c
--- /dev/null
+++ b/app/src/main/java/com/lock/arcanvasart/activity/SplashActivity.java
@@ -0,0 +1,54 @@
+package com.lock.arcanvasart.activity;
+
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.CountDownTimer;
+import android.widget.ProgressBar;
+
+import androidx.appcompat.app.AppCompatActivity;
+
+import com.lock.arcanvasart.R;
+
+
+public class SplashActivity extends AppCompatActivity {
+
+ private static final int SPLASH_TIME_OUT = 1500;
+ private ProgressBar progressBar;
+
+ private CountDownTimer countDownTimer;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_splash);
+
+ progressBar = findViewById(R.id.progress_bar);
+ countDownTimer = new CountDownTimer(SPLASH_TIME_OUT, 100) {
+
+ @Override
+ public void onTick(long millisUntilFinished) {
+
+ float v = 100 - (float) millisUntilFinished / SPLASH_TIME_OUT * 100;
+ int v1 = (int) v;
+ progressBar.setProgress(v1);
+
+ }
+
+ @Override
+ public void onFinish() {
+ progressBar.setProgress(100);
+ Intent intent = new Intent(SplashActivity.this, MainActivity.class);
+ startActivity(intent);
+ finish();
+ }
+ };
+
+ countDownTimer.start();
+
+
+
+
+
+ }
+}
diff --git a/app/src/main/res/drawable/seek_bar_color2.xml b/app/src/main/res/drawable/seek_bar_color2.xml
new file mode 100644
index 0000000..f8e5913
--- /dev/null
+++ b/app/src/main/res/drawable/seek_bar_color2.xml
@@ -0,0 +1,30 @@
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/activity_camera.xml b/app/src/main/res/layout/activity_camera.xml
index 677b773..8233d6b 100644
--- a/app/src/main/res/layout/activity_camera.xml
+++ b/app/src/main/res/layout/activity_camera.xml
@@ -18,6 +18,20 @@
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0" />
+
+
+
+
+
+
-
+
+
+
+
-
+
+
+
+
+
+
-
+
+
+
+
+
-
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/mipmap-xxxhdpi/init.png b/app/src/main/res/mipmap-xxxhdpi/init.png
new file mode 100644
index 0000000..6bf2654
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/init.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/splash_background.png b/app/src/main/res/mipmap-xxxhdpi/splash_background.png
new file mode 100644
index 0000000..82df576
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/splash_background.png differ