Compare View

switch
from
...
to
 
Commits (2)
app/src/main/java/com/hjx/parent/ImageActivity.java
1 package com.hjx.parent; 1 package com.hjx.parent;
2 2
3 import android.annotation.SuppressLint; 3 import android.annotation.SuppressLint;
4 import android.app.Dialog; 4 import android.app.Dialog;
5 import android.content.Intent; 5 import android.content.Intent;
6 import android.graphics.Bitmap; 6 import android.graphics.Bitmap;
7 import android.graphics.BitmapFactory; 7 import android.graphics.BitmapFactory;
8 import android.graphics.Rect; 8 import android.graphics.Rect;
9 import android.net.Uri; 9 import android.net.Uri;
10 import android.os.Bundle; 10 import android.os.Bundle;
11 import android.os.Handler; 11 import android.os.Handler;
12 import android.provider.MediaStore; 12 import android.provider.MediaStore;
13 import android.text.TextUtils; 13 import android.text.TextUtils;
14 import android.util.Log; 14 import android.util.Log;
15 import android.view.KeyEvent; 15 import android.view.KeyEvent;
16 import android.view.View; 16 import android.view.View;
17 17
18 18
19 import androidx.annotation.Nullable; 19 import androidx.annotation.Nullable;
20 import androidx.core.content.FileProvider; 20 import androidx.core.content.FileProvider;
21 import androidx.viewpager2.widget.ViewPager2; 21 import androidx.viewpager2.widget.ViewPager2;
22 22
23 import com.google.gson.Gson; 23 import com.google.gson.Gson;
24 import com.google.gson.JsonObject; 24 import com.google.gson.JsonObject;
25 import com.hjx.parent.adapter.ImageAdapter; 25 import com.hjx.parent.adapter.ImageAdapter;
26 import com.hjx.parent.databinding.ActivityImageBinding; 26 import com.hjx.parent.databinding.ActivityImageBinding;
27 import com.hjx.parent.dialog.AddHomeworkDialog; 27 import com.hjx.parent.dialog.AddHomeworkDialog;
28 import com.hjx.parent.dialog.ErrorInputDialog; 28 import com.hjx.parent.dialog.ErrorInputDialog;
29 import com.hjx.parent.dialog.PhotoViewDialog; 29 import com.hjx.parent.dialog.PhotoViewDialog;
30 import com.hjx.parent.dialog.TipDialog; 30 import com.hjx.parent.dialog.TipDialog;
31 import com.hjx.parent.rx.BaseRxActivity; 31 import com.hjx.parent.rx.BaseRxActivity;
32 import com.prws.common.bean.CutPicBean; 32 import com.prws.common.bean.CutPicBean;
33 import com.prws.common.bean.ImageBean; 33 import com.prws.common.bean.ImageBean;
34 import com.prws.common.bean.TopicBean; 34 import com.prws.common.bean.TopicBean;
35 import com.prws.common.net.NetWorks; 35 import com.prws.common.net.NetWorks;
36 import com.prws.common.utils.BitmapUtils; 36 import com.prws.common.utils.BitmapUtils;
37 import com.prws.common.utils.CommonUtil; 37 import com.prws.common.utils.CommonUtil;
38 import com.xiasuhuei321.loadingdialog.view.LoadingDialog; 38 import com.xiasuhuei321.loadingdialog.view.LoadingDialog;
39 39
40 import java.io.File; 40 import java.io.File;
41 import java.util.ArrayList; 41 import java.util.ArrayList;
42 import java.util.List; 42 import java.util.List;
43 43
44 import io.reactivex.Observer; 44 import io.reactivex.Observer;
45 import io.reactivex.disposables.Disposable; 45 import io.reactivex.disposables.Disposable;
46 import retrofit2.Call; 46 import retrofit2.Call;
47 import retrofit2.Callback; 47 import retrofit2.Callback;
48 import retrofit2.Response; 48 import retrofit2.Response;
49 49
50 public class ImageActivity extends BaseRxActivity<ActivityImageBinding> implements View.OnClickListener { 50 public class ImageActivity extends BaseRxActivity<ActivityImageBinding> implements View.OnClickListener {
51 51
52 private List<String> images = new ArrayList<>(); 52 private List<String> images = new ArrayList<>();
53 private ImageAdapter imageAdapter; 53 private ImageAdapter imageAdapter;
54 private List<ImageBean> list = new ArrayList<>(); 54 private List<ImageBean> list = new ArrayList<>();
55 private String filePath; 55 private String filePath;
56 56
57 private int type = 0; 57 private int type = 0;
58 private AddHomeworkDialog addHomeworkDialog; 58 private AddHomeworkDialog addHomeworkDialog;
59 59
60 @Override 60 @Override
61 public void initView(Bundle savedInstanceState) { 61 public void initView(Bundle savedInstanceState) {
62 type = getIntent().getIntExtra("type", 0); 62 type = getIntent().getIntExtra("type", 0);
63 binding.tvSave.setText(type == 0 ? "保存错题" : "录入题目"); 63 binding.tvSave.setText(type == 0 ? "保存错题" : "录入题目");
64 64
65 images = getIntent().getStringArrayListExtra("images"); 65 images = getIntent().getStringArrayListExtra("images");
66 for (String s : images) { 66 for (String s : images) {
67 String filepath = context.getExternalFilesDir("images").getPath() + "/" + System.currentTimeMillis() + CommonUtil.getStr() + ".jpg"; 67 String filepath = context.getExternalFilesDir("images").getPath() + "/" + System.currentTimeMillis() + CommonUtil.getStr() + ".jpg";
68 ImageBean imageBean = new ImageBean(); 68 ImageBean imageBean = new ImageBean();
69 Bitmap bitmap = BitmapUtils.getimage(s); 69 Bitmap bitmap = BitmapUtils.getimage(s);
70 CommonUtil.saveBitmapToUri(bitmap, filepath); 70 CommonUtil.saveBitmapToUri(bitmap, filepath);
71 imageBean.setPath(filepath); 71 imageBean.setPath(filepath);
72 imageBean.source = filepath; 72 imageBean.source = filepath;
73 list.add(imageBean); 73 list.add(imageBean);
74 } 74 }
75 imageAdapter = new ImageAdapter(this, list); 75 imageAdapter = new ImageAdapter(this, list);
76 binding.viewPager.setAdapter(imageAdapter); 76 binding.viewPager.setAdapter(imageAdapter);
77 binding.viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { 77 binding.viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
78 @Override 78 @Override
79 public void onPageSelected(int position) { 79 public void onPageSelected(int position) {
80 if (list.get(position).getCuts() == null) { 80 if (list.get(position).getCuts() == null) {
81 // binding.ivPrevious.setEnabled(false); 81 // binding.ivPrevious.setEnabled(false);
82 // binding.ivNext.setEnabled(false); 82 // binding.ivNext.setEnabled(false);
83 clearText(); 83 clearText();
84 } 84 }
85 binding.tvTitle.setText((binding.viewPager.getCurrentItem() + 1) + "/" + list.size()); 85 binding.tvTitle.setText((binding.viewPager.getCurrentItem() + 1) + "/" + list.size());
86 if (position == 0) { 86 if (position == 0) {
87 binding.ivPrevious.setImageResource(R.mipmap.ic_previous_gray); 87 binding.ivPrevious.setImageResource(R.mipmap.ic_previous_gray);
88 // binding.ivPrevious.setEnabled(true); 88 // binding.ivPrevious.setEnabled(true);
89 } else { 89 } else {
90 binding.ivPrevious.setImageResource(R.mipmap.ic_previous); 90 binding.ivPrevious.setImageResource(R.mipmap.ic_previous);
91 // binding.ivPrevious.setEnabled(false); 91 // binding.ivPrevious.setEnabled(false);
92 } 92 }
93 if (position == list.size() - 1) { 93 if (position == list.size() - 1) {
94 binding.ivNext.setImageResource(R.mipmap.ic_next_gray); 94 binding.ivNext.setImageResource(R.mipmap.ic_next_gray);
95 // binding.ivNext.setEnabled(true); 95 // binding.ivNext.setEnabled(true);
96 } else { 96 } else {
97 binding.ivNext.setImageResource(R.mipmap.ic_next); 97 binding.ivNext.setImageResource(R.mipmap.ic_next);
98 // binding.ivNext.setEnabled(false); 98 // binding.ivNext.setEnabled(false);
99 } 99 }
100 super.onPageSelected(position); 100 super.onPageSelected(position);
101 } 101 }
102 }); 102 });
103 binding.rlNext.setOnClickListener(this); 103 binding.rlNext.setOnClickListener(this);
104 binding.rlPrevious.setOnClickListener(this); 104 binding.rlPrevious.setOnClickListener(this);
105 binding.ivBack.setOnClickListener(this); 105 binding.ivBack.setOnClickListener(this);
106 binding.tvPhoto.setOnClickListener(this); 106 binding.tvPhoto.setOnClickListener(this);
107 binding.tvAdd.setOnClickListener(this); 107 binding.tvAdd.setOnClickListener(this);
108 binding.llEdit.setOnClickListener(this); 108 binding.llEdit.setOnClickListener(this);
109 binding.tvSave.setOnClickListener(this); 109 binding.tvSave.setOnClickListener(this);
110 binding.btnShowSource.setOnClickListener(v -> { 110 binding.btnShowSource.setOnClickListener(v -> {
111 if (list.isEmpty()) return; 111 if (list.isEmpty()) return;
112 ImageBean data = list.get(binding.viewPager.getCurrentItem()); 112 ImageBean data = list.get(binding.viewPager.getCurrentItem());
113 new PhotoViewDialog(this).show(data.source); 113 new PhotoViewDialog(this).show(data.source);
114 }); 114 });
115 } 115 }
116 116
117 public void clearText() { 117 public void clearText() {
118 int index = binding.viewPager.getCurrentItem(); 118 int index = binding.viewPager.getCurrentItem();
119 showLoadingDialog(getString(R.string.loading_text), new LoadingDialog.DismissListener() { 119 showLoadingDialog(getString(R.string.loading_text), new LoadingDialog.DismissListener() {
120 @Override 120 @Override
121 public void dimiss() { 121 public void dimiss() {
122 // binding.ivPrevious.setEnabled(index != 0); 122 // binding.ivPrevious.setEnabled(index != 0);
123 // binding.ivNext.setEnabled(index != list.size() - 1); 123 // binding.ivNext.setEnabled(index != list.size() - 1);
124 } 124 }
125 }); 125 });
126 Log.i("clearText", list.get(index).getPath()); 126 Log.i("clearText", list.get(index).getPath());
127 String base64 = BitmapUtils.imageToBase64(list.get(index).getPath()); 127 String base64 = BitmapUtils.imageToBase64(list.get(index).getPath());
128 NetWorks.removeWriting(base64, new Observer<JsonObject>() { 128 NetWorks.removeWriting(base64, new Observer<JsonObject>() {
129 @Override 129 @Override
130 public void onSubscribe(Disposable d) { 130 public void onSubscribe(Disposable d) {
131 131
132 } 132 }
133 133
134 @Override 134 @Override
135 public void onNext(JsonObject jsonObject) { 135 public void onNext(JsonObject jsonObject) {
136 if (jsonObject != null && jsonObject.get("image_processed") != null) { 136 if (jsonObject != null && jsonObject.get("image_processed") != null) {
137 String image = jsonObject.get("image_processed").getAsString(); 137 String image = jsonObject.get("image_processed").getAsString();
138 if (image != null) { 138 if (image != null) {
139 String filepath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg"; 139 String filepath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
140 CommonUtil.saveBitmapToUri(BitmapUtils.stringToBitmap(image), filepath); 140 CommonUtil.saveBitmapToUri(BitmapUtils.stringToBitmap(image), filepath);
141 list.get(index).setPath(filepath); 141 list.get(index).setPath(filepath);
142 if (list.get(index).getCuts() == null) { 142 if (list.get(index).getCuts() == null) {
143 list.get(index).setCuts(new ArrayList<>()); 143 list.get(index).setCuts(new ArrayList<>());
144 } 144 }
145 imageAdapter.notifyItemChanged(index); 145 imageAdapter.notifyItemChanged(index);
146 cut(filepath); 146 cut(filepath);
147 } else { 147 } else {
148 loadFail("去除字迹失败"); 148 loadFail("去除字迹失败");
149 } 149 }
150 } else { 150 } else {
151 loadFail("去除字迹失败"); 151 loadFail("去除字迹失败");
152 } 152 }
153 } 153 }
154 154
155 @Override 155 @Override
156 public void onError(Throwable e) { 156 public void onError(Throwable e) {
157 loadFail("去除字迹失败"); 157 loadFail("去除字迹失败");
158 } 158 }
159 159
160 @Override 160 @Override
161 public void onComplete() { 161 public void onComplete() {
162 162
163 } 163 }
164 }); 164 });
165 } 165 }
166 166
167 public void cut(String path) { 167 public void cut(String path) {
168 String base64 = BitmapUtils.imageToBase64(path); 168 String base64 = BitmapUtils.imageToBase64(path);
169 Log.i("figLoaction", path); 169 Log.i("figLoaction", path);
170 NetWorks.cut(base64, new Observer<CutPicBean>() { 170 NetWorks.cut(base64, new Observer<CutPicBean>() {
171 @Override 171 @Override
172 public void onSubscribe(Disposable d) { 172 public void onSubscribe(Disposable d) {
173 173
174 } 174 }
175 175
176 @Override 176 @Override
177 public void onNext(CutPicBean cutPicBean) { 177 public void onNext(CutPicBean cutPicBean) {
178 if (cutPicBean != null) { 178 if (cutPicBean != null) {
179 if (cutPicBean.getDirection() != 0) { 179 if (cutPicBean.getDirection() != 0) {
180 rotatingImage(cutPicBean); 180 rotatingImage(cutPicBean);
181 } else { 181 } else {
182 if (cutPicBean.getQus_figure() != null && cutPicBean.getQus_figure().size() > 0) { 182 if (cutPicBean.getQus_figure() != null && cutPicBean.getQus_figure().size() > 0) {
183 List<CutPicBean.FigLoaction> figLoactions = new ArrayList<>(); 183 List<CutPicBean.FigLoaction> figLoactions = new ArrayList<>();
184 for (CutPicBean.CutLocation cutLocation : cutPicBean.getQus_figure()) { 184 for (CutPicBean.CutLocation cutLocation : cutPicBean.getQus_figure()) {
185 figLoactions.add(cutLocation.getFig_location()); 185 figLoactions.add(cutLocation.getFig_location());
186 } 186 }
187 new Handler().postDelayed(new Runnable() { 187 new Handler().postDelayed(new Runnable() {
188 @Override 188 @Override
189 public void run() { 189 public void run() {
190 getRects(figLoactions); 190 getRects(figLoactions);
191 } 191 }
192 }, 1000); 192 }, 1000);
193 } else { 193 } else {
194 cancelLoadingDialog(); 194 cancelLoadingDialog();
195 } 195 }
196 } 196 }
197 } else { 197 } else {
198 loadFail("自动切题失败"); 198 loadFail("自动切题失败");
199 } 199 }
200 } 200 }
201 201
202 @Override 202 @Override
203 public void onError(Throwable e) { 203 public void onError(Throwable e) {
204 loadFail("自动切题失败"); 204 loadFail("自动切题失败");
205 } 205 }
206 206
207 @Override 207 @Override
208 public void onComplete() { 208 public void onComplete() {
209 209
210 } 210 }
211 }); 211 });
212 } 212 }
213 213
214 private void getRects(List<CutPicBean.FigLoaction> figLoactions) { 214 private void getRects(List<CutPicBean.FigLoaction> figLoactions) {
215 Log.i("figLoaction", new Gson().toJson(figLoactions)); 215 Log.i("figLoaction", new Gson().toJson(figLoactions));
216 int index = binding.viewPager.getCurrentItem(); 216 int index = binding.viewPager.getCurrentItem();
217 List<ImageBean.Cut> cuts = new ArrayList<>(); 217 List<ImageBean.Cut> cuts = new ArrayList<>();
218 for (CutPicBean.FigLoaction figLoaction : figLoactions) { 218 for (CutPicBean.FigLoaction figLoaction : figLoactions) {
219 ImageBean.Cut cut = new ImageBean.Cut(); 219 ImageBean.Cut cut = new ImageBean.Cut();
220 cut.setRect(figLoaction); 220 cut.setRect(figLoaction);
221 cut.setSelect(false); 221 cut.setSelect(false);
222 cuts.add(cut); 222 cuts.add(cut);
223 } 223 }
224 list.get(index).setCuts(cuts); 224 list.get(index).setCuts(cuts);
225 imageAdapter.notifyItemChanged(index); 225 imageAdapter.notifyItemChanged(index);
226 cancelLoadingDialog(); 226 cancelLoadingDialog();
227 } 227 }
228 228
229 private void rotatingImage(CutPicBean cutPicBean) { 229 private void rotatingImage(CutPicBean cutPicBean) {
230 int index = binding.viewPager.getCurrentItem(); 230 int index = binding.viewPager.getCurrentItem();
231 Bitmap bitmap = BitmapFactory.decodeFile(list.get(index).getPath()); 231 Bitmap bitmap = BitmapFactory.decodeFile(list.get(index).getPath());
232 int angle = 0; 232 int angle = 0;
233 switch (cutPicBean.getDirection()) { 233 switch (cutPicBean.getDirection()) {
234 case 1: 234 case 1:
235 angle = 90; 235 angle = 90;
236 break; 236 break;
237 case 2: 237 case 2:
238 angle = 180; 238 angle = 180;
239 break; 239 break;
240 case 3: 240 case 3:
241 angle = 270; 241 angle = 270;
242 break; 242 break;
243 } 243 }
244 if (cutPicBean.getQus_figure() != null && cutPicBean.getQus_figure().size() > 0) { 244 if (cutPicBean.getQus_figure() != null && cutPicBean.getQus_figure().size() > 0) {
245 List<CutPicBean.FigLoaction> figLoactions = new ArrayList<>(); 245 List<CutPicBean.FigLoaction> figLoactions = new ArrayList<>();
246 for (CutPicBean.CutLocation cutLocation : cutPicBean.getQus_figure()) { 246 for (CutPicBean.CutLocation cutLocation : cutPicBean.getQus_figure()) {
247 figLoactions.add(cutLocation.getFig_location()); 247 figLoactions.add(cutLocation.getFig_location());
248 } 248 }
249 figLoactions = CommonUtil.rotaingLocation(angle, figLoactions, bitmap.getWidth(), bitmap.getHeight()); 249 figLoactions = CommonUtil.rotaingLocation(angle, figLoactions, bitmap.getWidth(), bitmap.getHeight());
250 bitmap = CommonUtil.rotaingImageView(angle, bitmap); 250 bitmap = CommonUtil.rotaingImageView(angle, bitmap);
251 String filepath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg"; 251 String filepath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
252 CommonUtil.saveBitmapToUri(bitmap, filepath); 252 CommonUtil.saveBitmapToUri(bitmap, filepath);
253 list.get(index).setPath(filepath); 253 list.get(index).setPath(filepath);
254 imageAdapter.notifyItemChanged(index); 254 imageAdapter.notifyItemChanged(index);
255 List<CutPicBean.FigLoaction> finalFigLoactions = figLoactions; 255 List<CutPicBean.FigLoaction> finalFigLoactions = figLoactions;
256 new Handler().postDelayed(new Runnable() { 256 new Handler().postDelayed(new Runnable() {
257 @Override 257 @Override
258 public void run() { 258 public void run() {
259 getRects(finalFigLoactions); 259 getRects(finalFigLoactions);
260 } 260 }
261 }, 500); 261 }, 500);
262 } else { 262 } else {
263 cancelLoadingDialog(); 263 cancelLoadingDialog();
264 } 264 }
265 } 265 }
266 266
267 @Override 267 @Override
268 protected ActivityImageBinding getViewBinding() { 268 protected ActivityImageBinding getViewBinding() {
269 return ActivityImageBinding.inflate(getLayoutInflater()); 269 return ActivityImageBinding.inflate(getLayoutInflater());
270 } 270 }
271 271
272 @SuppressLint("SetTextI18n") 272 @SuppressLint("SetTextI18n")
273 public void refreshNum() { 273 public void refreshNum() {
274 int num = 0; 274 int num = 0;
275 for (ImageBean imageBean : list) { 275 for (ImageBean imageBean : list) {
276 if (imageBean.getCuts() != null && imageBean.getCuts().size() > 0) { 276 if (imageBean.getCuts() != null && imageBean.getCuts().size() > 0) {
277 for (ImageBean.Cut cut : imageBean.getCuts()) { 277 for (ImageBean.Cut cut : imageBean.getCuts()) {
278 if (cut.isSelect()) { 278 if (cut.isSelect()) {
279 num++; 279 num++;
280 } 280 }
281 } 281 }
282 } 282 }
283 } 283 }
284 String btnText = type == 0 ? "保存错题" : "录入题目"; 284 String btnText = type == 0 ? "保存错题" : "录入题目";
285 if (num > 0) { 285 if (num > 0) {
286 binding.tvSave.setEnabled(true); 286 binding.tvSave.setEnabled(true);
287 binding.tvSave.setBackgroundResource(R.drawable.bg_soild_blue_5); 287 binding.tvSave.setBackgroundResource(R.drawable.bg_soild_blue_5);
288 binding.tvSave.setText(btnText + "(" + num + ")"); 288 binding.tvSave.setText(btnText + "(" + num + ")");
289 } else { 289 } else {
290 binding.tvSave.setEnabled(false); 290 binding.tvSave.setEnabled(false);
291 binding.tvSave.setBackgroundResource(R.drawable.bg_soild_blue_light_5); 291 binding.tvSave.setBackgroundResource(R.drawable.bg_soild_blue_light_5);
292 binding.tvSave.setText(btnText); 292 binding.tvSave.setText(btnText);
293 } 293 }
294 } 294 }
295 295
296 @Override 296 @Override
297 public void onClick(View v) { 297 public void onClick(View v) {
298 switch (v.getId()) { 298 switch (v.getId()) {
299 case R.id.iv_back: 299 case R.id.iv_back:
300 back(); 300 back();
301 break; 301 break;
302 case R.id.rl_next: 302 case R.id.rl_next:
303 if (binding.viewPager.getCurrentItem() + 1 < list.size()) { 303 if (binding.viewPager.getCurrentItem() + 1 < list.size()) {
304 binding.viewPager.setCurrentItem(binding.viewPager.getCurrentItem() + 1); 304 binding.viewPager.setCurrentItem(binding.viewPager.getCurrentItem() + 1);
305 } 305 }
306 break; 306 break;
307 case R.id.rl_previous: 307 case R.id.rl_previous:
308 if (binding.viewPager.getCurrentItem() != 0) { 308 if (binding.viewPager.getCurrentItem() != 0) {
309 binding.viewPager.setCurrentItem(binding.viewPager.getCurrentItem() - 1); 309 binding.viewPager.setCurrentItem(binding.viewPager.getCurrentItem() - 1);
310 } 310 }
311 break; 311 break;
312 case R.id.ll_edit: 312 case R.id.ll_edit:
313 Intent intent = new Intent(context, ImageEditActivity.class); 313 Intent intent = new Intent(context, ImageEditActivity.class);
314 intent.putExtra("path", list.get(binding.viewPager.getCurrentItem()).getPath()); 314 intent.putExtra("path", list.get(binding.viewPager.getCurrentItem()).getPath());
315 startActivityForResult(intent, 1001); 315 startActivityForResult(intent, 1001);
316 break; 316 break;
317 case R.id.tv_photo: 317 case R.id.tv_photo:
318 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 318 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
319 //确保有相机来处理Intent 319 //确保有相机来处理Intent
320 filePath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg"; 320 filePath = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
321 File photoFile = new File(filePath); 321 File photoFile = new File(filePath);
322 if (photoFile != null) { 322 if (photoFile != null) {
323 //适配Android 7.0文件权限,通过FileProvider创建一个content类型的Uri 323 //适配Android 7.0文件权限,通过FileProvider创建一个content类型的Uri
324 Uri photoUri = FileProvider.getUriForFile(activity, "com.hjx.parent.fileprovider", photoFile); 324 Uri photoUri = FileProvider.getUriForFile(activity, "com.hjx.parent.fileprovider", photoFile);
325 takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 325 takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
326 takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri); 326 takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
327 activity.startActivityForResult(takePictureIntent, 1002); 327 activity.startActivityForResult(takePictureIntent, 1002);
328 } 328 }
329 break; 329 break;
330 case R.id.tv_add: 330 case R.id.tv_add:
331 Intent intent1 = new Intent(context, ImageSelectActivity.class); 331 Intent intent1 = new Intent(context, ImageSelectActivity.class);
332 intent1.putExtra("path", list.get(binding.viewPager.getCurrentItem()).getPath()); 332 intent1.putExtra("path", list.get(binding.viewPager.getCurrentItem()).getPath());
333 intent1.putExtra("source", list.get(binding.viewPager.getCurrentItem()).source);
333 intent1.putExtra("source", list.get(binding.viewPager.getCurrentItem()).source); 334 startActivityForResult(intent1, 1001);
334 startActivityForResult(intent1, 1001); 335 break;
335 break; 336 case R.id.tv_save:
336 case R.id.tv_save: 337 List<TopicBean> topicBeans = new ArrayList<>();
337 List<TopicBean> topicBeans = new ArrayList<>(); 338 for (ImageBean imageBean : list) {
338 for (ImageBean imageBean : list) { 339 if (imageBean.getCuts() != null && imageBean.getCuts().size() > 0) {
339 if (imageBean.getCuts() != null && imageBean.getCuts().size() > 0) { 340 for (ImageBean.Cut cut : imageBean.getCuts()) {
340 for (ImageBean.Cut cut : imageBean.getCuts()) { 341 if (cut.isSelect()) {
341 if (cut.isSelect()) { 342 TopicBean bean = new TopicBean();
342 TopicBean bean = new TopicBean(); 343 String path = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
343 String path = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg"; 344 BitmapUtils.saveBitmap(cut.getBitmap(), path);
344 BitmapUtils.saveBitmap(cut.getBitmap(), path); 345 bean.setPath(path);
345 bean.setPath(path); 346 topicBeans.add(bean);
346 topicBeans.add(bean); 347 }
347 } 348 }
348 } 349 }
349 } 350 }
350 } 351 save(topicBeans);
351 save(topicBeans); 352 break;
352 break; 353 }
353 } 354 }
354 } 355
355 356 private void save(List<TopicBean> topicBeans) {
356 private void save(List<TopicBean> topicBeans) { 357 if (type == 0) {
357 if (type == 0) { 358 ErrorInputDialog dialog = new ErrorInputDialog(this, topicBeans);
358 ErrorInputDialog dialog = new ErrorInputDialog(this, topicBeans); 359 dialog.show();
359 dialog.show(); 360 } else {
360 } else { 361 List<String> paths = new ArrayList<>();
361 List<String> paths = new ArrayList<>(); 362 for (TopicBean it: topicBeans) {
362 for (TopicBean it: topicBeans) { 363 paths.add(it.getPath());
363 paths.add(it.getPath()); 364 }
364 } 365 if (addHomeworkDialog == null) {
365 if (addHomeworkDialog == null) { 366 addHomeworkDialog = new AddHomeworkDialog(this);
366 addHomeworkDialog = new AddHomeworkDialog(this); 367 }
367 } 368 addHomeworkDialog.show(paths, student -> {
368 addHomeworkDialog.show(paths, student -> { 369 Intent intent = new Intent(context, AddSuccessActivity.class);
369 Intent intent = new Intent(context, AddSuccessActivity.class); 370 intent.putExtra("type", type);
370 intent.putExtra("type", type); 371 intent.putExtra("studentJson", new Gson().toJson(student));
371 intent.putExtra("studentJson", new Gson().toJson(student)); 372 startActivity(intent);
372 startActivity(intent); 373 finish();
373 finish(); 374 });
374 }); 375 }
375 } 376 }
376 } 377
377 378 @Override
378 @Override 379 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
379 protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { 380 super.onActivityResult(requestCode, resultCode, data);
380 super.onActivityResult(requestCode, resultCode, data); 381 if (requestCode == 1001) {
381 if (requestCode == 1001) { 382 if (resultCode == 1002) {
382 if (resultCode == 1002) { 383 if (list.size() > 1) {
383 if (list.size() > 1) { 384 list.remove(binding.viewPager.getCurrentItem());
384 list.remove(binding.viewPager.getCurrentItem()); 385 imageAdapter.notifyItemRemoved(binding.viewPager.getCurrentItem());
385 imageAdapter.notifyItemRemoved(binding.viewPager.getCurrentItem()); 386 binding.tvTitle.setText((binding.viewPager.getCurrentItem() + 1) + "/" + list.size());
386 binding.tvTitle.setText((binding.viewPager.getCurrentItem() + 1) + "/" + list.size()); 387 refreshNum();
387 refreshNum(); 388 } else {
388 } else { 389 finish();
389 finish(); 390 }
390 } 391 } else if (resultCode == 1003) {
391 } else if (resultCode == 1003) { 392 int position = binding.viewPager.getCurrentItem();
392 int position = binding.viewPager.getCurrentItem(); 393 String src = list.get(position).source;
393 String src = list.get(position).source; 394 list.remove(position);
394 list.remove(position); 395 String path = data.getStringExtra("path");
395 String path = data.getStringExtra("path"); 396 ImageBean imageBean = new ImageBean();
396 ImageBean imageBean = new ImageBean(); 397 imageBean.setPath(path);
397 imageBean.setPath(path); 398 imageBean.source = src;
398 imageBean.source = src; 399 list.add(position, imageBean);
399 list.add(position, imageBean); 400 imageAdapter.notifyItemChanged(position);
400 imageAdapter.notifyItemChanged(position); 401 clearText();
401 clearText(); 402 refreshNum();
402 refreshNum(); 403 } else if (resultCode == 1004) {
403 } else if (resultCode == 1004) { 404 Rect rect = data.getParcelableExtra("cut");
404 Rect rect = data.getParcelableExtra("cut"); 405 if (rect != null) {
405 if (rect != null) { 406 int position = binding.viewPager.getCurrentItem();
406 int position = binding.viewPager.getCurrentItem(); 407 ImageBean.Cut cut = new ImageBean.Cut();
407 ImageBean.Cut cut = new ImageBean.Cut(); 408 cut.setRect1(rect);
408 cut.setRect1(rect); 409 cut.setSelect(false);
409 cut.setSelect(false); 410 if (list.get(position).getCuts() != null) {
410 if (list.get(position).getCuts() != null) { 411 list.get(position).getCuts().add(cut);
411 list.get(position).getCuts().add(cut); 412 } else {
412 } else { 413 List<ImageBean.Cut> cuts =new ArrayList<>();
413 List<ImageBean.Cut> cuts =new ArrayList<>(); 414 cuts.add(cut);
414 cuts.add(cut); 415 list.get(position).setCuts(cuts);
415 list.get(position).setCuts(cuts); 416 }
416 } 417 imageAdapter.notifyItemChanged(position);
417 imageAdapter.notifyItemChanged(position); 418 refreshNum();
418 refreshNum(); 419 }
419 } 420 } else if (resultCode == 1005) {
420 } else if (resultCode == 1005) { 421 int i = data.getIntExtra("position", 0);
421 int i = data.getIntExtra("position", 0); 422 int position = binding.viewPager.getCurrentItem();
422 int position = binding.viewPager.getCurrentItem(); 423 Rect rect = data.getParcelableExtra("cut");
423 Rect rect = data.getParcelableExtra("cut"); 424 if (rect != null) {
424 if (rect != null) { 425 ImageBean.Cut cut = new ImageBean.Cut();
425 ImageBean.Cut cut = new ImageBean.Cut(); 426 cut.setRect1(rect);
426 cut.setRect1(rect); 427 cut.setSelect(false);
427 cut.setSelect(false); 428 list.get(position).getCuts().remove(i);
428 list.get(position).getCuts().remove(i); 429 list.get(position).getCuts().add(i, cut);
429 list.get(position).getCuts().add(i, cut); 430 imageAdapter.notifyItemChanged(position);
430 imageAdapter.notifyItemChanged(position); 431 refreshNum();
431 refreshNum(); 432 } else {
432 } else { 433 list.get(position).getCuts().remove(i);
433 list.get(position).getCuts().remove(i); 434 imageAdapter.notifyItemChanged(position);
434 imageAdapter.notifyItemChanged(position); 435 refreshNum();
435 refreshNum(); 436 }
436 } 437 }
437 } 438 } else if (requestCode == 1002 && resultCode == RESULT_OK && !TextUtils.isEmpty(filePath)) {
438 } else if (requestCode == 1002 && resultCode == RESULT_OK && !TextUtils.isEmpty(filePath)) { 439 Bitmap b = BitmapUtils.compress(BitmapFactory.decodeFile(filePath));
439 Bitmap b = BitmapUtils.compress(BitmapFactory.decodeFile(filePath)); 440 String path = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg";
440 String path = context.getExternalFilesDir("images").getPath() + "/" + String.valueOf(System.currentTimeMillis()) + CommonUtil.getStr() + ".jpg"; 441 CommonUtil.saveBitmapToUri(b, path);
441 CommonUtil.saveBitmapToUri(b, path); 442 int position = binding.viewPager.getCurrentItem();
442 int position = binding.viewPager.getCurrentItem(); 443 list.remove(position);
443 list.remove(position); 444 ImageBean imageBean = new ImageBean();
444 ImageBean imageBean = new ImageBean(); 445 imageBean.setPath(path);
445 imageBean.setPath(path); 446 imageBean.source = path;
446 imageBean.source = path; 447 list.add(position, imageBean);
447 list.add(position, imageBean); 448 imageAdapter.notifyItemChanged(position);
448 imageAdapter.notifyItemChanged(position); 449 clearText();
449 clearText(); 450 refreshNum();
450 refreshNum(); 451 }
451 } 452 }
452 } 453
453 454 private void back() {
454 private void back() { 455 showTipDialog("温馨提示", "是否确认退出?", "取消", "确定", new TipDialog.TipDialogInterface() {
455 showTipDialog("温馨提示", "是否确认退出?", "取消", "确定", new TipDialog.TipDialogInterface() { 456 @Override
456 @Override 457 public void onConfirm(Dialog dialog) {
457 public void onConfirm(Dialog dialog) { 458 dialog.dismiss();
458 dialog.dismiss(); 459 finish();
459 finish(); 460 }
460 } 461
461 462 @Override
462 @Override 463 public void onCancel(Dialog dialog) {
463 public void onCancel(Dialog dialog) { 464 dialog.dismiss();
464 dialog.dismiss(); 465 }
465 } 466 });
466 }); 467 }
467 } 468
468 469 @Override
469 @Override 470 public boolean onKeyDown(int keyCode, KeyEvent event) {
470 public boolean onKeyDown(int keyCode, KeyEvent event) { 471 if (keyCode == KeyEvent.KEYCODE_BACK) {
471 if (keyCode == KeyEvent.KEYCODE_BACK) { 472 back();
472 back(); 473 return true;
473 return true; 474 }
474 } 475 return super.onKeyDown(keyCode, event);
475 return super.onKeyDown(keyCode, event); 476 }
476 } 477 }
477 } 478
app/src/main/java/com/hjx/parent/ImageSelectActivity.java
1 package com.hjx.parent; 1 package com.hjx.parent;
2 2
3 import android.app.Dialog; 3 import android.app.Dialog;
4 import android.content.Intent; 4 import android.content.Intent;
5 import android.graphics.Bitmap; 5 import android.graphics.Bitmap;
6 import android.graphics.BitmapFactory; 6 import android.graphics.BitmapFactory;
7 import android.graphics.Canvas; 7 import android.graphics.Canvas;
8 import android.graphics.Paint; 8 import android.graphics.Paint;
9 import android.graphics.Rect; 9 import android.graphics.Rect;
10 import android.os.Bundle; 10 import android.os.Bundle;
11 import android.os.SystemClock; 11 import android.os.SystemClock;
12 import android.util.Log; 12 import android.util.Log;
13 import android.view.KeyEvent; 13 import android.view.KeyEvent;
14 import android.view.MotionEvent; 14 import android.view.MotionEvent;
15 import android.view.View; 15 import android.view.View;
16 import android.widget.RelativeLayout; 16 import android.widget.RelativeLayout;
17 17
18 import com.hjx.parent.databinding.ActivityImageSelectBinding; 18 import com.hjx.parent.databinding.ActivityImageSelectBinding;
19 import com.hjx.parent.dialog.PhotoViewDialog;
19 import com.hjx.parent.dialog.PhotoViewDialog; 20 import com.hjx.parent.dialog.TipDialog;
20 import com.hjx.parent.dialog.TipDialog; 21 import com.prws.common.bean.CutPicBean;
21 import com.prws.common.bean.CutPicBean; 22 import com.prws.common.bean.ImageBean;
22 import com.prws.common.bean.ImageBean; 23 import com.prws.common.utils.BitmapUtils;
23 import com.prws.common.utils.BitmapUtils; 24 import com.prws.common.utils.CommonUtil;
24 import com.prws.common.utils.CommonUtil; 25 import com.prws.common.widget.MarkSizeView;
25 import com.prws.common.widget.MarkSizeView; 26
26 27 public class ImageSelectActivity extends BaseActivity<ActivityImageSelectBinding> {
27 public class ImageSelectActivity extends BaseActivity<ActivityImageSelectBinding> { 28 private Bitmap bitmap;
28 private Bitmap bitmap; 29 Rect rect;
29 Rect rect; 30 private double widthFold, heightFold;
30 private double widthFold, heightFold; 31 private Bitmap backGroundBitmap;
31 private Bitmap backGroundBitmap; 32 private int bitmapWidth, bitmapHeight;
32 private int bitmapWidth, bitmapHeight; 33 private Rect select;
33 private Rect select; 34 private boolean isSelect = false;
34 private boolean isSelect = false; 35
35 36 @Override
36 @Override 37 public void initView(Bundle savedInstanceState) {
37 public void initView(Bundle savedInstanceState) { 38 String path = getIntent().getStringExtra("path");
38 String path = getIntent().getStringExtra("path"); 39 bitmap = BitmapFactory.decodeFile(path);
39 bitmap = BitmapFactory.decodeFile(path); 40 showImage();
40 showImage(); 41 binding.markView.setmOnClickListener(new MarkSizeView.onClickListener() {
41 binding.markView.setmOnClickListener(new MarkSizeView.onClickListener() { 42 @Override
42 @Override 43 public void onConfirm(Rect markedArea) {
43 public void onConfirm(Rect markedArea) { 44 if (isSelect) {
44 if (isSelect) { 45 binding.markView.setBackGroundBitmap(backGroundBitmap);
45 binding.markView.setBackGroundBitmap(backGroundBitmap); 46 isSelect = false;
46 isSelect = false; 47 }
47 } 48 int markSizeViewWidth = binding.markView.getWidth();
48 int markSizeViewWidth = binding.markView.getWidth(); 49 int markSizeHeight = binding.markView.getHeight();
49 int markSizeHeight = binding.markView.getHeight(); 50 backGroundBitmap = binding.markView.getBackGroundBitmap();
50 backGroundBitmap = binding.markView.getBackGroundBitmap(); 51 bitmapWidth = backGroundBitmap.getWidth();
51 bitmapWidth = backGroundBitmap.getWidth(); 52 bitmapHeight = backGroundBitmap.getHeight();
52 bitmapHeight = backGroundBitmap.getHeight(); 53 widthFold = CommonUtil.div(bitmapWidth, markSizeViewWidth, 2);
53 widthFold = CommonUtil.div(bitmapWidth, markSizeViewWidth, 2); 54 heightFold = CommonUtil.div(bitmapHeight, markSizeHeight, 2);
54 heightFold = CommonUtil.div(bitmapHeight, markSizeHeight, 2); 55 Log.d(toString(), markedArea.toString());
55 Log.d(toString(), markedArea.toString()); 56 drawRectangles(markedArea);
56 drawRectangles(markedArea); 57 binding.markView.reset();
57 binding.markView.reset(); 58 }
58 } 59
59 60 @Override
60 @Override 61 public void onCancel() {
61 public void onCancel() { 62 rect = null;
62 rect = null; 63 }
63 } 64
64 65 @Override
65 @Override 66 public void onTouch() {
66 public void onTouch() { 67
67 68 }
68 } 69 });
69 }); 70 binding.tvSave.setOnClickListener(new View.OnClickListener() {
70 binding.tvSave.setOnClickListener(new View.OnClickListener() { 71 @Override
71 @Override 72 public void onClick(View v) {
72 public void onClick(View v) { 73 if (rect != null) {
73 if (rect != null) { 74 if (select == null) {
74 if (select == null) { 75 Intent intent = new Intent();
75 Intent intent = new Intent(); 76 intent.putExtra("cut", rect);
76 intent.putExtra("cut", rect); 77 setResult(1004, intent);
77 setResult(1004, intent); 78 finish();
78 finish(); 79 } else {
79 } else { 80 Intent intent = new Intent();
80 Intent intent = new Intent(); 81 intent.putExtra("cut", rect);
81 intent.putExtra("cut", rect); 82 intent.putExtra("position", getIntent().getIntExtra("position", 0));
82 intent.putExtra("position", getIntent().getIntExtra("position", 0)); 83 setResult(1005, intent);
83 setResult(1005, intent); 84 finish();
84 finish(); 85 }
85 } 86 } else {
86 } else { 87 showToast("未选择框题区域");
87 showToast("未选择框题区域"); 88 }
88 } 89 }
89 } 90 });
90 }); 91 binding.llDelete.setOnClickListener(new View.OnClickListener() {
91 binding.llDelete.setOnClickListener(new View.OnClickListener() { 92 @Override
92 @Override 93 public void onClick(View v) {
93 public void onClick(View v) { 94 if (select == null) {
94 if (select == null) { 95 finish();
95 finish(); 96 } else {
96 } else { 97 rect = null;
97 rect = null; 98 Intent intent = new Intent();
98 Intent intent = new Intent(); 99 intent.putExtra("cut", rect);
99 intent.putExtra("cut", rect); 100 intent.putExtra("position", getIntent().getIntExtra("position", 0));
100 intent.putExtra("position", getIntent().getIntExtra("position", 0)); 101 setResult(1005, intent);
101 setResult(1005, intent); 102 finish();
102 finish(); 103 }
103 } 104 }
104 } 105 });
105 }); 106 binding.ivBack.setOnClickListener(new View.OnClickListener() {
106 binding.ivBack.setOnClickListener(new View.OnClickListener() { 107 @Override
107 @Override 108 public void onClick(View v) {
108 public void onClick(View v) { 109 back();
109 back(); 110 }
110 } 111 });
112
113 String source = getIntent().getStringExtra("source");
114 binding.btnShowSource.setOnClickListener(v -> {
115 new PhotoViewDialog(this).show(source);
116 });
111 }); 117 }
112 118
113 String source = getIntent().getStringExtra("source"); 119 private void back() {
114 binding.btnShowSource.setOnClickListener(v -> { 120 showTipDialog("温馨提示", "是否确认放弃当前的编辑?", "取消", "确定", new TipDialog.TipDialogInterface() {
115 new PhotoViewDialog(this).show(source); 121 @Override
116 }); 122 public void onConfirm(Dialog dialog) {
117 } 123 dialog.dismiss();
118 124 finish();
119 private void back() { 125 }
120 showTipDialog("温馨提示", "是否确认放弃当前的编辑?", "取消", "确定", new TipDialog.TipDialogInterface() { 126
121 @Override 127 @Override
122 public void onConfirm(Dialog dialog) { 128 public void onCancel(Dialog dialog) {
123 dialog.dismiss(); 129 dialog.dismiss();
124 finish(); 130 }
125 } 131 });
126 132 }
127 @Override 133
128 public void onCancel(Dialog dialog) { 134 private void simulateClick(int x1, int x2, int y1, int y2) {
129 dialog.dismiss(); 135 long downTime = SystemClock.uptimeMillis();
130 } 136 final MotionEvent downEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_DOWN, x1, y1, 0);
131 }); 137 downTime += 1000;
132 } 138 final MotionEvent moveEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_MOVE, x2, y2, 0);
133 139 final MotionEvent upEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_UP, x2, y2, 0);
134 private void simulateClick(int x1, int x2, int y1, int y2) { 140 binding.markView.onTouchEvent(downEvent);
135 long downTime = SystemClock.uptimeMillis(); 141 binding.markView.onTouchEvent(moveEvent);
136 final MotionEvent downEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_DOWN, x1, y1, 0); 142 binding.markView.onTouchEvent(upEvent);
137 downTime += 1000; 143 downEvent.recycle();
138 final MotionEvent moveEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_MOVE, x2, y2, 0); 144 moveEvent.recycle();
139 final MotionEvent upEvent = MotionEvent.obtain(downTime, downTime, MotionEvent.ACTION_UP, x2, y2, 0); 145 upEvent.recycle();
140 binding.markView.onTouchEvent(downEvent); 146 }
141 binding.markView.onTouchEvent(moveEvent); 147
142 binding.markView.onTouchEvent(upEvent); 148 private void drawRectangles(Rect ints) {
143 downEvent.recycle(); 149 isSelect = true;
144 moveEvent.recycle(); 150 rect = new Rect(ints.left, ints.top, ints.right, ints.bottom);
145 upEvent.recycle(); 151 Log.d(toString(), ints.toString());
146 } 152 Rect rect = new Rect(CommonUtil.mulForInt(ints.left, widthFold), CommonUtil.mulForInt(ints.top, heightFold), CommonUtil.mulForInt(ints.right, widthFold), CommonUtil.mulForInt(ints.bottom, heightFold));
147 153 // Log.d(toString(),rect.toString());
148 private void drawRectangles(Rect ints) { 154 Bitmap mutableBitmap = backGroundBitmap.copy(Bitmap.Config.ARGB_8888, true);
149 isSelect = true; 155 Canvas canvas = new Canvas(mutableBitmap);
150 rect = new Rect(ints.left, ints.top, ints.right, ints.bottom); 156 //画矩形框
151 Log.d(toString(), ints.toString()); 157 Paint paint = new Paint();
152 Rect rect = new Rect(CommonUtil.mulForInt(ints.left, widthFold), CommonUtil.mulForInt(ints.top, heightFold), CommonUtil.mulForInt(ints.right, widthFold), CommonUtil.mulForInt(ints.bottom, heightFold)); 158 paint.setAntiAlias(true);
153 // Log.d(toString(),rect.toString()); 159 paint.setStyle(Paint.Style.FILL);//填充
154 Bitmap mutableBitmap = backGroundBitmap.copy(Bitmap.Config.ARGB_8888, true); 160 paint.setStrokeWidth(CommonUtil.dpToPx(this, 1)); //线的宽度
155 Canvas canvas = new Canvas(mutableBitmap); 161 paint.setColor(getColor(R.color.select_fill));
156 //画矩形框 162 canvas.drawRect(rect, paint);
157 Paint paint = new Paint(); 163 paint.setStyle(Paint.Style.STROKE);//不填充
158 paint.setAntiAlias(true); 164 paint.setColor(getColor(R.color.select_border));
159 paint.setStyle(Paint.Style.FILL);//填充 165 canvas.drawRect(rect, paint);
160 paint.setStrokeWidth(CommonUtil.dpToPx(this, 1)); //线的宽度 166 binding.markView.setBackGroundBitmap(mutableBitmap);
161 paint.setColor(getColor(R.color.select_fill)); 167 }
162 canvas.drawRect(rect, paint); 168
163 paint.setStyle(Paint.Style.STROKE);//不填充 169 private void showImage() {
164 paint.setColor(getColor(R.color.select_border)); 170 float imageHeight = bitmap.getHeight();
165 canvas.drawRect(rect, paint); 171 float imageWidth = bitmap.getWidth();
166 binding.markView.setBackGroundBitmap(mutableBitmap); 172 float viewHeight = CommonUtil.getScreenHeight(context) - CommonUtil.dpToPx(context, 250);
167 } 173 float viewWidth = CommonUtil.getScreenWidth(context) - CommonUtil.dpToPx(context, 60);
168 174 binding.markView.post(new Runnable() {
169 private void showImage() { 175 @Override
170 float imageHeight = bitmap.getHeight(); 176 public void run() {
171 float imageWidth = bitmap.getWidth(); 177 binding.markView.reset();
172 float viewHeight = CommonUtil.getScreenHeight(context) - CommonUtil.dpToPx(context, 250); 178 RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(binding.markView.getLayoutParams());
173 float viewWidth = CommonUtil.getScreenWidth(context) - CommonUtil.dpToPx(context, 60); 179 if (imageHeight / imageWidth > viewHeight / viewWidth) {
174 binding.markView.post(new Runnable() { 180 if (viewHeight > imageHeight) {
175 @Override 181 layoutParams.height = (int) imageHeight;
176 public void run() { 182 layoutParams.width = (int) imageWidth;
177 binding.markView.reset(); 183 } else {
178 RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(binding.markView.getLayoutParams()); 184 layoutParams.height = (int) viewHeight;
179 if (imageHeight / imageWidth > viewHeight / viewWidth) { 185 layoutParams.width = (int) ((float) (imageWidth / imageHeight) * viewHeight);
180 if (viewHeight > imageHeight) { 186 }
181 layoutParams.height = (int) imageHeight; 187 } else {
182 layoutParams.width = (int) imageWidth; 188 if (viewWidth > imageWidth) {
183 } else { 189 layoutParams.height = (int) imageHeight;
184 layoutParams.height = (int) viewHeight; 190 layoutParams.width = (int) imageWidth;
185 layoutParams.width = (int) ((float) (imageWidth / imageHeight) * viewHeight); 191 } else {
186 } 192 layoutParams.height = (int) ((float) (imageHeight / imageWidth) * viewWidth);
187 } else { 193 layoutParams.width = (int) viewWidth;
188 if (viewWidth > imageWidth) { 194 }
189 layoutParams.height = (int) imageHeight; 195 }
190 layoutParams.width = (int) imageWidth; 196 layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT);
191 } else { 197 binding.markView.setLayoutParams(layoutParams);
192 layoutParams.height = (int) ((float) (imageHeight / imageWidth) * viewWidth); 198 binding.markView.setBackGroundBitmap(bitmap);
193 layoutParams.width = (int) viewWidth; 199 binding.markView.reset();
194 } 200 select = getIntent().getParcelableExtra("rect");
195 } 201 if (select != null) {
196 layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT); 202 simulateClick(select.left, select.right, select.top, select.bottom);
197 binding.markView.setLayoutParams(layoutParams); 203 }
198 binding.markView.setBackGroundBitmap(bitmap); 204 }
199 binding.markView.reset(); 205 });
200 select = getIntent().getParcelableExtra("rect"); 206 }
201 if (select != null) { 207
202 simulateClick(select.left, select.right, select.top, select.bottom); 208 @Override
203 } 209 protected void onDestroy() {
204 } 210 if (backGroundBitmap != null) {
205 }); 211 backGroundBitmap.recycle();
206 } 212 backGroundBitmap = null;
207 213 }
208 @Override 214 if (bitmap != null) {
209 protected void onDestroy() { 215 bitmap.recycle();
210 if (backGroundBitmap != null) { 216 bitmap = null;
211 backGroundBitmap.recycle(); 217 }
212 backGroundBitmap = null; 218 super.onDestroy();
213 } 219 }
214 if (bitmap != null) { 220
215 bitmap.recycle(); 221 @Override
216 bitmap = null; 222 public boolean onKeyDown(int keyCode, KeyEvent event) {
217 } 223 if (keyCode == KeyEvent.KEYCODE_BACK) {
218 super.onDestroy(); 224 back();
219 } 225 return true;
220 226 }
221 @Override 227 return super.onKeyDown(keyCode, event);
222 public boolean onKeyDown(int keyCode, KeyEvent event) { 228 }
223 if (keyCode == KeyEvent.KEYCODE_BACK) { 229
224 back(); 230 @Override
225 return true; 231 protected ActivityImageSelectBinding getViewBinding() {
226 } 232 return ActivityImageSelectBinding.inflate(getLayoutInflater());
227 return super.onKeyDown(keyCode, event); 233 }
228 } 234 }
229 235
app/src/main/res/layout/activity_image_select.xml
1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 xmlns:tools="http://schemas.android.com/tools" 2 xmlns:tools="http://schemas.android.com/tools"
3 xmlns:xxx="http://schemas.android.com/apk/res-auto" 3 xmlns:xxx="http://schemas.android.com/apk/res-auto"
4 android:layout_width="match_parent" 4 android:layout_width="match_parent"
5 android:layout_height="match_parent" 5 android:layout_height="match_parent"
6 android:orientation="vertical" 6 android:orientation="vertical"
7 tools:ignore="MissingDefaultResource"> 7 tools:ignore="MissingDefaultResource">
8 8
9 <RelativeLayout 9 <RelativeLayout
10 android:layout_width="match_parent" 10 android:layout_width="match_parent"
11 android:layout_height="40dp" 11 android:layout_height="40dp"
12 android:background="@color/white"> 12 android:background="@color/white">
13 13
14 <TextView 14 <TextView
15 android:id="@+id/tv_title" 15 android:id="@+id/tv_title"
16 android:layout_width="wrap_content" 16 android:layout_width="wrap_content"
17 android:layout_height="wrap_content" 17 android:layout_height="wrap_content"
18 android:layout_centerInParent="true" 18 android:layout_centerInParent="true"
19 android:text="手动框选" 19 android:text="手动框选"
20 android:textColor="#333333" 20 android:textColor="#333333"
21 android:textSize="18sp" /> 21 android:textSize="18sp" />
22 22
23 <ImageView 23 <ImageView
24 android:id="@+id/iv_back" 24 android:id="@+id/iv_back"
25 android:layout_width="30dp" 25 android:layout_width="30dp"
26 android:layout_height="36dp" 26 android:layout_height="36dp"
27 android:layout_centerVertical="true" 27 android:layout_centerVertical="true"
28 android:layout_marginLeft="5dp" 28 android:layout_marginLeft="5dp"
29 android:padding="10dp" 29 android:padding="10dp"
30 android:src="@mipmap/icon_back" /> 30 android:src="@mipmap/icon_back" />
31
32 <TextView
33 android:id="@+id/btnShowSource"
34 android:layout_width="wrap_content"
35 android:layout_height="wrap_content"
36 android:layout_alignParentRight="true"
37 android:layout_centerVertical="true"
38 android:layout_marginRight="15dp"
39 android:text="查看原图"
40 android:textColor="#333333"
41 android:textSize="14sp" />
31 42 </RelativeLayout>
32 <TextView 43
33 android:id="@+id/btnShowSource" 44 <RelativeLayout
34 android:layout_width="wrap_content" 45 android:layout_width="match_parent"
35 android:layout_height="wrap_content" 46 android:layout_height="match_parent"
36 android:layout_alignParentRight="true" 47 android:background="@color/white">
37 android:layout_centerVertical="true" 48
38 android:layout_marginRight="15dp" 49 <RelativeLayout
39 android:text="查看原图" 50 android:layout_width="match_parent"
40 android:textColor="#333333" 51 android:layout_height="match_parent"
41 android:textSize="14sp" /> 52 android:layout_above="@+id/rl_bottom"
42 </RelativeLayout> 53 android:layout_marginLeft="15dp"
43 54 android:layout_marginTop="35dp"
44 <RelativeLayout 55 android:layout_marginRight="15dp"
45 android:layout_width="match_parent" 56 android:layout_marginBottom="45dp">
46 android:layout_height="match_parent" 57
47 android:background="@color/white"> 58 <com.prws.common.widget.MarkSizeView
48 59 android:id="@+id/mark_view"
49 <RelativeLayout 60 android:layout_width="wrap_content"
50 android:layout_width="match_parent" 61 android:layout_height="wrap_content"
51 android:layout_height="match_parent" 62 android:layout_centerInParent="true"
52 android:layout_above="@+id/rl_bottom" 63 xxx:markedColor="@color/select_fill"
53 android:layout_marginLeft="15dp" 64 xxx:strokeWidth="1dp"
54 android:layout_marginTop="35dp" 65 xxx:strokesColor="@color/select_border"
55 android:layout_marginRight="15dp" 66 xxx:vertexColor="@color/select_border"
56 android:layout_marginBottom="45dp"> 67 xxx:vertexWidth="12dp" />
57 68 </RelativeLayout>
58 <com.prws.common.widget.MarkSizeView 69
59 android:id="@+id/mark_view" 70 <RelativeLayout
60 android:layout_width="wrap_content" 71 android:id="@+id/rl_bottom"
61 android:layout_height="wrap_content" 72 android:layout_width="match_parent"
62 android:layout_centerInParent="true" 73 android:layout_height="70dp"
63 xxx:markedColor="@color/select_fill" 74 android:layout_alignParentBottom="true"
64 xxx:strokeWidth="1dp" 75 android:background="@color/white">
65 xxx:strokesColor="@color/select_border" 76
66 xxx:vertexColor="@color/select_border" 77
67 xxx:vertexWidth="12dp" /> 78 <LinearLayout
68 </RelativeLayout> 79 android:id="@+id/ll_delete"
69 80 android:layout_width="wrap_content"
70 <RelativeLayout 81 android:layout_height="wrap_content"
71 android:id="@+id/rl_bottom" 82 android:layout_centerVertical="true"
72 android:layout_width="match_parent" 83 android:layout_marginLeft="15dp"
73 android:layout_height="70dp" 84 android:orientation="vertical">
74 android:layout_alignParentBottom="true" 85
75 android:background="@color/white"> 86 <ImageView
76 87 android:layout_width="25dp"
77 88 android:layout_height="25dp"
78 <LinearLayout 89 android:layout_gravity="center_horizontal"
79 android:id="@+id/ll_delete" 90 android:src="@mipmap/ic_delete" />
80 android:layout_width="wrap_content" 91
81 android:layout_height="wrap_content" 92 <TextView
82 android:layout_centerVertical="true" 93 android:layout_width="wrap_content"
83 android:layout_marginLeft="15dp" 94 android:layout_height="wrap_content"
84 android:orientation="vertical"> 95 android:layout_gravity="center_horizontal"
85 96 android:layout_marginTop="5dp"
86 <ImageView 97 android:text="删除"
87 android:layout_width="25dp" 98 android:textSize="11sp" />
88 android:layout_height="25dp" 99 </LinearLayout>
89 android:layout_gravity="center_horizontal" 100
90 android:src="@mipmap/ic_delete" /> 101 <TextView
91 102 android:id="@+id/tv_save"
92 <TextView 103 android:layout_width="280dp"
93 android:layout_width="wrap_content" 104 android:layout_height="40dp"
94 android:layout_height="wrap_content" 105 android:layout_alignParentRight="true"
95 android:layout_gravity="center_horizontal" 106 android:layout_centerVertical="true"
96 android:layout_marginTop="5dp" 107 android:layout_marginRight="15dp"
97 android:text="删除" 108 android:background="@drawable/bg_soild_blue_5"
98 android:textSize="11sp" /> 109 android:gravity="center"
99 </LinearLayout> 110 android:text="完成"
100 111 android:textColor="@color/white"
101 <TextView 112 android:textSize="18sp" />
102 android:id="@+id/tv_save" 113 </RelativeLayout>
103 android:layout_width="280dp" 114 </RelativeLayout>
104 android:layout_height="40dp" 115 </LinearLayout>
app/src/main/res/layout/dialog_add_homework.xml
1 <FrameLayout 1 <FrameLayout
2 xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:android="http://schemas.android.com/apk/res/android"
3 xmlns:app="http://schemas.android.com/apk/res-auto" 3 xmlns:app="http://schemas.android.com/apk/res-auto"
4 xmlns:tools="http://schemas.android.com/tools" 4 xmlns:tools="http://schemas.android.com/tools"
5 android:layout_width="match_parent" 5 android:layout_width="match_parent"
6 android:layout_height="match_parent" 6 android:layout_height="match_parent"
7 tools:ignore="HardcodedText,ContentDescription,UselessParent" > 7 tools:ignore="HardcodedText,ContentDescription,UselessParent" >
8 8
9 <LinearLayout 9 <LinearLayout
10 android:orientation="vertical" 10 android:orientation="vertical"
11 android:background="@drawable/shape_radius_top_10" 11 android:background="@drawable/shape_radius_top_10"
12 android:layout_marginTop="80dp" 12 android:layout_gravity="bottom"
13 android:layout_width="match_parent" 13 android:layout_width="match_parent"
14 android:layout_height="match_parent"> 14 android:layout_height="wrap_content">
15 15
16 <FrameLayout 16 <FrameLayout
17 android:layout_marginTop="8dp" 17 android:layout_marginTop="8dp"
18 android:layout_marginBottom="8dp" 18 android:layout_marginBottom="8dp"
19 android:layout_width="match_parent" 19 android:layout_width="match_parent"
20 android:layout_height="wrap_content"> 20 android:layout_height="wrap_content">
21 21
22 <TextView 22 <TextView
23 android:id="@+id/tvTitle" 23 android:id="@+id/tvTitle"
24 android:text="录入作业" 24 android:text="录入作业"
25 android:textSize="17sp" 25 android:textSize="17sp"
26 android:textStyle="bold" 26 android:textStyle="bold"
27 android:layout_gravity="center" 27 android:layout_gravity="center"
28 android:textColor="@color/text_title" 28 android:textColor="@color/text_title"
29 android:layout_width="wrap_content" 29 android:layout_width="wrap_content"
30 android:layout_height="wrap_content" /> 30 android:layout_height="wrap_content" />
31 31
32 <ImageView 32 <ImageView
33 android:id="@+id/btnClose" 33 android:id="@+id/btnClose"
34 android:padding="12dp" 34 android:padding="12dp"
35 android:src="@mipmap/ic_close" 35 android:src="@mipmap/ic_close"
36 android:layout_gravity="end|center_vertical" 36 android:layout_gravity="end|center_vertical"
37 android:layout_width="35dp" 37 android:layout_width="35dp"
38 android:layout_height="35dp" /> 38 android:layout_height="35dp" />
39 </FrameLayout> 39 </FrameLayout>
40 40
41 <androidx.core.widget.NestedScrollView 41 <androidx.core.widget.NestedScrollView
42 android:layout_width="match_parent" 42 android:layout_width="match_parent"
43 android:layout_height="match_parent"> 43 android:layout_height="match_parent">
44 <LinearLayout 44 <LinearLayout
45 android:orientation="vertical" 45 android:orientation="vertical"
46 android:layout_marginTop="-20dp" 46 android:layout_marginTop="-20dp"
47 android:layout_width="match_parent" 47 android:layout_width="match_parent"
48 android:layout_height="wrap_content"> 48 android:layout_height="wrap_content">
49 49
50 <TextView 50 <TextView
51 android:id="@+id/tvStu" 51 android:id="@+id/tvStu"
52 android:layout_marginTop="20dp" 52 android:layout_marginTop="20dp"
53 android:layout_width="wrap_content" 53 android:layout_width="wrap_content"
54 android:layout_height="wrap_content" 54 android:layout_height="wrap_content"
55 android:layout_marginHorizontal="15dp" 55 android:layout_marginHorizontal="15dp"
56 android:text="学生" 56 android:text="学生"
57 android:textColor="@color/text_title" 57 android:textColor="@color/text_title"
58 android:textSize="14sp" 58 android:textSize="14sp"
59 android:textStyle="bold" /> 59 android:textStyle="bold" />
60 60
61 <androidx.appcompat.widget.AppCompatSpinner 61 <androidx.appcompat.widget.AppCompatSpinner
62 android:id="@+id/spStudent" 62 android:id="@+id/spStudent"
63 style="@style/customSpinnerStyle" 63 style="@style/customSpinnerStyle"
64 android:layout_width="match_parent" 64 android:layout_width="match_parent"
65 android:layout_height="40dp" 65 android:layout_height="40dp"
66 android:layout_marginTop="10dp" 66 android:layout_marginTop="10dp"
67 android:layout_marginHorizontal="15dp" 67 android:layout_marginHorizontal="15dp"
68 android:background="@drawable/selector_for_input_spinner" 68 android:background="@drawable/selector_for_input_spinner"
69 android:popupBackground="@drawable/shape_for_input_spinner" 69 android:popupBackground="@drawable/shape_for_input_spinner"
70 android:scrollbars="none" /> 70 android:scrollbars="none" />
71 71
72 <TextView 72 <TextView
73 android:layout_width="wrap_content" 73 android:layout_width="wrap_content"
74 android:layout_height="wrap_content" 74 android:layout_height="wrap_content"
75 android:layout_marginHorizontal="15dp" 75 android:layout_marginHorizontal="15dp"
76 android:layout_marginTop="20dp" 76 android:layout_marginTop="20dp"
77 android:text="年级" 77 android:text="年级"
78 android:textColor="@color/text_title" 78 android:textColor="@color/text_title"
79 android:textSize="14sp" 79 android:textSize="14sp"
80 android:textStyle="bold" /> 80 android:textStyle="bold" />
81 81
82 <androidx.appcompat.widget.AppCompatSpinner 82 <androidx.appcompat.widget.AppCompatSpinner
83 android:id="@+id/spGrade" 83 android:id="@+id/spGrade"
84 style="@style/customSpinnerStyle" 84 style="@style/customSpinnerStyle"
85 android:layout_width="match_parent" 85 android:layout_width="match_parent"
86 android:layout_height="40dp" 86 android:layout_height="40dp"
87 android:layout_marginTop="10dp" 87 android:layout_marginTop="10dp"
88 android:layout_marginHorizontal="15dp" 88 android:layout_marginHorizontal="15dp"
89 android:background="@drawable/selector_for_input_spinner" 89 android:background="@drawable/selector_for_input_spinner"
90 android:popupBackground="@drawable/shape_for_input_spinner" 90 android:popupBackground="@drawable/shape_for_input_spinner"
91 android:scrollbars="none" /> 91 android:scrollbars="none" />
92 92
93 <TextView 93 <TextView
94 android:layout_width="wrap_content" 94 android:layout_width="wrap_content"
95 android:layout_height="wrap_content" 95 android:layout_height="wrap_content"
96 android:layout_marginHorizontal="15dp" 96 android:layout_marginHorizontal="15dp"
97 android:layout_marginTop="20dp" 97 android:layout_marginTop="20dp"
98 android:text="学期" 98 android:text="学期"
99 android:textColor="@color/text_title" 99 android:textColor="@color/text_title"
100 android:textSize="14sp" 100 android:textSize="14sp"
101 android:textStyle="bold" /> 101 android:textStyle="bold" />
102 102
103 <androidx.appcompat.widget.AppCompatSpinner 103 <androidx.appcompat.widget.AppCompatSpinner
104 android:id="@+id/spTerm" 104 android:id="@+id/spTerm"
105 style="@style/customSpinnerStyle" 105 style="@style/customSpinnerStyle"
106 android:layout_width="match_parent" 106 android:layout_width="match_parent"
107 android:layout_height="40dp" 107 android:layout_height="40dp"
108 android:layout_marginTop="10dp" 108 android:layout_marginTop="10dp"
109 android:layout_marginHorizontal="15dp" 109 android:layout_marginHorizontal="15dp"
110 android:background="@drawable/selector_for_input_spinner" 110 android:background="@drawable/selector_for_input_spinner"
111 android:entries="@array/grade_array" 111 android:entries="@array/grade_array"
112 android:popupBackground="@drawable/shape_for_input_spinner" 112 android:popupBackground="@drawable/shape_for_input_spinner"
113 android:scrollbars="none" /> 113 android:scrollbars="none" />
114 114
115 <TextView 115 <TextView
116 android:layout_width="wrap_content" 116 android:layout_width="wrap_content"
117 android:layout_height="wrap_content" 117 android:layout_height="wrap_content"
118 android:layout_marginHorizontal="15dp" 118 android:layout_marginHorizontal="15dp"
119 android:layout_marginTop="20dp" 119 android:layout_marginTop="20dp"
120 android:text="科目" 120 android:text="科目"
121 android:textColor="@color/text_title" 121 android:textColor="@color/text_title"
122 android:textSize="14sp" 122 android:textSize="14sp"
123 android:textStyle="bold" /> 123 android:textStyle="bold" />
124 124
125 <androidx.appcompat.widget.AppCompatSpinner 125 <androidx.appcompat.widget.AppCompatSpinner
126 android:id="@+id/spSubject" 126 android:id="@+id/spSubject"
127 style="@style/customSpinnerStyle" 127 style="@style/customSpinnerStyle"
128 android:layout_width="match_parent" 128 android:layout_width="match_parent"
129 android:layout_height="40dp" 129 android:layout_height="40dp"
130 android:layout_marginTop="10dp" 130 android:layout_marginTop="10dp"
131 android:layout_marginHorizontal="15dp" 131 android:layout_marginHorizontal="15dp"
132 android:background="@drawable/selector_for_input_spinner" 132 android:background="@drawable/selector_for_input_spinner"
133 android:popupBackground="@drawable/shape_for_input_spinner" 133 android:popupBackground="@drawable/shape_for_input_spinner"
134 android:scrollbars="none" /> 134 android:scrollbars="none" />
135 135
136 <TextView 136 <TextView
137 android:layout_width="wrap_content" 137 android:layout_width="wrap_content"
138 android:layout_height="wrap_content" 138 android:layout_height="wrap_content"
139 android:layout_marginHorizontal="15dp" 139 android:layout_marginHorizontal="15dp"
140 android:layout_marginTop="20dp" 140 android:layout_marginTop="20dp"
141 android:text="日期" 141 android:text="日期"
142 android:textColor="@color/text_title" 142 android:textColor="@color/text_title"
143 android:textSize="14sp" 143 android:textSize="14sp"
144 android:textStyle="bold" /> 144 android:textStyle="bold" />
145 145
146 <TextView 146 <TextView
147 android:id="@+id/tvDate" 147 android:id="@+id/tvDate"
148 tools:text="2024-09-18" 148 tools:text="2024-09-18"
149 android:textSize="16sp" 149 android:textSize="16sp"
150 android:textColor="#333" 150 android:textColor="#333"
151 android:gravity="center_vertical" 151 android:gravity="center_vertical"
152 android:paddingHorizontal="16dp" 152 android:paddingHorizontal="16dp"
153 android:layout_width="match_parent" 153 android:layout_width="match_parent"
154 android:layout_height="40dp" 154 android:layout_height="40dp"
155 android:layout_marginTop="10dp" 155 android:layout_marginTop="10dp"
156 android:layout_marginHorizontal="15dp" 156 android:layout_marginHorizontal="15dp"
157 android:background="@drawable/selector_for_input_spinner" /> 157 android:background="@drawable/selector_for_input_spinner" />
158 158
159 <TextView 159 <TextView
160 android:layout_width="wrap_content" 160 android:layout_width="wrap_content"
161 android:layout_height="wrap_content" 161 android:layout_height="wrap_content"
162 android:layout_marginHorizontal="15dp" 162 android:layout_marginHorizontal="15dp"
163 android:layout_marginTop="20dp" 163 android:layout_marginTop="20dp"
164 android:text="作业名称" 164 android:text="作业名称"
165 android:textColor="@color/text_title" 165 android:textColor="@color/text_title"
166 android:textSize="14sp" 166 android:textSize="14sp"
167 android:textStyle="bold" /> 167 android:textStyle="bold" />
168 168
169 <EditText 169 <EditText
170 android:id="@+id/etName" 170 android:id="@+id/etName"
171 android:layout_width="match_parent" 171 android:layout_width="match_parent"
172 android:layout_height="40dp" 172 android:layout_height="40dp"
173 android:layout_marginTop="10dp" 173 android:layout_marginTop="10dp"
174 android:layout_marginHorizontal="15dp" 174 android:layout_marginHorizontal="15dp"
175 android:background="@drawable/shape_for_input_spinner" 175 android:background="@drawable/shape_for_input_spinner"
176 android:fillViewport="true" 176 android:fillViewport="true"
177 android:gravity="center_vertical" 177 android:gravity="center_vertical"
178 android:maxLength="50" 178 android:maxLength="50"
179 android:paddingHorizontal="16dp" 179 android:paddingHorizontal="16dp"
180 android:textColor="@color/text_title" 180 android:textColor="@color/text_title"
181 android:textSize="13sp" 181 android:textSize="13sp"
182 android:inputType="text" 182 android:inputType="text"
183 tools:ignore="Autofill,LabelFor" /> 183 tools:ignore="Autofill,LabelFor" />
184 184
185 <TextView 185 <TextView
186 android:id="@+id/btnConfirm" 186 android:id="@+id/btnConfirm"
187 android:text="确认录入" 187 android:text="确认录入"
188 android:gravity="center" 188 android:gravity="center"
189 android:textSize="16sp" 189 android:textSize="16sp"
190 android:textColor="@color/white" 190 android:textColor="@color/white"
191 android:background="@drawable/shape_radius_5" 191 android:background="@drawable/shape_radius_5"
192 android:backgroundTint="#1C90F3" 192 android:backgroundTint="#1C90F3"
193 android:layout_gravity="center_horizontal" 193 android:layout_gravity="center_horizontal"
194 android:layout_marginVertical="24dp" 194 android:layout_marginVertical="24dp"
195 android:layout_width="224dp" 195 android:layout_width="224dp"
196 android:layout_height="36dp"/> 196 android:layout_height="36dp"/>
197 </LinearLayout> 197 </LinearLayout>
198 </androidx.core.widget.NestedScrollView> 198 </androidx.core.widget.NestedScrollView>
199 199
200 </LinearLayout> 200 </LinearLayout>
201 </FrameLayout> 201 </FrameLayout>