Commit 74ad0e0b authored by YONG-LIN SU's avatar YONG-LIN SU

新增 拍照存證照片預覽功能及顯示車牌辨識結果

parent f657a352
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetDropDown">
<runningDeviceTargetSelectedWithDropDown>
<Target>
<type value="RUNNING_DEVICE_TARGET" />
<deviceKey>
<Key>
<type value="SERIAL_NUMBER" />
<value value="JCAXB7655018EJ6" />
</Key>
</deviceKey>
</Target>
</runningDeviceTargetSelectedWithDropDown>
<timeTargetWasSelectedWithDropDown value="2022-08-01T01:49:20.422744100Z" />
</component>
</project>
\ No newline at end of file
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
<entry key="..\:/AndroidStudioProject/newparkapp/app/src/main/res/layout/recycler_view_space_item.xml" value="0.14947916666666666" /> <entry key="..\:/AndroidStudioProject/newparkapp/app/src/main/res/layout/recycler_view_space_item.xml" value="0.14947916666666666" />
<entry key="..\:/AndroidStudioProject/newparkapp/app/src/main/res/layout/recycler_view_user_item.xml" value="0.18645833333333334" /> <entry key="..\:/AndroidStudioProject/newparkapp/app/src/main/res/layout/recycler_view_user_item.xml" value="0.18645833333333334" />
<entry key="..\:/AndroidStudioProject/newparkapp/app/src/main/res/layout/recycler_view_vehicle_type_item.xml" value="0.14947916666666666" /> <entry key="..\:/AndroidStudioProject/newparkapp/app/src/main/res/layout/recycler_view_vehicle_type_item.xml" value="0.14947916666666666" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/drawable/ic_texture_black_24dp.xml" value="0.2985" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_main.xml" value="0.34375" /> <entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_main.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t01_bulletin_board.xml" value="0.34375" /> <entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t01_bulletin_board.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t01_import_db.xml" value="0.34375" /> <entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t01_import_db.xml" value="0.34375" />
...@@ -27,6 +28,8 @@ ...@@ -27,6 +28,8 @@
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_select_space.xml" value="0.34375" /> <entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_select_space.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_select_vehicle_type.xml" value="0.34375" /> <entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_select_vehicle_type.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_start.xml" value="0.34375" /> <entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t02_start.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/activity_t03_img_viewer.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/card_view_image_plate_number_item.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/recycler_view_bulletin_board_item.xml" value="0.34375" /> <entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/recycler_view_bulletin_board_item.xml" value="0.34375" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/recycler_view_db_table_item.xml" value="0.33" /> <entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/recycler_view_db_table_item.xml" value="0.33" />
<entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/recycler_view_item.xml" value="0.34375" /> <entry key="..\:/Users/pp931/Desktop/RD/Projects/NewParkApp/app/src/main/res/layout/recycler_view_item.xml" value="0.34375" />
......
...@@ -27,6 +27,12 @@ ...@@ -27,6 +27,12 @@
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.AppCompat.Light.NoActionBar" android:theme="@style/Theme.AppCompat.Light.NoActionBar"
tools:targetApi="31"> tools:targetApi="31">
<activity
android:name=".T03CumulativeActivity"
android:exported="false" />
<activity
android:name=".T03ImgViewerActivity"
android:exported="false" />
<activity <activity
android:name=".view.T02KeyInPlateNumberActivity" android:name=".view.T02KeyInPlateNumberActivity"
android:exported="false" /> android:exported="false" />
......
package ecom.android.newparkapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class T03CumulativeActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_t03_cumulative);
}
}
\ No newline at end of file
package ecom.android.newparkapp;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.view.ViewCompat;
import androidx.databinding.DataBindingUtil;
import androidx.viewpager2.widget.ViewPager2;
import android.os.Bundle;
import java.util.List;
import ecom.android.newparkapp.adapter.ImgViewerAdapter;
import ecom.android.newparkapp.entity.CasePhoto;
import ecom.android.newparkapp.repository.InfoRepository;
import ecom.android.newparkapp.databinding.ActivityT03ImgViewerBinding;
public class T03ImgViewerActivity extends AppCompatActivity {
private ActivityT03ImgViewerBinding dataBinding;
private String billingNumber2;
private InfoRepository infoRepository;
private ImgViewerAdapter imgViewerAdapter;
private List<CasePhoto> casePhotos;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dataBinding = DataBindingUtil.setContentView(this, R.layout.activity_t03_img_viewer);
billingNumber2 = getIntent().getStringExtra("BillingNumber2");
if (billingNumber2.trim().isEmpty() || billingNumber2.length() == 0){
return;
}
infoRepository = new InfoRepository(getApplication());
casePhotos = infoRepository.casePhotoDao.loadAllByIds(new String[]{billingNumber2});
imgViewerAdapter = new ImgViewerAdapter(getString(R.string.no_plate_message));
imgViewerAdapter.submitList(casePhotos);
initLayout();
}
private void initLayout(){
dataBinding.showPhoto.setClipToPadding(false);
dataBinding.showPhoto.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL);
dataBinding.showPhoto.setAdapter(imgViewerAdapter);
/*換頁動畫效果--------------------------------------------------------------------*/
dataBinding.showPhoto.setPadding(45, 0, 45, 0);
dataBinding.showPhoto.setOffscreenPageLimit(3);
final float MIN_SCALE = 0.85f;
final float MIN_ALPHA = 0.8f;//0.5f
final float pageMargin = 0;
final float pageOffset = 40;
dataBinding.showPhoto.setPageTransformer((view, position) -> {
//大小、透明度變化
int pageWidth = view.getWidth();
int pageHeight = view.getHeight();
if (position < -1) { // [-Infinity,-1)
view.setAlpha(0f);
} else if (position <= 1) { // [-1,1]
float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));
float vertMargin = pageHeight * (1 - scaleFactor) / 2;
float horzMargin = pageWidth * (1 - scaleFactor) / 2;
if (position < 0) {
view.setTranslationX(horzMargin - vertMargin / 2);
} else {
view.setTranslationX(-horzMargin + vertMargin / 2);
}
view.setScaleX(scaleFactor);
view.setScaleY(scaleFactor);
view.setAlpha(MIN_ALPHA +
(scaleFactor - MIN_SCALE) /
(1 - MIN_SCALE) * (1 - MIN_ALPHA));
} else {
view.setAlpha(0f);
}
//左右照片偏移量變化
float myOffset = position * -(2 * pageOffset + pageMargin);
if (dataBinding.showPhoto.getOrientation() == ViewPager2.ORIENTATION_HORIZONTAL) {
if (ViewCompat.getLayoutDirection(dataBinding.showPhoto) == ViewCompat.LAYOUT_DIRECTION_RTL) {
view.setTranslationX(-myOffset);
} else {
view.setTranslationX(myOffset);
}
} else {
view.setTranslationY(myOffset);
}
});
}
}
\ No newline at end of file
package ecom.android.newparkapp.adapter;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.LayoutInflater;
import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.DiffUtil;
import androidx.recyclerview.widget.ListAdapter;
import androidx.recyclerview.widget.RecyclerView;
import java.io.File;
import ecom.android.newparkapp.databinding.CardViewImagePlateNumberItemBinding;
import ecom.android.newparkapp.entity.CasePhoto;
public class ImgViewerAdapter extends ListAdapter<CasePhoto, ImgViewerAdapter.ImgViewerViewHolder> {
private String noPlateString = "";
public ImgViewerAdapter(String noPlateString){
super(casePhotoItemCallback);
this.noPlateString = noPlateString;
}
@NonNull
@Override
public ImgViewerViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
CardViewImagePlateNumberItemBinding cardViewImagePlateNumberItemBinding = CardViewImagePlateNumberItemBinding.inflate(LayoutInflater.from(parent.getContext()),parent,false);
return new ImgViewerViewHolder(cardViewImagePlateNumberItemBinding, noPlateString);
}
@Override
public void onBindViewHolder(@NonNull ImgViewerViewHolder holder, int position) {
holder.setBinding(getItem(position));
}
public static final DiffUtil.ItemCallback<CasePhoto> casePhotoItemCallback = new DiffUtil.ItemCallback<CasePhoto>() {
@Override
public boolean areItemsTheSame(@NonNull CasePhoto oldItem, @NonNull CasePhoto newItem) {
return oldItem.id == newItem.id;
}
@Override
public boolean areContentsTheSame(@NonNull CasePhoto oldItem, @NonNull CasePhoto newItem) {
return oldItem.photoPath.equals(newItem.photoPath);
}
};
static class ImgViewerViewHolder extends RecyclerView.ViewHolder {
private final CardViewImagePlateNumberItemBinding dataBinding;
private final String noPlateString;
ImgViewerViewHolder(CardViewImagePlateNumberItemBinding dataBinding, String noPlateString) {
super(dataBinding.getRoot());
this.dataBinding = dataBinding;
this.noPlateString = noPlateString;
}
void setBinding(CasePhoto casePhoto){
File file = new File(casePhoto.photoPath);
if (!file.isFile()){
return;
}
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap bitmap = BitmapFactory.decodeFile(file.getPath(), options);
// 設置圖片
dataBinding.imageId2.setImageBitmap(bitmap);
dataBinding.imageId2.setScaleType(ImageView.ScaleType.FIT_XY);
// 設置檔案名稱
dataBinding.imgTextView.setText(file.getName());
// 設置車牌辨識結果
dataBinding.plateNumberTextView.setText(casePhoto.plateNumber.trim().length() == 0 ? noPlateString : casePhoto.plateNumber);
}
}
}
...@@ -12,7 +12,7 @@ import androidx.room.PrimaryKey; ...@@ -12,7 +12,7 @@ import androidx.room.PrimaryKey;
childColumns = "case_billing_number2", childColumns = "case_billing_number2",
onDelete = CASCADE) ) onDelete = CASCADE) )
public class CasePhoto { public class CasePhoto {
@PrimaryKey @PrimaryKey(autoGenerate = true)
public int id; public int id;
@ColumnInfo(name = "case_billing_number2") @ColumnInfo(name = "case_billing_number2")
......
...@@ -25,6 +25,7 @@ import java.util.List; ...@@ -25,6 +25,7 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import ecom.android.newparkapp.R; import ecom.android.newparkapp.R;
import ecom.android.newparkapp.T03ImgViewerActivity;
import ecom.android.newparkapp.entity.Case; import ecom.android.newparkapp.entity.Case;
import ecom.android.newparkapp.entity.Road; import ecom.android.newparkapp.entity.Road;
import ecom.android.newparkapp.entity.Space; import ecom.android.newparkapp.entity.Space;
...@@ -77,7 +78,7 @@ public class T02StartActivity extends AppCompatActivity { ...@@ -77,7 +78,7 @@ public class T02StartActivity extends AppCompatActivity {
dataBinding.btnNewPage.setOnClickListener(v -> btnNewPageOnClicked()); dataBinding.btnNewPage.setOnClickListener(v -> btnNewPageOnClicked());
dataBinding.btnPageDown.setOnClickListener(v -> btnPageDownOnClicked()); dataBinding.btnPageDown.setOnClickListener(v -> btnPageDownOnClicked());
dataBinding.btnPageUp.setOnClickListener(v -> btnPageUpOnClicked()); dataBinding.btnPageUp.setOnClickListener(v -> btnPageUpOnClicked());
dataBinding.btnPhotoCount.setOnClickListener(v -> btnPhotoCountOnClicked());
dataBinding.btnStartBack.setOnClickListener(v -> {finish();}); dataBinding.btnStartBack.setOnClickListener(v -> {finish();});
} }
...@@ -230,4 +231,15 @@ public class T02StartActivity extends AppCompatActivity { ...@@ -230,4 +231,15 @@ public class T02StartActivity extends AppCompatActivity {
private void btnPageUpOnClicked(){ private void btnPageUpOnClicked(){
t02StartViewModel.pageUp(); t02StartViewModel.pageUp();
} }
private void btnPhotoCountOnClicked(){
Case tempCase = t02StartViewModel.getCurrentCase().getValue();
if (tempCase == null || tempCase.photoCount == 0 || tempCase.billingNumber2.trim().isEmpty()){
return;
}
Intent intent = new Intent();
intent.setClass(this, T03ImgViewerActivity.class);
intent.putExtra("BillingNumber2", tempCase.billingNumber2);
startActivity(intent);
}
} }
\ No newline at end of file
...@@ -171,13 +171,13 @@ public class T02StartViewModel extends AndroidViewModel { ...@@ -171,13 +171,13 @@ public class T02StartViewModel extends AndroidViewModel {
// 加入清單 // 加入清單
cases.add(tempCase); cases.add(tempCase);
caseCursor.setValue(caseCursor.getValue() + 1); caseCursor.postValue(caseCursor.getValue() + 1);
}); });
break; break;
case LIST: case LIST:
// 跳至新單 // 跳至新單
currentCase.postValue(newCase()); currentCase.postValue(newCase());
caseCursor.setValue(caseCursor.getValue() + 1); caseCursor.postValue(caseCursor.getValue() + 1);
break; break;
case CHANGED: case CHANGED:
......
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="160dp"
android:height="120dp"
android:tint="#FFFFFF"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:fillColor="#FF000000"
android:pathData="M19.51,3.08L3.08,19.51c0.09,0.34 0.27,0.65 0.51,0.9 0.25,0.24 0.56,0.42 0.9,0.51L20.93,4.49c-0.19,-0.69 -0.73,-1.23 -1.42,-1.41zM11.88,3L3,11.88v2.83L14.71,3h-2.83zM5,3c-1.1,0 -2,0.9 -2,2v2l4,-4L5,3zM19,21c0.55,0 1.05,-0.22 1.41,-0.59 0.37,-0.36 0.59,-0.86 0.59,-1.41v-2l-4,4h2zM9.29,21h2.83L21,12.12L21,9.29L9.29,21z," />
</vector>
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".T03CumulativeActivity">
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<layout>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingTop="10dp"
android:paddingBottom="10dp"
tools:context=".T03ImgViewerActivity">
<TextView
android:id="@+id/title_textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:textSize="26sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/show_photo"
android:layout_width="0dp"
android:layout_height="0dp"
android:clipChildren="false"
android:clipToPadding="false"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<layout>
<androidx.cardview.widget.CardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="6dp"
android:background="#FFFFFF"
android:padding="6dp">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/img_textView"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/colorPrimaryDark"
android:gravity="center"
android:text="照片名稱"
android:textColor="#D6D6D6"
android:textSize="26sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/plate_number_textView"
android:layout_width="match_parent"
android:layout_height="40dp"
android:background="@color/white"
android:text="車牌號碼"
android:textAlignment="center"
android:textColor="@color/black"
android:textSize="24sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toBottomOf="@+id/img_textView" />
<ImageView
android:id="@+id/imageId2"
android:layout_width="match_parent"
android:layout_height="0dp"
android:scaleType="center"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.486"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/plate_number_textView"
app:srcCompat="@drawable/ic_texture_black_24dp"
tools:ignore="ContentDescription" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</layout>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment