@ -0,0 +1,15 @@ |
|||
*.iml |
|||
.gradle |
|||
/local.properties |
|||
/.idea/caches |
|||
/.idea/libraries |
|||
/.idea/modules.xml |
|||
/.idea/workspace.xml |
|||
/.idea/navEditor.xml |
|||
/.idea/assetWizardSettings.xml |
|||
.DS_Store |
|||
/build |
|||
/captures |
|||
.externalNativeBuild |
|||
.cxx |
|||
local.properties |
|||
@ -0,0 +1,3 @@ |
|||
# Default ignored files |
|||
/shelf/ |
|||
/workspace.xml |
|||
@ -0,0 +1 @@ |
|||
SwingArmAPP_SandBlast |
|||
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project version="4"> |
|||
<component name="CompilerConfiguration"> |
|||
<bytecodeTargetLevel target="21" /> |
|||
</component> |
|||
</project> |
|||
@ -0,0 +1,10 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project version="4"> |
|||
<component name="deploymentTargetDropDown"> |
|||
<value> |
|||
<entry key="app"> |
|||
<State /> |
|||
</entry> |
|||
</value> |
|||
</component> |
|||
</project> |
|||
@ -0,0 +1,18 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project version="4"> |
|||
<component name="deploymentTargetSelector"> |
|||
<selectionStates> |
|||
<SelectionState runConfigName="app"> |
|||
<option name="selectionMode" value="DROPDOWN" /> |
|||
<DropdownSelection timestamp="2025-08-06T08:52:08.177881100Z"> |
|||
<Target type="DEFAULT_BOOT"> |
|||
<handle> |
|||
<DeviceId pluginId="PhysicalDevice" identifier="serial=36c5dec7" /> |
|||
</handle> |
|||
</Target> |
|||
</DropdownSelection> |
|||
<DialogSelection /> |
|||
</SelectionState> |
|||
</selectionStates> |
|||
</component> |
|||
</project> |
|||
@ -0,0 +1,20 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project version="4"> |
|||
<component name="GradleMigrationSettings" migrationVersion="1" /> |
|||
<component name="GradleSettings"> |
|||
<option name="linkedExternalProjectsSettings"> |
|||
<GradleProjectSettings> |
|||
<option name="testRunner" value="CHOOSE_PER_TEST" /> |
|||
<option name="externalProjectPath" value="$PROJECT_DIR$" /> |
|||
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" /> |
|||
<option name="modules"> |
|||
<set> |
|||
<option value="$PROJECT_DIR$" /> |
|||
<option value="$PROJECT_DIR$/app" /> |
|||
</set> |
|||
</option> |
|||
<option name="resolveExternalAnnotations" value="false" /> |
|||
</GradleProjectSettings> |
|||
</option> |
|||
</component> |
|||
</project> |
|||
@ -0,0 +1,10 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project version="4"> |
|||
<component name="ProjectMigrations"> |
|||
<option name="MigrateToGradleLocalJavaHome"> |
|||
<set> |
|||
<option value="$PROJECT_DIR$" /> |
|||
</set> |
|||
</option> |
|||
</component> |
|||
</project> |
|||
@ -0,0 +1,9 @@ |
|||
<project version="4"> |
|||
<component name="ExternalStorageConfigurationManager" enabled="true" /> |
|||
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK"> |
|||
<output url="file://$PROJECT_DIR$/build/classes" /> |
|||
</component> |
|||
<component name="ProjectType"> |
|||
<option name="id" value="Android" /> |
|||
</component> |
|||
</project> |
|||
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project version="4"> |
|||
<component name="RenderSettings"> |
|||
<option name="showDecorations" value="true" /> |
|||
</component> |
|||
</project> |
|||
@ -0,0 +1,17 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project version="4"> |
|||
<component name="RunConfigurationProducerService"> |
|||
<option name="ignoredProducers"> |
|||
<set> |
|||
<option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" /> |
|||
<option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" /> |
|||
<option value="com.intellij.execution.junit.PatternConfigurationProducer" /> |
|||
<option value="com.intellij.execution.junit.TestInClassConfigurationProducer" /> |
|||
<option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" /> |
|||
<option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" /> |
|||
<option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" /> |
|||
<option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" /> |
|||
</set> |
|||
</option> |
|||
</component> |
|||
</project> |
|||
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project version="4"> |
|||
<component name="VcsDirectoryMappings"> |
|||
<mapping directory="$PROJECT_DIR$" vcs="Git" /> |
|||
</component> |
|||
</project> |
|||
@ -0,0 +1 @@ |
|||
江南摆臂带喷砂机app |
|||
@ -0,0 +1 @@ |
|||
/build |
|||
@ -0,0 +1,58 @@ |
|||
plugins { |
|||
id 'com.android.application' |
|||
} |
|||
|
|||
android { |
|||
namespace 'com.example.swingarmapp_sandblast' |
|||
compileSdk 35 |
|||
viewBinding |
|||
{ |
|||
enabled true |
|||
} |
|||
// //add this feature |
|||
dataBinding |
|||
{ |
|||
enabled true |
|||
} |
|||
defaultConfig { |
|||
applicationId "com.example.swingarmapp_sandblast" |
|||
minSdk 24 |
|||
targetSdk 35 |
|||
versionCode 1 |
|||
versionName "1.0" |
|||
|
|||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" |
|||
} |
|||
|
|||
buildTypes { |
|||
release { |
|||
minifyEnabled false |
|||
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' |
|||
} |
|||
} |
|||
buildFeatures{ |
|||
buildConfig true |
|||
} |
|||
compileOptions { |
|||
sourceCompatibility JavaVersion.VERSION_1_8 |
|||
targetCompatibility JavaVersion.VERSION_1_8 |
|||
} |
|||
} |
|||
|
|||
dependencies { |
|||
|
|||
implementation 'androidx.appcompat:appcompat:1.6.1' |
|||
implementation 'com.google.android.material:material:1.9.0' |
|||
implementation 'androidx.constraintlayout:constraintlayout:2.1.4' |
|||
testImplementation 'junit:junit:4.13.2' |
|||
androidTestImplementation 'androidx.test.ext:junit:1.1.5' |
|||
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' |
|||
implementation 'com.github.mik3y:usb-serial-for-android:3.7.0' |
|||
implementation 'com.google.protobuf:protobuf-java:4.27.2' |
|||
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.20") |
|||
implementation 'com.github.nodemedia:nodemediaclient-android:2.9.20' |
|||
implementation 'io.github.xmaihh:serialport:2.1.1' |
|||
|
|||
|
|||
|
|||
} |
|||
@ -0,0 +1,21 @@ |
|||
# Add project specific ProGuard rules here. |
|||
# You can control the set of applied configuration files using the |
|||
# proguardFiles setting in build.gradle. |
|||
# |
|||
# For more details, see |
|||
# http://developer.android.com/guide/developing/tools/proguard.html |
|||
|
|||
# If your project uses WebView with JS, uncomment the following |
|||
# and specify the fully qualified class name to the JavaScript interface |
|||
# class: |
|||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview { |
|||
# public *; |
|||
#} |
|||
|
|||
# Uncomment this to preserve the line number information for |
|||
# debugging stack traces. |
|||
#-keepattributes SourceFile,LineNumberTable |
|||
|
|||
# If you keep the line number information, uncomment this to |
|||
# hide the original source file name. |
|||
#-renamesourcefileattribute SourceFile |
|||
@ -0,0 +1,37 @@ |
|||
{ |
|||
"version": 3, |
|||
"artifactType": { |
|||
"type": "APK", |
|||
"kind": "Directory" |
|||
}, |
|||
"applicationId": "com.example.swingarmapp_sandblast", |
|||
"variantName": "release", |
|||
"elements": [ |
|||
{ |
|||
"type": "SINGLE", |
|||
"filters": [], |
|||
"attributes": [], |
|||
"versionCode": 1, |
|||
"versionName": "1.0", |
|||
"outputFile": "app-release.apk" |
|||
} |
|||
], |
|||
"elementType": "File", |
|||
"baselineProfiles": [ |
|||
{ |
|||
"minApi": 28, |
|||
"maxApi": 30, |
|||
"baselineProfiles": [ |
|||
"baselineProfiles/1/app-release.dm" |
|||
] |
|||
}, |
|||
{ |
|||
"minApi": 31, |
|||
"maxApi": 2147483647, |
|||
"baselineProfiles": [ |
|||
"baselineProfiles/0/app-release.dm" |
|||
] |
|||
} |
|||
], |
|||
"minSdkVersionForDexing": 24 |
|||
} |
|||
@ -0,0 +1,26 @@ |
|||
package com.example.swingarmapp_sandblast; |
|||
|
|||
import android.content.Context; |
|||
|
|||
import androidx.test.platform.app.InstrumentationRegistry; |
|||
import androidx.test.ext.junit.runners.AndroidJUnit4; |
|||
|
|||
import org.junit.Test; |
|||
import org.junit.runner.RunWith; |
|||
|
|||
import static org.junit.Assert.*; |
|||
|
|||
/** |
|||
* Instrumented test, which will execute on an Android device. |
|||
* |
|||
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a> |
|||
*/ |
|||
@RunWith(AndroidJUnit4.class) |
|||
public class ExampleInstrumentedTest { |
|||
@Test |
|||
public void useAppContext() { |
|||
// Context of the app under test.
|
|||
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); |
|||
assertEquals("com.example.rougheningapp", appContext.getPackageName()); |
|||
} |
|||
} |
|||
@ -0,0 +1,55 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" |
|||
xmlns:tools="http://schemas.android.com/tools"> |
|||
|
|||
<uses-feature android:name="android.hardware.camera" /> |
|||
<uses-feature android:name="android.hardware.camera.autofocus" /> |
|||
|
|||
|
|||
<uses-permission android:name="android.permission.INTERNET" /> |
|||
<uses-permission android:name="android.permission.CAMERA" /> |
|||
<uses-permission android:name="android.permission.RECORD_AUDIO" /> |
|||
<uses-permission android:name="android.permission.FLASHLIGHT" /> |
|||
<uses-permission android:name="android.permission.USB_PERMISSION" /> |
|||
|
|||
<uses-feature |
|||
android:name="android.hardware.usb.accessory" |
|||
android:required="false" /> |
|||
<uses-feature android:name="android.hardware.usb.host" /> |
|||
|
|||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> |
|||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> |
|||
<uses-permission android:name="android.permission.VIBRATE" /> |
|||
|
|||
<application |
|||
android:allowBackup="true" |
|||
android:dataExtractionRules="@xml/data_extraction_rules" |
|||
android:fullBackupContent="@xml/backup_rules" |
|||
|
|||
android:label="@string/app_name" |
|||
android:icon="@drawable/squrelogo" |
|||
android:supportsRtl="true" |
|||
android:theme="@style/Theme.RougheningApp" |
|||
tools:targetApi="31"> |
|||
<meta-data |
|||
android:name="com.google.android.actions" |
|||
android:resource="@xml/check_boxs" /> |
|||
|
|||
<activity |
|||
android:name=".MainActivity" |
|||
android:exported="true"> |
|||
<intent-filter> |
|||
<action android:name="android.intent.action.MAIN" /> |
|||
|
|||
<category android:name="android.intent.category.LAUNCHER" /> |
|||
|
|||
<action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> |
|||
</intent-filter> |
|||
|
|||
<meta-data |
|||
android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" |
|||
android:resource="@xml/device_filter" /> |
|||
</activity> |
|||
</application> |
|||
|
|||
</manifest> |
|||
@ -0,0 +1,45 @@ |
|||
syntax = "proto3"; |
|||
|
|||
option java_multiple_files = false; |
|||
option java_package = "com.example.swingarmapp_sandblast.models"; |
|||
|
|||
message ErrorDataInfo |
|||
{ |
|||
int32 Error_Value = 1; |
|||
bytes Error_Name=4; |
|||
} |
|||
|
|||
|
|||
message ErrorData |
|||
{ |
|||
int32 ErrorCode=1; |
|||
int32 Motor_1_Error=21; |
|||
int32 Motor_2_Error=22; |
|||
int32 Motor_3_Error=23; |
|||
int32 Motor_4_Error=24; |
|||
int32 Motor_5_Error=25; |
|||
int32 Motor_6_Error=26; |
|||
int32 Motor_7_Error=27; |
|||
} |
|||
|
|||
enum ComError //枚举消息类型 |
|||
{ |
|||
Mk32_SBus =0; //proto3版本中,首成员必须为0,成员不应有相同的值 |
|||
MK32_Serial =1; |
|||
MK32_InitialState =2; |
|||
TL720D =3; |
|||
|
|||
ZQ_CAN_ID1_LeftMotor =4; |
|||
ZQ_CAN_ID2_RightMotor =5; |
|||
ZQ_CAN_ID3_SwingMotor =6; |
|||
Force_Sensor =7; |
|||
Mfog40 =8; |
|||
Ultrasonic_Sensor =9; |
|||
|
|||
} |
|||
|
|||
//protoc --nanopb_out=. *.proto |
|||
|
|||
|
|||
|
|||
|
|||
@ -0,0 +1,2 @@ |
|||
# lock.options |
|||
IV_struct_define.Buff_Data max_size:30 fixed_length:true |
|||
@ -0,0 +1,22 @@ |
|||
syntax = "proto3"; |
|||
|
|||
option java_multiple_files = false; |
|||
option java_package = "com.example.swingarmapp_sandblast.models"; |
|||
|
|||
message IV_struct_define |
|||
{ |
|||
int32 LeftCompensation= 1;//发送100显示1° |
|||
int32 RightCompensation= 2;//发送100显示1° |
|||
int32 Robot_Move_Deri_Speed= 3;//发送100显示10m/min |
|||
int32 Robot_Gyro= 4;//发送100显示1° |
|||
int32 Distance_Sensor=5; //发送100显示10cm |
|||
int32 SystemError=6;//硬件通讯错误及按键未初始化错误 |
|||
int32 Left_Motor_Err=7;//左轮电机报警 |
|||
int32 Right_Motor_Err=8;//右轮电机报警 |
|||
int32 Swing_Motor_Err=9;//摆臂电机报警 |
|||
int32 Is_Online=10;//是否在线 |
|||
int32 Spara_Data_1=11;//备用数据1 |
|||
int32 Spara_Data_2=12;//备用数据2 |
|||
int32 Spara_Data_3=13;//备用数据3 |
|||
}; |
|||
|
|||
@ -0,0 +1,22 @@ |
|||
syntax = "proto3"; |
|||
option java_multiple_files = false; |
|||
option java_package = "com.example.swingarmapp_sandblast.models"; |
|||
message PV_struct_define{ |
|||
int32 Robot_Operation_Mode= 1; //操作模式 手动模式1 2 3 4 自动模式5 6 7 |
|||
int32 Robot_Move_Speed=2; //机器人移动速度 |
|||
int32 Robot_Change_Lane_Distance= 3; //换道距离 |
|||
int32 Robot_Swing_Speed= 4; //摆臂速度 |
|||
int32 Robot_symmetricalOrNot=5; //摆臂角度界面中的对称or非对称 1 对称 2 非对称 |
|||
int32 Robot_Swing_Range_Angle=6; //对称下的摆臂角度 |
|||
int32 Robot_asymmetricalAngleSetValue=7; //非对称条件下下 1左侧 2 右侧 |
|||
int32 Robot_backMode=8; //后退设置模式 1 打退交替 2 边打边退 |
|||
int32 Robot_Back_Distance= 9; //打退交替条件下的后退距离 |
|||
int32 Robot_Back_Speed=10; //边打边退条件下的后退速度 |
|||
int32 Robot_Press_Set= 11; //压力设置 |
|||
int32 Robot_Vertical_Adjust= 12; //竖直微调 |
|||
int32 Robot_Length_Homework=13; //自动模式下的作业长度 |
|||
int32 Robot_Width_Homework=14; //自动模式下的作业宽度 |
|||
int32 Robot_SandBalst_Encode_One=15; //喷砂机编码1 输入为空发1 |
|||
int32 Robot_SandBalst_Encode_Two=16; //喷砂机编码2 输入为空发2 |
|||
}; |
|||
|
|||
@ -0,0 +1,585 @@ |
|||
package com.example.swingarmapp_sandblast; |
|||
|
|||
import androidx.appcompat.app.AppCompatActivity; |
|||
import androidx.databinding.DataBindingUtil; |
|||
|
|||
import android.os.Bundle; |
|||
import android.text.Editable; |
|||
import android.text.InputFilter; |
|||
import android.text.TextUtils; |
|||
import android.text.TextWatcher; |
|||
import android.view.View; |
|||
import android.view.WindowManager; |
|||
import android.widget.Toast; |
|||
|
|||
import com.example.swingarmapp_sandblast.databinding.ActivityMainBinding; |
|||
import com.example.swingarmapp_sandblast.models.DisplayPV; |
|||
import com.example.swingarmapp_sandblast.models.DisplaySandBlast; |
|||
import com.example.swingarmapp_sandblast.services.DecimalDigitsInputFilter; |
|||
import com.example.swingarmapp_sandblast.services.ModbusCRC; |
|||
import com.example.swingarmapp_sandblast.services.MyDataHelper; |
|||
import com.example.swingarmapp_sandblast.services.PopupHelper; |
|||
import com.example.swingarmapp_sandblast.services.USBSerialPortHelper; |
|||
|
|||
import com.example.swingarmapp_sandblast.models.BspPV; |
|||
|
|||
import java.util.List; |
|||
import java.util.Timer; |
|||
import java.util.TimerTask; |
|||
|
|||
public class MainActivity extends AppCompatActivity { |
|||
|
|||
public ActivityMainBinding mainBinding;//通过Binding可以获取界面数据
|
|||
//USB 串口服务
|
|||
public USBSerialPortHelper serialPortHelper;//串口接收类
|
|||
private BspPV.PV_struct_define _toSendPV; |
|||
|
|||
Timer timer = new Timer(); |
|||
|
|||
public MyDataHelper myDataHelper = new MyDataHelper(this);//数据库类
|
|||
public PopupHelper popupHelper = new PopupHelper(this);//对话框类,把主界面实例传过去
|
|||
|
|||
public static byte[] stopgetAllChData = new byte[]{0x55, 0x66, 0x01, 0x01, 0x00, 0x00, 0x00, 0x42, 0x00, (byte) (0xf7 & 0xff), (byte) (0xe0 & 0xff)}; |
|||
public static int sendStopDataCount = 0; |
|||
public String _parameters_Call_Value = "1"; //默认1
|
|||
public String _Manual_Mode_Call_Value = "无"; // 默认为手动模式 无 模式值1-4
|
|||
public String _Auto_Mode_Call_Value = "未启用"; // 默认为未启用 模式值6 7
|
|||
public String workLength = "0"; //自动模式下作业长度----->变量存储
|
|||
|
|||
public String workWidth = "0"; ////自动模式下作业宽度----->变量存储
|
|||
|
|||
public int symmetricalOrNot = 1; //1对称 2非对称----->变量存储
|
|||
|
|||
public int asymmetricalAngleSetValue= 0 ; //非对称下的值 0 默认 1 左侧 2 右侧----->变量存储
|
|||
|
|||
public int backMode = 1 ; // 1 打退交替 2 边打边退----->变量存储
|
|||
|
|||
public String backSpeedSetValue = "5.0"; // 边打边退速度值----->变量存储
|
|||
public boolean isInputGroupActive = true; // 默认对称组激活 --->摆臂角度界面
|
|||
public boolean isFirstInputActive = true; // 默认第一个输入框激活--->后退界面
|
|||
|
|||
|
|||
|
|||
@Override |
|||
protected void onCreate(Bundle savedInstanceState) { |
|||
super.onCreate(savedInstanceState); |
|||
//设置全屏显示
|
|||
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); |
|||
mainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main); |
|||
mainBinding.MaintvVerticalAdjustTo32.setFilters(new InputFilter[]{new DecimalDigitsInputFilter()}); //editext 一位小数限制
|
|||
mainBinding.MaintvMoveSpeedTo32.setFilters(new InputFilter[]{new DecimalDigitsInputFilter() }); |
|||
|
|||
/* USB串口 控制区域*/ |
|||
serialPortHelper = new USBSerialPortHelper(this); |
|||
serialPortHelper.intialize(); |
|||
serialPortHelper.connect(); |
|||
|
|||
|
|||
// //程序初始化,读取数据库,进行界面显示
|
|||
myDataHelper.IntializeDataBase(); |
|||
String parame = mainBinding.MaintvParameterCallTo32.getText().toString(); //获取界面参数调用值
|
|||
//读取数据
|
|||
int paraIndex = Integer.parseInt(parame); |
|||
List<DisplayPV> pvList = myDataHelper.getDisplayData(paraIndex); //按id查询数据赋值给界面
|
|||
|
|||
mainBinding.MaintvSwingArmAngleTo32.setText(String.valueOf(pvList.get(0).getSwingArmAngle())); |
|||
mainBinding.MaintvSwingArmSpeedTo32.setText(String.valueOf(pvList.get(0).getSwingArmSpeed())); |
|||
mainBinding.MaintvBackDistanceTo32.setText(String.valueOf(pvList.get(0).getBackDistance())); |
|||
mainBinding.MaintvLaneChangeDistanceTo32.setText(String.valueOf(pvList.get(0).getLaneChangeDistance())); |
|||
mainBinding.MaintvPressTo32.setText(String.valueOf(pvList.get(0).getPressSet())); |
|||
mainBinding.MaintvVerticalAdjustTo32.setText(String.valueOf(pvList.get(0).getVerticalAdjust())); |
|||
backSpeedSetValue=String.valueOf(pvList.get(0).getBackSpeedValue()); |
|||
workLength=String.valueOf(pvList.get(0).getWorkLength()); |
|||
workWidth=String.valueOf(pvList.get(0).getWorkWidth()); |
|||
|
|||
/***读取喷砂机编码设置**/ |
|||
List<DisplaySandBlast>dsbList = myDataHelper.getDisplayData_sandBalst(); //按id查询数据赋值给界面
|
|||
mainBinding.MaintvSandCodeOneTo32.setText(String.valueOf(dsbList.get(0).getsand_encodeone())); |
|||
mainBinding.MaintvSandCodeTwoTo32.setText(String.valueOf(dsbList.get(0).getsand_encodetwo())); |
|||
|
|||
|
|||
|
|||
/*发往32*/ |
|||
timer.schedule(new TimerTask() { |
|||
@Override |
|||
public void run() { |
|||
// 使用 Handler 或 runOnUiThread 更新 UI
|
|||
runOnUiThread(new Runnable() { |
|||
@Override |
|||
public void run() { |
|||
// 更新 UI 的代码
|
|||
_toSendPV = BspPV.PV_struct_define.newBuilder() |
|||
.setRobotOperationMode(1) |
|||
.setRobotMoveSpeed(0) |
|||
.setRobotChangeLaneDistance(0) |
|||
.setRobotSwingSpeed(0) |
|||
.setRobotSymmetricalOrNot(1) |
|||
.setRobotSwingRangeAngle(0) |
|||
.setRobotAsymmetricalAngleSetValue(1) |
|||
.setRobotBackMode(1) |
|||
.setRobotBackDistance(0) |
|||
.setRobotBackSpeed(0) |
|||
.setRobotPressSet(0) |
|||
.setRobotVerticalAdjust(0) |
|||
.setRobotLengthHomework(0) |
|||
.setRobotWidthHomework(0) |
|||
.build(); |
|||
|
|||
|
|||
String MoveSpeedStr = mainBinding.MaintvMoveSpeedTo32.getText().toString(); |
|||
String ChangeLaneDistanceStr = mainBinding.MaintvLaneChangeDistanceTo32.getText().toString(); |
|||
String SwingSpeedStr = mainBinding.MaintvSwingArmSpeedTo32.getText().toString(); |
|||
String SwingRangeAngleStr = mainBinding.MaintvSwingArmAngleTo32.getText().toString(); |
|||
String BackDistanceStr = mainBinding.MaintvBackDistanceTo32.getText().toString(); |
|||
String PressStr = mainBinding.MaintvPressTo32.getText().toString(); |
|||
String VeticalAdjustStr = mainBinding.MaintvVerticalAdjustTo32.getText().toString(); |
|||
String SandBlastOneStr = mainBinding.MaintvSandCodeOneTo32.getText().toString(); |
|||
String SandBlastTwoStr = mainBinding.MaintvSandCodeTwoTo32.getText().toString(); |
|||
if(SandBlastOneStr.isEmpty() ){_toSendPV.toBuilder() |
|||
.setRobotSandBalstEncodeOne(1).build(); |
|||
} |
|||
else { |
|||
_toSendPV = _toSendPV.toBuilder() |
|||
.setRobotSandBalstEncodeOne((Integer.parseInt(String.valueOf(mainBinding.MaintvSandCodeOneTo32.getText())))).build(); |
|||
} |
|||
|
|||
if(SandBlastTwoStr.isEmpty() ){_toSendPV.toBuilder() |
|||
.setRobotSandBalstEncodeTwo(2).build(); |
|||
} |
|||
else { |
|||
_toSendPV = _toSendPV.toBuilder() |
|||
.setRobotSandBalstEncodeTwo((Integer.parseInt(String.valueOf(mainBinding.MaintvSandCodeTwoTo32.getText())))).build(); |
|||
} |
|||
|
|||
//移动速度
|
|||
try { |
|||
if( MoveSpeedStr.isEmpty() ) {_toSendPV = _toSendPV.toBuilder().setRobotMoveSpeed(1).build();} |
|||
else { _toSendPV = _toSendPV.toBuilder() |
|||
.setRobotMoveSpeed( (int) (Double.parseDouble(String.valueOf(mainBinding.MaintvMoveSpeedTo32.getText()))*10 )).build(); |
|||
} |
|||
} |
|||
catch (Exception e) |
|||
{ |
|||
|
|||
} |
|||
|
|||
//换道距离
|
|||
if( ChangeLaneDistanceStr.isEmpty() ) {_toSendPV = _toSendPV.toBuilder().setRobotChangeLaneDistance(1).build();} |
|||
else { _toSendPV = _toSendPV.toBuilder() |
|||
.setRobotChangeLaneDistance((Integer.parseInt(String.valueOf(mainBinding.MaintvLaneChangeDistanceTo32.getText())))).build();} |
|||
//摆臂速度
|
|||
if( SwingSpeedStr.isEmpty() ) {_toSendPV = _toSendPV.toBuilder().setRobotSwingSpeed(1).build();} |
|||
else { _toSendPV = _toSendPV.toBuilder() |
|||
.setRobotSwingSpeed((Integer.parseInt(String.valueOf(mainBinding.MaintvSwingArmSpeedTo32.getText())))).build();} |
|||
//摆臂角度
|
|||
if( SwingRangeAngleStr.isEmpty() ) {_toSendPV = _toSendPV.toBuilder().setRobotSwingRangeAngle(1).build();} |
|||
else { _toSendPV = _toSendPV.toBuilder() |
|||
.setRobotSwingRangeAngle((Integer.parseInt(String.valueOf(mainBinding.MaintvSwingArmAngleTo32.getText())))).build();} |
|||
|
|||
_toSendPV = _toSendPV.toBuilder().setRobotBackMode(backMode).build(); //1 打退交替 2 边打边退
|
|||
_toSendPV = _toSendPV.toBuilder().setRobotBackSpeed( (int) (Double.parseDouble(backSpeedSetValue)*10) ).build(); //边打边退的后退速度 *10
|
|||
_toSendPV = _toSendPV.toBuilder().setRobotSymmetricalOrNot(symmetricalOrNot).build(); //1 对称 2//非对称
|
|||
_toSendPV = _toSendPV.toBuilder().setRobotAsymmetricalAngleSetValue(asymmetricalAngleSetValue).build(); //非对称下左侧右侧值 1 左 2右
|
|||
_toSendPV = _toSendPV.toBuilder().setRobotLengthHomework(Integer.parseInt(workLength)).build(); //作业长度
|
|||
_toSendPV = _toSendPV.toBuilder().setRobotWidthHomework(Integer.parseInt(workWidth)).build(); //作业宽度
|
|||
|
|||
//后退距离
|
|||
try { |
|||
if( BackDistanceStr.isEmpty() ) {_toSendPV = _toSendPV.toBuilder().setRobotBackDistance(1).build();} |
|||
else { _toSendPV = _toSendPV.toBuilder() |
|||
.setRobotBackDistance( (int) (Double.parseDouble(String.valueOf(mainBinding.MaintvBackDistanceTo32.getText()))*10 )).build(); |
|||
} |
|||
} catch (Exception e) { |
|||
|
|||
} |
|||
try { |
|||
//压力设定
|
|||
if( PressStr.isEmpty() ) {_toSendPV = _toSendPV.toBuilder().setRobotPressSet(1).build();} |
|||
else { _toSendPV = _toSendPV.toBuilder() |
|||
.setRobotPressSet((Integer.parseInt(String.valueOf(mainBinding.MaintvPressTo32.getText())))).build();} |
|||
}catch (Exception e) { |
|||
|
|||
} |
|||
|
|||
//竖直微调--小数 *10
|
|||
try { |
|||
|
|||
if( VeticalAdjustStr.isEmpty() ) {_toSendPV = _toSendPV.toBuilder().setRobotVerticalAdjust(0).build();} |
|||
else { _toSendPV = _toSendPV.toBuilder() |
|||
.setRobotVerticalAdjust( (int) (Double.parseDouble(String.valueOf(mainBinding.MaintvVerticalAdjustTo32.getText()))*10 )) .build(); |
|||
|
|||
} |
|||
|
|||
} catch (Exception e) { |
|||
|
|||
} |
|||
|
|||
|
|||
//自动手动模式发送
|
|||
|
|||
if(_Manual_Mode_Call_Value.equals("未启用")) //手动模式未启用
|
|||
{ |
|||
//发送自动模式值
|
|||
if(_Auto_Mode_Call_Value.equals("水平")) |
|||
{ |
|||
_toSendPV = _toSendPV.toBuilder().setRobotOperationMode(6).build(); |
|||
} else if(_Auto_Mode_Call_Value.equals("平面")) { |
|||
_toSendPV = _toSendPV.toBuilder().setRobotOperationMode(7).build(); |
|||
} |
|||
|
|||
} |
|||
else if(_Auto_Mode_Call_Value.equals("未启用")) //自动模式未启用
|
|||
{ |
|||
//发送手动模式值
|
|||
if (_Manual_Mode_Call_Value.equals("无")) { |
|||
_toSendPV = _toSendPV.toBuilder().setRobotOperationMode(1).build(); |
|||
} else if (_Manual_Mode_Call_Value.equals("水平")) { |
|||
_toSendPV = _toSendPV.toBuilder().setRobotOperationMode(2).build(); |
|||
} else if (_Manual_Mode_Call_Value.equals("平面")) { |
|||
_toSendPV = _toSendPV.toBuilder().setRobotOperationMode(3).build(); |
|||
} else if (_Manual_Mode_Call_Value.equals("竖直向左")) { |
|||
_toSendPV = _toSendPV.toBuilder().setRobotOperationMode(4).build(); |
|||
} |
|||
else if (_Manual_Mode_Call_Value.equals("竖直向右")) { |
|||
_toSendPV = _toSendPV.toBuilder().setRobotOperationMode(5).build(); |
|||
} |
|||
} |
|||
|
|||
|
|||
|
|||
byte[] byteArray = _toSendPV.toByteArray(); |
|||
byte[] sendbyteArray = new byte[byteArray.length + 4]; |
|||
byte[] sendbyteArray3 = new byte[byteArray.length + 6]; |
|||
if (byteArray.length != 0) { |
|||
System.arraycopy(byteArray, 0, sendbyteArray, 4, byteArray.length); |
|||
} |
|||
sendbyteArray[0] = (byte) 0x55; |
|||
sendbyteArray[1] = (byte) 0x55; |
|||
sendbyteArray[2] = (byte) 0x01; |
|||
sendbyteArray[3] = (byte) 0x01; |
|||
|
|||
byte[] byteArray2 = ModbusCRC.calculateCRC(sendbyteArray); |
|||
|
|||
System.arraycopy(sendbyteArray, 0, sendbyteArray3, 0, sendbyteArray.length); |
|||
|
|||
System.arraycopy(byteArray2, 0, sendbyteArray3, sendbyteArray3.length - 2, 2); |
|||
|
|||
serialPortHelper.SendData(sendbyteArray3); |
|||
} |
|||
}); |
|||
} |
|||
}, 0, 1000); // 延迟 0 毫秒,每隔 1000 毫秒执行一次
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
//三个弹窗选择界面
|
|||
mainBinding.setManualModeBtn.setOnClickListener(new View.OnClickListener() { |
|||
@Override |
|||
public void onClick(View v) { |
|||
popupHelper.ManualModePopup(this); |
|||
} |
|||
}); |
|||
|
|||
mainBinding.setAutoModeBtn.setOnClickListener(new View.OnClickListener() { |
|||
@Override |
|||
public void onClick(View v) { |
|||
popupHelper.AutoModePopup(this); |
|||
} |
|||
}); |
|||
|
|||
mainBinding.setSwingArmAngleBtn.setOnClickListener(new View.OnClickListener() { |
|||
@Override |
|||
public void onClick(View view) { |
|||
popupHelper.SwingArmPopup(); |
|||
} |
|||
}); |
|||
|
|||
mainBinding.setBackDistanceBtn.setOnClickListener(new View.OnClickListener() { |
|||
@Override |
|||
public void onClick(View view) { |
|||
popupHelper.BackSetPopup(); |
|||
} |
|||
}); |
|||
|
|||
mainBinding.setcallParametersBtn.setOnClickListener(new View.OnClickListener() { |
|||
@Override |
|||
public void onClick(View v) { |
|||
popupHelper.ParametersCallPopup(this,myDataHelper); |
|||
} |
|||
}); |
|||
mainBinding.mainViewErrMessageBtn.setOnClickListener(new View.OnClickListener() { |
|||
@Override |
|||
public void onClick(View view) { |
|||
popupHelper.RobotErrorListPopUp(this); |
|||
} |
|||
}); |
|||
|
|||
|
|||
|
|||
//移动速度事件
|
|||
mainBinding.MaintvMoveSpeedTo32.addTextChangedListener(new TextWatcher() { |
|||
@Override |
|||
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void afterTextChanged(Editable s) { |
|||
|
|||
// 文本变化后的回调,在这里进行范围检查
|
|||
String input = s.toString(); |
|||
double value=0.0; |
|||
|
|||
if (!input.isEmpty()) { |
|||
try { |
|||
value = Double.parseDouble(input); |
|||
// 检查输入值是否在 -50 到 100 范围内
|
|||
if (value <= 0 || value > 14) { |
|||
showToast("请输入 0 到 14 之间的数字"); |
|||
// 可以选择清除输入或限制在范围内
|
|||
mainBinding.MaintvMoveSpeedTo32.setText(""); |
|||
|
|||
} else { |
|||
showToast("输入有效: " + value); |
|||
|
|||
} |
|||
} catch (NumberFormatException e) { |
|||
showToast("请输入有效的数字"); |
|||
} |
|||
} |
|||
|
|||
} |
|||
|
|||
}); |
|||
//换道距离事件
|
|||
mainBinding.MaintvLaneChangeDistanceTo32.addTextChangedListener(new TextWatcher() { |
|||
@Override |
|||
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void afterTextChanged(Editable s) { |
|||
// 文本变化后的回调,在这里进行范围检查
|
|||
String input = s.toString(); |
|||
if (!input.isEmpty()) { |
|||
try { |
|||
int value = Integer.parseInt(input); |
|||
// 检查输入值是否在 -50 到 100 范围内
|
|||
if (value < 0 || value > 250) { |
|||
showToast("请输入 0 到 250 之间的数字"); |
|||
// 可以选择清除输入或限制在范围内
|
|||
mainBinding.MaintvLaneChangeDistanceTo32.setText(""); |
|||
} else { |
|||
showToast("输入有效: " + value); |
|||
} |
|||
} catch (NumberFormatException e) { |
|||
showToast("请输入有效的数字"); |
|||
} |
|||
} |
|||
|
|||
|
|||
} |
|||
}); |
|||
//摆臂速度
|
|||
mainBinding.MaintvSwingArmSpeedTo32.addTextChangedListener(new TextWatcher() { |
|||
@Override |
|||
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void afterTextChanged(Editable s) { |
|||
// 文本变化后的回调,在这里进行范围检查
|
|||
String input = s.toString(); |
|||
if (!input.isEmpty()) { |
|||
try { |
|||
int value = Integer.parseInt(input); |
|||
// 检查输入值是否在 -50 到 100 范围内
|
|||
if (value <= 0 || value > 60) { |
|||
showToast("请输入 0 到 60 之间的数字"); |
|||
// 可以选择清除输入或限制在范围内
|
|||
mainBinding.MaintvSwingArmSpeedTo32.setText(""); |
|||
} else { |
|||
showToast("输入有效: " + value); |
|||
} |
|||
} catch (NumberFormatException e) { |
|||
showToast("请输入有效的数字"); |
|||
} |
|||
} |
|||
|
|||
} |
|||
}); |
|||
|
|||
|
|||
//压力设定
|
|||
mainBinding.MaintvPressTo32.addTextChangedListener(new TextWatcher() { |
|||
@Override |
|||
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void afterTextChanged(Editable s) { |
|||
// 文本变化后的回调,在这里进行范围检查
|
|||
|
|||
|
|||
String input = s.toString(); |
|||
|
|||
if (!input.isEmpty()) { |
|||
try { |
|||
int value = Integer.parseInt(input); |
|||
// 检查输入值是否在 -50 到 100 范围内
|
|||
if (value < -3000 || value > 3000) { |
|||
showToast("请输入 -3000 到 3000 之间的数字"); |
|||
// 可以选择清除输入或限制在范围内
|
|||
mainBinding.MaintvPressTo32.setText(""); |
|||
} else { |
|||
showToast("输入有效: " + value); |
|||
} |
|||
} catch (NumberFormatException e) { |
|||
showToast("请输入有效的数字"); |
|||
} |
|||
} |
|||
} |
|||
}); |
|||
//竖直微调
|
|||
mainBinding.MaintvVerticalAdjustTo32.addTextChangedListener(new TextWatcher() { |
|||
@Override |
|||
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void afterTextChanged(Editable s) { |
|||
String input = s.toString().trim(); |
|||
|
|||
// 1. 允许空输入(用户正在删除)
|
|||
if (TextUtils.isEmpty(input)) { |
|||
return; |
|||
} |
|||
|
|||
// 2. 允许合法的中间状态(如"-10.")
|
|||
if (input.matches("^-?\\d*(\\.\\d*)?$")) { |
|||
// 合法格式:整数、负数、小数、小数点开头
|
|||
try { |
|||
|
|||
int value = Integer.parseInt(input); |
|||
// 检查输入值是否在 -50 到 100 范围内
|
|||
if (value < -10 || value > 10) { |
|||
showToast("请输入 -10 到 10 之间的数字"); |
|||
// 可以选择清除输入或限制在范围内
|
|||
mainBinding.MaintvVerticalAdjustTo32.setText(""); |
|||
} else { |
|||
showToast("输入有效: " + value); |
|||
} |
|||
// 尝试转换为double(处理小数)
|
|||
//lastValidValue = Double.parseDouble(input);
|
|||
} catch (NumberFormatException e) { |
|||
// 中间状态,忽略
|
|||
} |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
} |
|||
}); |
|||
|
|||
//喷砂机设置按钮
|
|||
mainBinding.setSandBlastBtn.setOnClickListener(new View.OnClickListener() { |
|||
@Override |
|||
public void onClick(View v) { |
|||
int paraIndex = 1; |
|||
int sandBlastone = Integer.parseInt(mainBinding.MaintvSandCodeOneTo32.getText().toString()); |
|||
int sandBlasttwo = Integer.parseInt(mainBinding.MaintvSandCodeTwoTo32.getText().toString()); |
|||
|
|||
//把界面中的值放进PV类的变量中
|
|||
DisplaySandBlast displaysb = new DisplaySandBlast(paraIndex, sandBlastone,sandBlasttwo); |
|||
myDataHelper.addOrUpdateDisplayData_SandBlast(displaysb); //创建数据库的实例在这里 PV传进去保存到数据库
|
|||
showToast("保存成功"); |
|||
} |
|||
}); |
|||
} //oncreate
|
|||
|
|||
|
|||
//函数定义放create外
|
|||
private void showToast(String message) |
|||
{ |
|||
Toast.makeText(this, message, Toast.LENGTH_SHORT).show(); |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
@Override |
|||
protected void onStart() { |
|||
super.onStart(); |
|||
serialPortHelper.onStart(); |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void onStop() { |
|||
serialPortHelper.onStop(); |
|||
super.onStop(); |
|||
} |
|||
|
|||
@Override |
|||
public void onResume() { |
|||
super.onResume(); |
|||
serialPortHelper.onResume(); |
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void onPause() { |
|||
serialPortHelper.onPause(); |
|||
super.onPause(); |
|||
} |
|||
|
|||
@Override |
|||
protected void onDestroy() { |
|||
super.onDestroy(); |
|||
if (timer != null) { |
|||
timer.cancel(); |
|||
} |
|||
} |
|||
|
|||
|
|||
} |
|||
@ -0,0 +1,50 @@ |
|||
package com.example.swingarmapp_sandblast.models; |
|||
|
|||
import androidx.databinding.BaseObservable; |
|||
|
|||
public class DisplayIV extends BaseObservable { |
|||
private double leftCompensation; |
|||
private double rightCompensation; |
|||
private double currentAngle; |
|||
|
|||
public double getLeftCompensation() { |
|||
return leftCompensation; |
|||
} |
|||
|
|||
public void setLeftCompensation(double leftCompensation) { |
|||
this.leftCompensation = leftCompensation; |
|||
} |
|||
|
|||
public double getRightCompensation() { |
|||
return rightCompensation; |
|||
} |
|||
|
|||
public void setRightCompensation(double rightCompensation) { |
|||
this.rightCompensation = rightCompensation; |
|||
} |
|||
|
|||
public double getCurrentAngle() { |
|||
return currentAngle; |
|||
} |
|||
|
|||
public void setCurrentAngle(double currentAngle) { |
|||
this.currentAngle = currentAngle; |
|||
} |
|||
|
|||
public double getRobotMoveSpeed() { |
|||
return robotMoveSpeed; |
|||
} |
|||
|
|||
public void setRobotMoveSpeed(double robotMoveSpeed) { |
|||
this.robotMoveSpeed = robotMoveSpeed; |
|||
} |
|||
|
|||
private double robotMoveSpeed; |
|||
|
|||
public DisplayIV(double leftCompensation, double rightCompensation, double currentAngle, double robotMoveSpeed) { |
|||
this.leftCompensation = leftCompensation; |
|||
this.rightCompensation = rightCompensation; |
|||
this.currentAngle = currentAngle; |
|||
this.robotMoveSpeed = robotMoveSpeed; |
|||
} |
|||
} |
|||
@ -0,0 +1,119 @@ |
|||
package com.example.swingarmapp_sandblast.models; |
|||
|
|||
import androidx.databinding.BaseObservable; |
|||
|
|||
public class DisplayPV extends BaseObservable { |
|||
|
|||
private int id; |
|||
|
|||
private int moveSpeed; |
|||
private int laneChangeDistance; |
|||
private int swingArmSpeed; |
|||
private int swingArmAngle; |
|||
|
|||
private double backDistance; |
|||
private double backSpeedValue; |
|||
private int pressSet; |
|||
|
|||
private double verticalAdjust; |
|||
|
|||
private int workLength; |
|||
private int workWidth; |
|||
|
|||
|
|||
|
|||
public DisplayPV(int id, int laneChangeDistance, int swingArmSpeed, int swingArmAngle, double backDistance, double backSpeedValue, int pressSet,double verticalAdjust ,int workLength,int workWidth) { |
|||
this.id = id; |
|||
this.laneChangeDistance=laneChangeDistance; |
|||
this.swingArmSpeed = swingArmSpeed; |
|||
this.swingArmAngle = swingArmAngle; |
|||
this.backDistance = backDistance; |
|||
this.backSpeedValue=backSpeedValue; |
|||
this.pressSet=pressSet; |
|||
this.verticalAdjust=verticalAdjust; |
|||
this.workLength=workLength; |
|||
this.workWidth=workWidth; |
|||
|
|||
} |
|||
|
|||
|
|||
public int getId() { return id; } |
|||
public void setId(int id) { |
|||
this.id = id; |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
// public int getMoveSpeed()
|
|||
// {
|
|||
// return moveSpeed;
|
|||
// }
|
|||
// public void setMoveSpeed(int moveSpeed){ this.moveSpeed=moveSpeed;}
|
|||
|
|||
public int getLaneChangeDistance() { |
|||
return laneChangeDistance; |
|||
} |
|||
public void setLaneChangeDistance(int laneChangeDistance) { this.laneChangeDistance = laneChangeDistance;} |
|||
|
|||
public int getSwingArmSpeed() { |
|||
return swingArmSpeed; |
|||
} |
|||
public void setSwingArmSpeed(int swingArmSpeed) { this.swingArmSpeed = swingArmSpeed;} |
|||
|
|||
public int getSwingArmAngle() { |
|||
return swingArmAngle; |
|||
} |
|||
public void setSwingArmAngle(int swingArmAngle) { |
|||
this.swingArmAngle = swingArmAngle; |
|||
} |
|||
|
|||
|
|||
public double getBackDistance() { |
|||
return backDistance; |
|||
} |
|||
public void setBackDistance(int backDistance) { |
|||
this.backDistance = backDistance; |
|||
} |
|||
|
|||
public double getBackSpeedValue() { |
|||
return backSpeedValue; |
|||
} |
|||
public void setBackSpeedValue(int backSpeedValue) { |
|||
this.backSpeedValue = backSpeedValue; |
|||
} |
|||
|
|||
public int getPressSet() { |
|||
return pressSet; |
|||
} |
|||
public void setPressSet(int pressSet) { |
|||
this.pressSet = pressSet; |
|||
} |
|||
|
|||
|
|||
public double getVerticalAdjust() { |
|||
return verticalAdjust; |
|||
} |
|||
public void setVerticalAdjust(int verticalAdjust) { |
|||
this.verticalAdjust = verticalAdjust; |
|||
} |
|||
|
|||
|
|||
|
|||
public int getWorkLength() { |
|||
return workLength; |
|||
} |
|||
public void setWorkLength(int workLength) { |
|||
this.workLength = workLength; |
|||
} |
|||
|
|||
public int getWorkWidth() { |
|||
return workWidth; |
|||
} |
|||
public void setWorkWidth(int workWidth) { |
|||
this.workLength = workWidth; |
|||
} |
|||
|
|||
|
|||
|
|||
} |
|||
@ -0,0 +1,30 @@ |
|||
package com.example.swingarmapp_sandblast.models; |
|||
|
|||
public class DisplaySandBlast { |
|||
private int id; |
|||
private int sand_encodeone; |
|||
private int sand_encodetwo; |
|||
|
|||
public DisplaySandBlast(int id , int sandEncodeOne,int sandEncodeTwo){ |
|||
|
|||
this.id=id; |
|||
this.sand_encodeone=sandEncodeOne; |
|||
this.sand_encodetwo=sandEncodeTwo; |
|||
} |
|||
|
|||
public int getId() { return id; } |
|||
public void setId(int id) { |
|||
this.id = id; |
|||
} |
|||
|
|||
public int getsand_encodeone() { return sand_encodeone; } |
|||
public void setsand_encodeone(int sandEncodeOne) { |
|||
this.sand_encodeone = sandEncodeOne; |
|||
} |
|||
|
|||
public int getsand_encodetwo() { return sand_encodetwo; } |
|||
public void setsand_encodetwo(int sand_encodetwo) { |
|||
this.sand_encodeone = sand_encodetwo; |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,44 @@ |
|||
package com.example.swingarmapp_sandblast.models; |
|||
|
|||
public class ErrorModel { |
|||
|
|||
public ErrorModel(long timeID, String errorInfo) { |
|||
this.timeID = timeID; |
|||
this.errorInfo = errorInfo; |
|||
} |
|||
private long timeID; |
|||
|
|||
|
|||
public void setDateTimeBJ(String dateTimeUTC) { |
|||
this.dateTimeBJ = dateTimeUTC; |
|||
} |
|||
|
|||
private String errorInfo; |
|||
|
|||
public String getDateTimeBJ() { |
|||
return dateTimeBJ; |
|||
} |
|||
|
|||
private String dateTimeBJ; |
|||
|
|||
|
|||
@Override |
|||
public String toString() { |
|||
return String.valueOf(dateTimeBJ + errorInfo); |
|||
} |
|||
public void setTimeID(long timeID) { |
|||
this.timeID = timeID; |
|||
} |
|||
|
|||
public void setErrorInfo(String errorInfo) { |
|||
this.errorInfo = errorInfo; |
|||
} |
|||
|
|||
public long getTimeID() { |
|||
return timeID; |
|||
} |
|||
|
|||
public String getErrorInfo() { |
|||
return errorInfo; |
|||
} |
|||
} |
|||
@ -0,0 +1,43 @@ |
|||
package com.example.swingarmapp_sandblast.models; |
|||
|
|||
import android.content.Context; |
|||
import android.util.AttributeSet; |
|||
import android.view.View; |
|||
import android.widget.ScrollView; |
|||
|
|||
public class ScrollBottomScrollView extends ScrollView { |
|||
|
|||
private OnScrollBottomListener listener; |
|||
private int calCount; |
|||
|
|||
public interface OnScrollBottomListener { |
|||
void scrollToBottom(); |
|||
} |
|||
|
|||
public void onScrollViewScrollToBottom(OnScrollBottomListener l) { |
|||
listener = l; |
|||
} |
|||
|
|||
public void unRegisterOnScrollViewScrollToBottom() { |
|||
listener = null; |
|||
} |
|||
|
|||
public ScrollBottomScrollView(Context context, AttributeSet attrs) { |
|||
super(context, attrs); |
|||
} |
|||
|
|||
@Override |
|||
protected void onScrollChanged(int l, int t, int oldl, int oldt) { |
|||
View view = this.getChildAt(0); |
|||
if (this.getHeight() + this.getScrollY() == view.getHeight()) { |
|||
calCount++; |
|||
if (calCount == 1) { |
|||
if (listener != null) { |
|||
listener.scrollToBottom(); |
|||
} |
|||
} |
|||
} else { |
|||
calCount = 0; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,26 @@ |
|||
package com.example.swingarmapp_sandblast.services; |
|||
|
|||
import android.widget.EditText; |
|||
import android.widget.TextView; |
|||
|
|||
public class ConvertHelper { |
|||
|
|||
public static int convertEditTextToInt(TextView editText) { |
|||
// 获取 EditText 中的文本
|
|||
String input = editText.getText().toString().trim(); |
|||
try { |
|||
// 尝试将字符串转换为整数
|
|||
return Integer.parseInt(input); |
|||
} catch (NumberFormatException e) { |
|||
// 输入不是有效的整数格式,返回 -1 表示转换失败
|
|||
return -1; |
|||
} |
|||
} |
|||
|
|||
public static boolean isEditTextNullOrEmpty(EditText editText) { |
|||
|
|||
String str = String.valueOf(editText.getText()); |
|||
|
|||
return str == null || str.isEmpty(); |
|||
} |
|||
} |
|||
@ -0,0 +1,22 @@ |
|||
package com.example.swingarmapp_sandblast.services; |
|||
|
|||
import com.hoho.android.usbserial.driver.FtdiSerialDriver; |
|||
import com.hoho.android.usbserial.driver.ProbeTable; |
|||
import com.hoho.android.usbserial.driver.UsbSerialProber; |
|||
|
|||
/** |
|||
* add devices here, that are not known to DefaultProber |
|||
* |
|||
* if the App should auto start for these devices, also |
|||
* add IDs to app/src/main/res/xml/device_filter.xml |
|||
*/ |
|||
public class CustomProber { |
|||
|
|||
public static UsbSerialProber getCustomProber() { |
|||
ProbeTable customTable = new ProbeTable(); |
|||
customTable.addProduct(0x1234, 0x0001, FtdiSerialDriver.class); // e.g. device with custom VID+PID
|
|||
customTable.addProduct(0x1234, 0x0002, FtdiSerialDriver.class); // e.g. device with custom VID+PID
|
|||
return new UsbSerialProber(customTable); |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,71 @@ |
|||
package com.example.swingarmapp_sandblast.services; |
|||
|
|||
import android.text.InputFilter; |
|||
import android.text.Spanned; |
|||
|
|||
import java.util.regex.Matcher; |
|||
import java.util.regex.Pattern; |
|||
|
|||
/* |
|||
自定义 InputFilter 类,用于限制输入格式 |
|||
支持整数、负数和最多一位小数的输入 |
|||
使用方法:editText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter()}); |
|||
*/ |
|||
public class DecimalDigitsInputFilter implements InputFilter { |
|||
// 最终验证的正则表达式
|
|||
private final Pattern mFinalPattern; |
|||
// 中间状态允许的正则表达式
|
|||
private final Pattern mIntermediatePattern; |
|||
|
|||
public DecimalDigitsInputFilter() { |
|||
// 最终验证:必须是完整的数字格式
|
|||
mFinalPattern = Pattern.compile("^-?(0|[1-9]\\d*)(\\.\\d)?$"); |
|||
|
|||
// 中间状态:允许临时的不完整格式(如 "-"、"0."、"-2.")
|
|||
mIntermediatePattern = Pattern.compile("^-?(0|[1-9]\\d*)?(\\.)?$"); |
|||
} |
|||
|
|||
@Override |
|||
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { |
|||
// 处理删除操作
|
|||
if (end - start == 0) { |
|||
return null; |
|||
} |
|||
|
|||
// 拼接新的输入内容
|
|||
String newText = dest.toString().substring(0, dstart) + |
|||
source.toString().substring(start, end) + |
|||
dest.toString().substring(dend); |
|||
|
|||
// 允许空字符串或单独的负号
|
|||
if (newText.isEmpty() || newText.equals("-")) { |
|||
return null; |
|||
} |
|||
|
|||
// 防止前导零(除非是 0 或 0.x)
|
|||
if (newText.startsWith("0") && newText.length() > 1 && |
|||
!newText.startsWith("0.") && !newText.equals("0")) { |
|||
return ""; |
|||
} |
|||
|
|||
// 防止多个负号
|
|||
if (newText.indexOf('-') > 0) { |
|||
return ""; |
|||
} |
|||
|
|||
// 防止多个小数点
|
|||
if (newText.indexOf('.') != newText.lastIndexOf('.')) { |
|||
return ""; |
|||
} |
|||
|
|||
// 检查是否匹配最终模式或中间模式
|
|||
Matcher finalMatcher = mFinalPattern.matcher(newText); |
|||
Matcher intermediateMatcher = mIntermediatePattern.matcher(newText); |
|||
|
|||
if (finalMatcher.matches() || intermediateMatcher.matches()) { |
|||
return null; // 匹配成功,允许输入
|
|||
} |
|||
|
|||
return ""; // 匹配失败,阻止输入
|
|||
} |
|||
} |
|||
@ -0,0 +1,78 @@ |
|||
package com.example.swingarmapp_sandblast.services; |
|||
|
|||
import com.example.swingarmapp_sandblast.models.BspError; |
|||
|
|||
public class ErrorDeocdeHelper { |
|||
|
|||
//private static Map<String, Integer> flagMap = new HashMap<>();
|
|||
|
|||
// public static void AddMap(String errorName, Integer bitPosition)
|
|||
// {
|
|||
// flagMap.put(errorName,bitPosition);
|
|||
// }
|
|||
private static String ErrorResult; |
|||
private static String addErrorResult; |
|||
public static String ErrorDeocde(int data) |
|||
{ |
|||
ErrorResult=""; |
|||
// 循环遍历 Map
|
|||
// for (Map.Entry<String, Integer> entry : flagMap.entrySet()) {
|
|||
// String key = entry.getKey();
|
|||
// int bitPosiiton = entry.getValue();
|
|||
//
|
|||
// // 使用左移操作生成要检查的标志位
|
|||
// int bitToCheck = 1 << bitPosiiton;
|
|||
//
|
|||
// // 判断该位置是否有对应的标志位
|
|||
// if ((data & bitToCheck) != 0)
|
|||
// {
|
|||
// ErrorResult+=key+":\t 错误! ";
|
|||
// } else
|
|||
// {
|
|||
//
|
|||
// }
|
|||
// }
|
|||
|
|||
//
|
|||
for (BspError.ComError err : BspError.ComError.values()) { |
|||
|
|||
|
|||
int bitPosiiton = err.ordinal();//返回枚举值
|
|||
if (err.toString().equals("UNRECOGNIZED")) continue; |
|||
if (err.toString().equals("TL720D")) |
|||
addErrorResult = " 作业模式已切换至手动"; |
|||
else |
|||
addErrorResult = " "; |
|||
|
|||
// 使用左移操作生成要检查的标志位
|
|||
int bitToCheck = 1 << bitPosiiton; |
|||
|
|||
// // 判断该位置是否有对应的标志位
|
|||
// if ((data & bitToCheck) != 0)
|
|||
// {
|
|||
//
|
|||
// ErrorResult+=err.toString()+addErrorResult+"\t";
|
|||
// } else
|
|||
// {
|
|||
//
|
|||
// }
|
|||
|
|||
|
|||
// 判断该位置是否有对应的标志位
|
|||
if ((data & bitToCheck) != 0) { |
|||
|
|||
// ErrorResult += String.valueOf(bitPosiiton);
|
|||
|
|||
if (err.toString().equals("MK32_InitialState")) { |
|||
ErrorResult = "未复位"; |
|||
} |
|||
// else
|
|||
// {
|
|||
// ErrorResult += err.toString()+addErrorResult+"\t";
|
|||
// }
|
|||
} |
|||
} |
|||
return ErrorResult; |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,39 @@ |
|||
package com.example.swingarmapp_sandblast.services; |
|||
|
|||
import android.util.Log; |
|||
|
|||
public class LogUtil { |
|||
private String TAG; |
|||
private boolean isRelease = false; |
|||
private boolean isDebug; |
|||
|
|||
public LogUtil(Class c, boolean isDebug) { |
|||
this.TAG = c.getName(); |
|||
this.isDebug = isDebug; |
|||
} |
|||
|
|||
public void d(String msg) { |
|||
if (!isRelease && isDebug) { |
|||
Log.d(TAG, "--------->" + msg); |
|||
} |
|||
} |
|||
|
|||
public void i(String msg) { |
|||
if (!isRelease && isDebug) { |
|||
Log.i(TAG, "--------->" + msg); |
|||
} |
|||
} |
|||
|
|||
public void w(String msg) { |
|||
if (!isRelease && isDebug) { |
|||
Log.w(TAG, "--------->" + msg); |
|||
} |
|||
} |
|||
|
|||
public void e(String msg) { |
|||
if (!isRelease && isDebug) { |
|||
Log.e(TAG, "--------->" + msg); |
|||
} |
|||
} |
|||
} |
|||
|
|||
@ -0,0 +1,72 @@ |
|||
package com.example.swingarmapp_sandblast.services; |
|||
|
|||
public class ModbusCRC { |
|||
|
|||
// /**
|
|||
// * 一个字节包含位的数量 8
|
|||
// */
|
|||
// private static final int BITS_OF_BYTE = 8;
|
|||
// /**
|
|||
// * 多项式
|
|||
// */
|
|||
// private static final int POLYNOMIAL = 0xA001;
|
|||
// /**
|
|||
// * 初始值
|
|||
// */
|
|||
// private static final int INITIAL_VALUE = 0xFFFF;
|
|||
//
|
|||
// /**
|
|||
// * CRC16 编码
|
|||
// *
|
|||
// * @param bytes 编码内容
|
|||
// * @return 编码结果
|
|||
// */
|
|||
// public static int crc16(byte[] bytes) {
|
|||
// int res = INITIAL_VALUE;
|
|||
// for (int data : bytes) {
|
|||
// res = res ^ data;
|
|||
// for (int i = 0; i < BITS_OF_BYTE; i++) {
|
|||
// res = (res & 0x0001) == 1 ? (res >> 1) ^ POLYNOMIAL : res >> 1;
|
|||
// }
|
|||
// }
|
|||
// return revert(res);
|
|||
// }
|
|||
//
|
|||
// /**
|
|||
// * 翻转16位的高八位和低八位字节
|
|||
// *
|
|||
// * @param src 翻转数字
|
|||
// * @return 翻转结果
|
|||
// */
|
|||
// private static int revert(int src) {
|
|||
// int lowByte = (src & 0xFF00) >> 8;
|
|||
// int highByte = (src & 0x00FF) << 8;
|
|||
// return lowByte | highByte;
|
|||
// }
|
|||
|
|||
|
|||
/** |
|||
* 计算 Modbus CRC 校验值 |
|||
* @param data 要计算校验值的字节数组 |
|||
* @return CRC 校验值,以 2 字节的数组形式返回 |
|||
*/ |
|||
public static byte[] calculateCRC(byte[] data) { |
|||
int crc = 0xFFFF; |
|||
for (byte b : data) { |
|||
crc ^= (b & 0xFF); |
|||
for (int i = 0; i < 8; i++) { |
|||
if ((crc & 0x0001) != 0) { |
|||
crc >>= 1; |
|||
crc ^= 0xA001; |
|||
} else { |
|||
crc >>= 1; |
|||
} |
|||
} |
|||
} |
|||
// 将 CRC 结果拆分为两个字节
|
|||
byte[] crcBytes = new byte[2]; |
|||
crcBytes[0] = (byte) (crc & 0xFF); |
|||
crcBytes[1] = (byte) ((crc >> 8) & 0xFF); |
|||
return crcBytes; |
|||
} |
|||
} |
|||
@ -0,0 +1,304 @@ |
|||
package com.example.swingarmapp_sandblast.services; |
|||
|
|||
import android.content.ContentValues; |
|||
import android.content.Context; |
|||
import android.database.Cursor; |
|||
import android.database.SQLException; |
|||
import android.database.sqlite.SQLiteDatabase;//具体进行数据库、数据表的一个操作
|
|||
import android.database.sqlite.SQLiteOpenHelper;//用来创建数据库和对数据库进行版本管理
|
|||
import android.util.Log; |
|||
|
|||
import androidx.annotation.Nullable; |
|||
|
|||
import com.example.swingarmapp_sandblast.models.DisplayPV; |
|||
import com.example.swingarmapp_sandblast.models.DisplaySandBlast; |
|||
import com.example.swingarmapp_sandblast.models.ErrorModel; |
|||
|
|||
import java.text.SimpleDateFormat; |
|||
import java.util.ArrayList; |
|||
import java.util.Date; |
|||
import java.util.List; |
|||
import java.util.TimeZone; |
|||
|
|||
public class MyDataHelper extends SQLiteOpenHelper { |
|||
//定义字段
|
|||
public static final String COLUMN_ID = "id";//参数调用
|
|||
public static final String TABLE_NAME = "information"; |
|||
|
|||
public static final String COLUMN_LANE_CHANGE_DISTANCE = "laneChangeDistance";//换道距离
|
|||
public static final String COLUMN_SWING_ARM_SPEED = "swingArmSpeed";//Maintv_swingArmSpeedTo32摆臂速度
|
|||
public static final String COLUMN_SWING_ARM_ANGLE = "swingArmAngle";//Maintv_swingArmAngleTo32摆臂角度
|
|||
|
|||
public static final String COLUMN_BACK_DISTANCE = "backDistance";//Maintv_BackDistanceTo32后退距离
|
|||
public static final String COLUMN_BACK_SPEED = "backSpeed";//Maintv_BackSpeedTo32后退速度
|
|||
|
|||
public static final String COLUMN_PRESS_SET = "pressSet";//Maintv_PressTo32 压力设定
|
|||
public static final String COLUMN_VERTICAL_ADJUST = "verticalAdjust";//Maintv_VerticalAdjustTo32 竖直微调
|
|||
public static final String COLUMN_WORK_LENGTH = "workLength";//Maintv_WorkLenthTo32作业长度
|
|||
public static final String COLUMN_WORK_WIDTH = "workWidth";//Maintv_WorkWidthTo32作业宽度
|
|||
|
|||
|
|||
public static final String Error_TABLE_NAME = "error"; |
|||
public static final String Error_COLUMN_TimeStamp = "timeID"; |
|||
|
|||
public static final String Error_COLUMN_ERROR_INFO = "errorInfo"; |
|||
|
|||
/*****************************************/ |
|||
public static final String SAND_TABLE_NAME = "sandblast"; |
|||
public static final String SAND_COLUMN_ENCODEONE = "encode1"; |
|||
|
|||
public static final String SAND_COLUMN_ENCODETWO = "encode2"; |
|||
|
|||
|
|||
|
|||
public MyDataHelper(@Nullable Context context) { |
|||
super(context, "bingbot.db", null, 6); //数据库名称为 bingbot.db,数据库版本为 1。存放两个表
|
|||
} |
|||
|
|||
@Override |
|||
public void onCreate(SQLiteDatabase db) { |
|||
|
|||
|
|||
//INTEGER前加空格
|
|||
String sql = "CREATE TABLE " + TABLE_NAME + " (" + |
|||
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + |
|||
COLUMN_PRESS_SET + " INTEGER, " + |
|||
COLUMN_VERTICAL_ADJUST + " DOUBLE, " + |
|||
COLUMN_SWING_ARM_ANGLE + " INTEGER, " + |
|||
COLUMN_SWING_ARM_SPEED + " INTEGER, " + |
|||
COLUMN_BACK_DISTANCE + " DOUBLE, " + |
|||
COLUMN_LANE_CHANGE_DISTANCE + " INTEGER, " + |
|||
COLUMN_WORK_LENGTH + " INTEGER, " + |
|||
COLUMN_WORK_WIDTH + " INTEGER, " + |
|||
COLUMN_BACK_SPEED + " DOUBLE);"; |
|||
|
|||
db.execSQL(sql); //执行sql语句
|
|||
// Log.d("DB_DEBUG", "表创建成功,列名包含: moveSpeed");
|
|||
sql = "CREATE TABLE " + Error_TABLE_NAME + "(" + Error_COLUMN_TimeStamp + " INTEGER PRIMARY KEY ," |
|||
+ Error_COLUMN_ERROR_INFO + " STRING " + ")"; |
|||
|
|||
db.execSQL(sql); //创建错误表
|
|||
|
|||
/*******创建喷砂机编码表*********/ |
|||
sql = "CREATE TABLE " + SAND_TABLE_NAME + "(" + COLUMN_ID + " INTEGER PRIMARY KEY ,"+ SAND_COLUMN_ENCODEONE + " INTEGER, " |
|||
+ SAND_COLUMN_ENCODETWO + " INTEGER " + ")"; |
|||
|
|||
db.execSQL(sql); //创建错误表
|
|||
|
|||
} |
|||
|
|||
@Override |
|||
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { |
|||
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); |
|||
db.execSQL("DROP TABLE IF EXISTS " + Error_TABLE_NAME); |
|||
onCreate(db); |
|||
} |
|||
|
|||
//增 删 改 查
|
|||
public String addOrUpdateDisplayData(DisplayPV pv) { |
|||
ContentValues cv = new ContentValues(); //键值对的类
|
|||
cv.put(COLUMN_ID, pv.getId()); |
|||
cv.put(COLUMN_BACK_SPEED, pv.getBackSpeedValue()); |
|||
cv.put(COLUMN_LANE_CHANGE_DISTANCE, pv.getLaneChangeDistance()); |
|||
cv.put(COLUMN_SWING_ARM_SPEED, pv.getSwingArmSpeed()); |
|||
cv.put(COLUMN_SWING_ARM_ANGLE, pv.getSwingArmAngle()); |
|||
cv.put(COLUMN_BACK_DISTANCE, pv.getBackDistance()); |
|||
cv.put(COLUMN_PRESS_SET, pv.getPressSet()); |
|||
cv.put(COLUMN_VERTICAL_ADJUST, pv.getVerticalAdjust()); |
|||
cv.put(COLUMN_WORK_LENGTH, pv.getWorkLength()); |
|||
cv.put(COLUMN_WORK_WIDTH, pv.getWorkWidth()); |
|||
|
|||
|
|||
SQLiteDatabase sqliteDatabase = this.getWritableDatabase();//获取数据库实例以实现增上查改等,如果没有就新建 并把sqliteDatabase作为参数传给oncreate方法
|
|||
long insert = sqliteDatabase.insertWithOnConflict(TABLE_NAME, null, cv, SQLiteDatabase.CONFLICT_REPLACE); |
|||
sqliteDatabase.close(); |
|||
if (insert == -1) { |
|||
return "failed"; |
|||
} |
|||
return "success"; |
|||
} |
|||
|
|||
public String addOrUpdateDisplayData_SandBlast(DisplaySandBlast dsb) { |
|||
ContentValues cv = new ContentValues(); //键值对的类
|
|||
cv.put(COLUMN_ID, 1); |
|||
cv.put(SAND_COLUMN_ENCODEONE, dsb.getsand_encodeone()); |
|||
cv.put(SAND_COLUMN_ENCODETWO, dsb.getsand_encodetwo()); |
|||
|
|||
SQLiteDatabase sqliteDatabase = this.getWritableDatabase();//获取数据库实例以实现增上查改等,如果没有就新建 并把sqliteDatabase作为参数传给oncreate方法
|
|||
long insert = sqliteDatabase.insertWithOnConflict(SAND_TABLE_NAME, null, cv, SQLiteDatabase.CONFLICT_REPLACE); |
|||
sqliteDatabase.close(); |
|||
if (insert == -1) { |
|||
return "failed"; |
|||
} |
|||
return "success"; |
|||
} |
|||
public List<DisplaySandBlast> getDisplayData_sandBalst() { //初始化
|
|||
|
|||
List<DisplaySandBlast> list = new ArrayList<>(); |
|||
String sql = "SELECT * FROM " + SAND_TABLE_NAME + " WHERE " + COLUMN_ID + " = " + String.valueOf(1); |
|||
SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();//获取可写数据库实例
|
|||
|
|||
|
|||
Cursor cursor = sqLiteDatabase.rawQuery(sql, null); //按id查询
|
|||
|
|||
int idIndex = cursor.getColumnIndex(COLUMN_ID); |
|||
int _sandEncodeOneIndex = cursor.getColumnIndex(SAND_COLUMN_ENCODEONE); |
|||
int _sandEncodeTwoIndex = cursor.getColumnIndex(SAND_COLUMN_ENCODETWO); |
|||
|
|||
|
|||
while (cursor.moveToNext()) { |
|||
|
|||
DisplaySandBlast dsb = new DisplaySandBlast(cursor.getInt(idIndex), cursor.getInt(_sandEncodeOneIndex), |
|||
cursor.getInt(_sandEncodeTwoIndex) |
|||
); |
|||
|
|||
list.add(dsb); |
|||
} |
|||
cursor.close(); |
|||
sqLiteDatabase.close(); |
|||
return list; |
|||
|
|||
} |
|||
public String deleteAll() { |
|||
SQLiteDatabase sqLiteDatabase = this.getWritableDatabase(); |
|||
int delete = sqLiteDatabase.delete(TABLE_NAME, null, null); |
|||
|
|||
sqLiteDatabase.close(); |
|||
if (delete == 0) { |
|||
return "failed"; |
|||
} |
|||
return "success"; |
|||
|
|||
} |
|||
|
|||
public void IntializeDataBase() { |
|||
|
|||
for (int i = 1; i < 6; i++) { |
|||
List<DisplayPV> list = getDisplayData(i); //从数据库中读
|
|||
if (list.size() == 0) { |
|||
DisplayPV pv = new DisplayPV(i, 0, 0, 0, 0, 0, 0,0, 0, 0); |
|||
addOrUpdateDisplayData(pv);//一行一行添加
|
|||
} |
|||
} |
|||
List<DisplaySandBlast> list_dsb = getDisplayData_sandBalst(); //从数据库中读
|
|||
if (list_dsb.size() == 0) { |
|||
DisplaySandBlast dsb = new DisplaySandBlast(1, 0, 0); |
|||
addOrUpdateDisplayData_SandBlast(dsb);//一行一行添加
|
|||
} |
|||
} |
|||
|
|||
|
|||
public List<DisplayPV> getDisplayData(int id) { //初始化
|
|||
List<DisplayPV> list = new ArrayList<>(); |
|||
String sql = "SELECT * FROM " + TABLE_NAME + " WHERE " + COLUMN_ID + " = " + String.valueOf(id); |
|||
SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();//获取可写数据库实例
|
|||
|
|||
|
|||
Cursor cursor = sqLiteDatabase.rawQuery(sql, null); //按id查询
|
|||
|
|||
int idIndex = cursor.getColumnIndex(COLUMN_ID); |
|||
int _laneChangeDistanceIndex = cursor.getColumnIndex(COLUMN_LANE_CHANGE_DISTANCE); |
|||
int _swingArmSpeedIndex = cursor.getColumnIndex(COLUMN_SWING_ARM_SPEED); |
|||
int _swingArmAngleIndex = cursor.getColumnIndex(COLUMN_SWING_ARM_ANGLE); |
|||
int _backDistanceIndex = cursor.getColumnIndex(COLUMN_BACK_DISTANCE); |
|||
int _backSpeedValue= cursor.getColumnIndex(COLUMN_BACK_SPEED); |
|||
int _pressSetIndex = cursor.getColumnIndex(COLUMN_PRESS_SET); |
|||
int _verticalAdjustIndex = cursor.getColumnIndex(COLUMN_VERTICAL_ADJUST); |
|||
int _workLengthIndex = cursor.getColumnIndex(COLUMN_WORK_LENGTH); |
|||
int _workWidthIndex = cursor.getColumnIndex(COLUMN_WORK_WIDTH); |
|||
|
|||
while (cursor.moveToNext()) { |
|||
|
|||
DisplayPV pv = new DisplayPV(cursor.getInt(idIndex), cursor.getInt(_laneChangeDistanceIndex), |
|||
cursor.getInt(_swingArmSpeedIndex), cursor.getInt(_swingArmAngleIndex), cursor.getInt(_backDistanceIndex),cursor.getInt(_backSpeedValue), cursor.getInt(_pressSetIndex), |
|||
cursor.getInt(_verticalAdjustIndex), cursor.getInt(_workLengthIndex), cursor.getInt(_workWidthIndex) |
|||
); |
|||
|
|||
list.add(pv); |
|||
} |
|||
cursor.close(); |
|||
sqLiteDatabase.close(); |
|||
return list; |
|||
|
|||
} |
|||
|
|||
|
|||
public String AddOrUpdateErrorModel(ErrorModel em) { |
|||
ContentValues cv = new ContentValues(); |
|||
cv.put(Error_COLUMN_TimeStamp, em.getTimeID()); |
|||
cv.put(Error_COLUMN_ERROR_INFO, em.getErrorInfo()); |
|||
|
|||
|
|||
SQLiteDatabase sqliteDatabase = this.getWritableDatabase(); |
|||
long insert = sqliteDatabase.insertWithOnConflict(Error_TABLE_NAME, null, cv, SQLiteDatabase.CONFLICT_REPLACE); |
|||
if (insert == -1) { |
|||
// 插入失败,按时间戳删除最早的100行
|
|||
try { |
|||
// 开始事务
|
|||
sqliteDatabase.beginTransaction(); |
|||
|
|||
String deleteQuery = "DELETE FROM error WHERE timeID IN (SELECT timeID FROM error ORDER BY timeID ASC LIMIT 100)"; |
|||
sqliteDatabase.execSQL(deleteQuery); |
|||
// 标记事务成功
|
|||
sqliteDatabase.setTransactionSuccessful(); |
|||
|
|||
Log.d("DB_OPERATION", "插入失败,已按时间戳删除最早的100行数据"); |
|||
} catch (SQLException e) { |
|||
Log.e("DB_ERROR", "删除时发生错误: " + e.getMessage()); |
|||
} finally { |
|||
// 结束事务(若setTransactionSuccessful()被调用则提交,否则回滚)
|
|||
sqliteDatabase.endTransaction(); |
|||
} |
|||
sqliteDatabase.close(); |
|||
return "failed"; |
|||
} |
|||
sqliteDatabase.close(); |
|||
return "success"; |
|||
} |
|||
|
|||
public String DeleteAllErrorModels() { |
|||
SQLiteDatabase sqLiteDatabase = this.getWritableDatabase(); |
|||
int delete = sqLiteDatabase.delete(Error_TABLE_NAME, null, |
|||
null); |
|||
|
|||
sqLiteDatabase.close(); |
|||
if (delete == 0) { |
|||
return "failed"; |
|||
} |
|||
return "success"; |
|||
|
|||
} |
|||
|
|||
public List<ErrorModel> GetAllErrorModels() { |
|||
List<ErrorModel> list = new ArrayList<>(); |
|||
String sql = "SELECT * FROM " + Error_TABLE_NAME; |
|||
SQLiteDatabase sqLiteDatabase = this.getWritableDatabase(); |
|||
|
|||
|
|||
Cursor cursor = sqLiteDatabase.rawQuery(sql, null); |
|||
|
|||
int _time_id_Index = cursor.getColumnIndex(Error_COLUMN_TimeStamp); |
|||
|
|||
int _error_Index = cursor.getColumnIndex(Error_COLUMN_ERROR_INFO); |
|||
|
|||
while (cursor.moveToNext()) { |
|||
|
|||
ErrorModel em = new ErrorModel(cursor.getLong(_time_id_Index), cursor.getString(_error_Index)); |
|||
|
|||
Date date = new Date(em.getTimeID()); // 将时间戳转换为Date对象
|
|||
// 创建SimpleDateFormat实例,并设置时区为UTC
|
|||
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); |
|||
sdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); // 设置为UTC时区
|
|||
// 格式化日期
|
|||
String utcTime = sdf.format(date); |
|||
// System.out.println("UTC时间: " + utcTime);
|
|||
em.setDateTimeBJ(utcTime); |
|||
|
|||
list.add(em); |
|||
} |
|||
cursor.close(); |
|||
sqLiteDatabase.close(); |
|||
return list; |
|||
|
|||
} |
|||
} |
|||
@ -0,0 +1,754 @@ |
|||
package com.example.swingarmapp_sandblast.services; |
|||
|
|||
import android.app.Dialog; |
|||
import android.content.Context; |
|||
import android.graphics.Color; |
|||
import android.text.InputFilter; |
|||
import android.text.method.ScrollingMovementMethod; |
|||
import android.view.MotionEvent; |
|||
import android.view.View; |
|||
import android.view.inputmethod.InputMethodManager; |
|||
import android.widget.Button; |
|||
import android.widget.EditText; |
|||
import android.widget.LinearLayout; |
|||
import android.widget.RadioButton; |
|||
import android.widget.RadioGroup; |
|||
import android.widget.ScrollView; |
|||
import android.widget.TextView; |
|||
import android.widget.Toast; |
|||
|
|||
import androidx.core.content.ContextCompat; |
|||
|
|||
import com.example.swingarmapp_sandblast.models.ErrorModel; |
|||
import com.example.swingarmapp_sandblast.models.ScrollBottomScrollView; |
|||
import com.example.swingarmapp_sandblast.MainActivity; |
|||
import com.example.swingarmapp_sandblast.R; |
|||
import com.example.swingarmapp_sandblast.models.DisplayPV; |
|||
|
|||
import java.util.List; |
|||
|
|||
public class PopupHelper { |
|||
|
|||
private MainActivity mainActivity; |
|||
private LinearLayout inputContainer, buttonsContainer; |
|||
private EditText inputEditText; |
|||
private Button buttonA, buttonB; |
|||
private TextView statusText; |
|||
|
|||
|
|||
String result="1"; |
|||
private EditText firstEditText; |
|||
private EditText secondEditText; |
|||
|
|||
public PopupHelper(MainActivity mainActivity) |
|||
{ |
|||
this.mainActivity = mainActivity; |
|||
|
|||
} |
|||
|
|||
|
|||
//手动模式弹窗
|
|||
public void ManualModePopup(View.OnClickListener context) { //手动模式弹窗
|
|||
Dialog dialog = new Dialog(mainActivity); |
|||
|
|||
dialog.setContentView(R.layout.manualmodepopup); // 设置自定义布局
|
|||
dialog.setCancelable(true); // 设置点击外部是否关闭弹窗
|
|||
|
|||
// 获取布局中的视图
|
|||
Button cancelButton = dialog.findViewById(R.id.manualModeCancel); |
|||
Button confirmButton = dialog.findViewById(R.id.manualModeApply); |
|||
|
|||
//获取按钮组
|
|||
RadioGroup radioGroup = (RadioGroup) dialog.findViewById(R.id.manualModeSelectorGroup); |
|||
|
|||
//4种模式
|
|||
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { |
|||
@Override |
|||
public void onCheckedChanged(RadioGroup group, int checkedId) { |
|||
RadioButton radioButton = (RadioButton) group.findViewById(checkedId); |
|||
if (radioButton != null) |
|||
{ |
|||
mainActivity._Manual_Mode_Call_Value = radioButton.getText().toString(); |
|||
} |
|||
} |
|||
}); |
|||
|
|||
//下次进来保证是选中状态或者未远中
|
|||
String ii= mainActivity.mainBinding.manualModeDisplay.getText().toString(); |
|||
switch (ii) |
|||
{ |
|||
case "无": { radioGroup.check(R.id.rb_one); |
|||
break; |
|||
} |
|||
case "水平": { radioGroup.check(R.id.rb_two); |
|||
break; |
|||
} |
|||
case "平面": { radioGroup.check(R.id.rb_three); |
|||
break; |
|||
} |
|||
case "竖直向左": { radioGroup.check(R.id.rb_four); |
|||
break; |
|||
} |
|||
default: |
|||
|
|||
radioGroup.clearCheck(); |
|||
break; |
|||
|
|||
} |
|||
|
|||
|
|||
// 设置确定按钮点击事件
|
|||
confirmButton.setOnClickListener(v -> { //手动模式弹窗确认
|
|||
if (radioGroup.getCheckedRadioButtonId() != -1) { //有按钮选中时按确定 更新值
|
|||
mainActivity.mainBinding.manualModeDisplay.setText(mainActivity._Manual_Mode_Call_Value); |
|||
|
|||
mainActivity._Auto_Mode_Call_Value="未启用"; |
|||
mainActivity.mainBinding.autoModeDisplay.setText("未启用"); |
|||
//读取数据库,并对其他控件进行赋值
|
|||
Toast.makeText(mainActivity, "设置成功", Toast.LENGTH_SHORT).show(); |
|||
} |
|||
|
|||
|
|||
dialog.dismiss(); // 关闭弹窗
|
|||
}); |
|||
|
|||
// 设置取消按钮点击事件
|
|||
cancelButton.setOnClickListener(v -> { |
|||
Toast.makeText(mainActivity, "点击了取消", Toast.LENGTH_SHORT).show(); |
|||
|
|||
dialog.dismiss(); // 关闭弹窗
|
|||
}); |
|||
dialog.show(); // 显示弹窗
|
|||
|
|||
} |
|||
//自动模式弹窗
|
|||
public void AutoModePopup(View.OnClickListener context) { |
|||
Dialog dialog = new Dialog(mainActivity); |
|||
|
|||
dialog.setContentView(R.layout.automodepopup); // 设置自定义布局
|
|||
dialog.setCancelable(true); // 设置点击外部是否关闭弹窗
|
|||
|
|||
// 获取布局中的视图
|
|||
Button cancelButton = dialog.findViewById(R.id.autoModeCancel); |
|||
Button confirmButton = dialog.findViewById(R.id.autoModeApply); |
|||
EditText workLength_Edit=dialog.findViewById(R.id.worklength_input); |
|||
EditText workWidth_Edit=dialog.findViewById(R.id.workwidth_input); |
|||
|
|||
workLength_Edit.setText(mainActivity.workLength); |
|||
workWidth_Edit.setText(mainActivity.workWidth); |
|||
RadioGroup radioGroup = (RadioGroup) dialog.findViewById(R.id.autoModeSelectorGroup); |
|||
|
|||
//2种模式
|
|||
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { |
|||
@Override |
|||
public void onCheckedChanged(RadioGroup group, int checkedId) { |
|||
RadioButton radioButton = (RadioButton) group.findViewById(checkedId); |
|||
if(radioButton!=null){ |
|||
mainActivity._Auto_Mode_Call_Value = radioButton.getText().toString(); |
|||
} |
|||
|
|||
} |
|||
}); |
|||
|
|||
String ii= mainActivity.mainBinding.autoModeDisplay.getText().toString(); |
|||
switch (ii) |
|||
{ |
|||
|
|||
case "水平": { radioGroup.check(R.id.rb_five); |
|||
break; |
|||
} |
|||
case "平面": { radioGroup.check(R.id.rb_six); |
|||
break; |
|||
} |
|||
default: |
|||
radioGroup.clearCheck();//清除选中
|
|||
break; |
|||
|
|||
} |
|||
|
|||
|
|||
// 设置确定按钮点击事件
|
|||
confirmButton.setOnClickListener(v -> { |
|||
|
|||
if (radioGroup.getCheckedRadioButtonId() != -1) { //有按钮选中时按确定 更新值
|
|||
mainActivity.mainBinding.autoModeDisplay.setText(mainActivity._Auto_Mode_Call_Value); |
|||
//失能手动模式
|
|||
mainActivity._Manual_Mode_Call_Value="未启用"; |
|||
mainActivity.mainBinding.manualModeDisplay.setText("未启用"); |
|||
|
|||
Toast.makeText(mainActivity, "设置成功", Toast.LENGTH_SHORT).show(); |
|||
} |
|||
|
|||
//检查作业宽度 长度 范围
|
|||
int value1=0; int value2=0; |
|||
try { |
|||
value1=Integer.parseInt(String.valueOf(workLength_Edit.getText())); |
|||
value2=Integer.parseInt(String.valueOf(workWidth_Edit.getText())); |
|||
} |
|||
catch(Exception e) |
|||
{ |
|||
Toast.makeText(mainActivity, "输入不能为空", Toast.LENGTH_SHORT).show(); |
|||
return; |
|||
} |
|||
|
|||
if(value1>=0 && value1<=50) |
|||
{ |
|||
mainActivity.workLength=String.valueOf(value1); |
|||
|
|||
}else{ |
|||
Toast.makeText(mainActivity, "请输入0-50的数字", Toast.LENGTH_SHORT).show(); |
|||
workLength_Edit.setText("0"); |
|||
return; |
|||
} |
|||
if(value2>=0 && value2<=50) |
|||
{ |
|||
mainActivity.workWidth=String.valueOf(value2); |
|||
|
|||
}else{ |
|||
Toast.makeText(mainActivity, "请输入0-50的数字", Toast.LENGTH_SHORT).show(); |
|||
workWidth_Edit.setText("0"); |
|||
return; |
|||
} |
|||
|
|||
dialog.dismiss(); // 关闭弹窗
|
|||
}); |
|||
|
|||
|
|||
|
|||
// 设置取消按钮点击事件
|
|||
cancelButton.setOnClickListener(v -> { |
|||
Toast.makeText(mainActivity, "点击了取消", Toast.LENGTH_SHORT).show(); |
|||
|
|||
dialog.dismiss(); // 关闭弹窗
|
|||
}); |
|||
dialog.show(); // 显示弹窗
|
|||
|
|||
} |
|||
|
|||
public void SwingArmPopup() { |
|||
Dialog dialog = new Dialog(mainActivity); |
|||
dialog.setContentView(R.layout.swingarmanglepopup); |
|||
dialog.setCancelable(true); |
|||
// 初始化控件
|
|||
LinearLayout inputContainer = dialog.findViewById(R.id.inputContainer);//对称
|
|||
LinearLayout buttonContainer = dialog.findViewById(R.id.buttonContainer);//非对称
|
|||
EditText editAngle = dialog.findViewById(R.id.EditAngleTo32); |
|||
RadioGroup radioGroup = dialog.findViewById(R.id.radioGroup); |
|||
RadioButton btn_left = dialog.findViewById(R.id.btn_left); |
|||
RadioButton btn_right = dialog.findViewById(R.id.btn_right); |
|||
|
|||
Button confirmBtn=dialog.findViewById(R.id.swingArmAngleApply); |
|||
Button cancleBtn=dialog.findViewById(R.id.swingArmAngleCancel); |
|||
|
|||
|
|||
//主界面值传过来
|
|||
editAngle.setText( mainActivity.mainBinding.MaintvSwingArmAngleTo32.getText()); |
|||
// 设置对称点击事件
|
|||
inputContainer.setOnClickListener(v -> { |
|||
mainActivity.symmetricalOrNot=1;// 1对称 2非对称
|
|||
|
|||
if (!mainActivity.isInputGroupActive) { |
|||
mainActivity.isInputGroupActive = true; |
|||
updateUIState(editAngle, radioGroup, inputContainer, buttonContainer); |
|||
} |
|||
}); |
|||
|
|||
// 设置非对称点击事件
|
|||
buttonContainer.setOnClickListener(v -> { |
|||
mainActivity.symmetricalOrNot=2; |
|||
if (mainActivity.isInputGroupActive) { |
|||
mainActivity.isInputGroupActive = false; |
|||
updateUIState(editAngle, radioGroup, buttonContainer, inputContainer); |
|||
} |
|||
}); |
|||
|
|||
//长按 和松手事件
|
|||
btn_left.setOnTouchListener(new View.OnTouchListener() { |
|||
@Override |
|||
public boolean onTouch(View view, MotionEvent motionEvent) { |
|||
switch (motionEvent.getAction()) { |
|||
case MotionEvent.ACTION_DOWN: |
|||
// 按下时设置为蓝色
|
|||
view.setBackgroundColor(ContextCompat.getColor(mainActivity, R.color.blue_green)); |
|||
|
|||
// 按钮按下事件
|
|||
view.setAlpha(0.7f); // 按下时降低透明度,提供视觉反馈
|
|||
mainActivity.asymmetricalAngleSetValue=1; |
|||
return true; |
|||
|
|||
case MotionEvent.ACTION_UP: |
|||
case MotionEvent.ACTION_CANCEL: |
|||
// 松开或取消时设置为灰色
|
|||
view.setBackgroundColor(ContextCompat.getColor(mainActivity, R.color.gray)); |
|||
view.setBackgroundColor(Color.TRANSPARENT); |
|||
// 按钮松开或取消事件
|
|||
view.setAlpha(1.0f); // 恢复透明度
|
|||
mainActivity.asymmetricalAngleSetValue=0; |
|||
return true; |
|||
} |
|||
|
|||
return true; |
|||
} |
|||
}); |
|||
|
|||
btn_right.setOnTouchListener(new View.OnTouchListener() { |
|||
@Override |
|||
public boolean onTouch(View view, MotionEvent motionEvent) { |
|||
switch (motionEvent.getAction()) { |
|||
case MotionEvent.ACTION_DOWN: |
|||
// 按下时设置为蓝色
|
|||
view.setBackgroundColor(ContextCompat.getColor(mainActivity, R.color.blue_green)); |
|||
|
|||
// 按钮按下事件
|
|||
view.setAlpha(0.7f); // 按下时降低透明度,提供视觉反馈
|
|||
mainActivity.asymmetricalAngleSetValue=2; |
|||
return true; |
|||
|
|||
case MotionEvent.ACTION_UP: |
|||
case MotionEvent.ACTION_CANCEL: |
|||
// 松开或取消时设置为灰色
|
|||
view.setBackgroundColor(ContextCompat.getColor(mainActivity, R.color.gray)); |
|||
view.setBackgroundColor(Color.TRANSPARENT); |
|||
// 按钮松开或取消事件
|
|||
view.setAlpha(1.0f); // 恢复透明度
|
|||
mainActivity.asymmetricalAngleSetValue=0; |
|||
return true; |
|||
} |
|||
|
|||
return true; |
|||
|
|||
} |
|||
}); |
|||
|
|||
|
|||
confirmBtn.setOnClickListener(new View.OnClickListener() { |
|||
@Override |
|||
public void onClick(View view) { |
|||
//检查对称角度输入范围
|
|||
String swingArmAngle_Edit=editAngle.getText().toString(); |
|||
if(swingArmAngle_Edit.equals("")) |
|||
{ |
|||
Toast.makeText(mainActivity, "左侧角度输入不应为空", Toast.LENGTH_SHORT).show(); |
|||
return; |
|||
} |
|||
int _tempValue = Integer.parseInt(swingArmAngle_Edit); |
|||
if (_tempValue <= 150 && _tempValue > 0) |
|||
{ |
|||
mainActivity.mainBinding.MaintvSwingArmAngleTo32.setText(swingArmAngle_Edit); |
|||
Toast.makeText(mainActivity, "左侧角度设置成功"+_tempValue, Toast.LENGTH_SHORT).show(); |
|||
} else |
|||
{ |
|||
Toast.makeText(mainActivity, "左侧输入数据不应大于150或者小于=0", Toast.LENGTH_SHORT).show(); |
|||
editAngle.setText("0"); |
|||
return; |
|||
} |
|||
/**************************************/ |
|||
dialog.dismiss(); |
|||
|
|||
} |
|||
}); |
|||
cancleBtn.setOnClickListener(new View.OnClickListener() { |
|||
@Override |
|||
public void onClick(View view) { |
|||
|
|||
dialog.dismiss(); |
|||
} |
|||
}); |
|||
|
|||
|
|||
// 初始状态设置
|
|||
if(mainActivity.isInputGroupActive) |
|||
{ |
|||
updateUIState(editAngle, radioGroup, inputContainer, buttonContainer); |
|||
} |
|||
else { |
|||
updateUIState(editAngle, radioGroup, buttonContainer, inputContainer); |
|||
} |
|||
|
|||
|
|||
dialog.show(); |
|||
} |
|||
public void BackSetPopup() { |
|||
Dialog dialog = new Dialog(mainActivity); |
|||
dialog.setContentView(R.layout.backsetpopup); |
|||
dialog.setCancelable(true); |
|||
|
|||
// 初始化控件
|
|||
LinearLayout firstInputContainer = dialog.findViewById(R.id.firstInputContainer); |
|||
LinearLayout secondInputContainer = dialog.findViewById(R.id.secondInputContainer); |
|||
firstEditText = dialog.findViewById(R.id.firstEditText); |
|||
secondEditText = dialog.findViewById(R.id.secondEditText); |
|||
Button confirmButton= dialog.findViewById(R.id.backDistanceApply); |
|||
Button cancleButton= dialog.findViewById(R.id.backDistanceCancel); |
|||
firstEditText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter()}); //editext 一位小数限制
|
|||
secondEditText.setFilters(new InputFilter[]{new DecimalDigitsInputFilter()}); //editext 一位小数限制
|
|||
//界面值传过来
|
|||
firstEditText.setText(mainActivity.mainBinding.MaintvBackDistanceTo32.getText()); |
|||
secondEditText.setText(mainActivity.backSpeedSetValue); |
|||
// 设置第一个打退交替点击事件
|
|||
firstInputContainer.setOnClickListener(v -> { |
|||
mainActivity.backMode=1; |
|||
if (! mainActivity.isFirstInputActive) { |
|||
mainActivity.isFirstInputActive = true; |
|||
updateUIState2(firstEditText, secondEditText, |
|||
firstInputContainer, secondInputContainer); |
|||
} |
|||
}); |
|||
|
|||
// 设置边打边退点击事件
|
|||
secondInputContainer.setOnClickListener(v -> { |
|||
mainActivity.backMode=2; |
|||
if ( mainActivity.isFirstInputActive) { |
|||
mainActivity.isFirstInputActive = false; |
|||
updateUIState2(secondEditText, firstEditText, |
|||
secondInputContainer, firstInputContainer); |
|||
} |
|||
}); |
|||
|
|||
|
|||
//确定按钮点击事件
|
|||
confirmButton.setOnClickListener(new View.OnClickListener() { |
|||
@Override |
|||
public void onClick(View view) { |
|||
//检查后退距离输入范围
|
|||
String backDistance_Edit= firstEditText.getText().toString(); |
|||
if(backDistance_Edit.equals("")) |
|||
{ |
|||
Toast.makeText(mainActivity, "左侧输入不应为空", Toast.LENGTH_SHORT).show(); |
|||
//dialog.dismiss(); // 关闭弹窗
|
|||
return; |
|||
} |
|||
double _tempValue = Double.parseDouble(backDistance_Edit); |
|||
|
|||
if (_tempValue <= 100 && _tempValue >= 0) |
|||
{ |
|||
mainActivity.mainBinding.MaintvBackDistanceTo32.setText(String.valueOf(_tempValue)); |
|||
Toast.makeText(mainActivity, "左侧设置成功", Toast.LENGTH_SHORT).show(); |
|||
} else { |
|||
Toast.makeText(mainActivity, "左侧输入数据不应大于100或者小于=0", Toast.LENGTH_SHORT).show(); |
|||
firstEditText.setText("0.1"); |
|||
return; |
|||
} |
|||
/**************************************/ |
|||
//检查后退速度输入范围
|
|||
String backDistance_Edit1= secondEditText.getText().toString(); |
|||
if(backDistance_Edit1.equals("")) |
|||
{ |
|||
Toast.makeText(mainActivity, "右侧输入不应为空", Toast.LENGTH_SHORT).show(); |
|||
return; |
|||
} |
|||
double _tempValue1 = Double.parseDouble(backDistance_Edit1); |
|||
if (_tempValue1 <= 20 && _tempValue1 >= 0) |
|||
{ |
|||
mainActivity.backSpeedSetValue=String.valueOf(_tempValue1) ; |
|||
Toast.makeText(mainActivity, "右侧设置成功", Toast.LENGTH_SHORT).show(); |
|||
} else { |
|||
Toast.makeText(mainActivity, "右侧输入数据不应大于20或者小于=0", Toast.LENGTH_SHORT).show(); |
|||
secondEditText.setText(""); |
|||
return; |
|||
} |
|||
Toast.makeText(mainActivity, "设置成功", Toast.LENGTH_SHORT).show(); |
|||
dialog.dismiss(); // 关闭弹窗
|
|||
} |
|||
}); |
|||
|
|||
//取消按钮点击事件
|
|||
cancleButton.setOnClickListener(new View.OnClickListener() { |
|||
@Override |
|||
public void onClick(View view) { |
|||
|
|||
dialog.dismiss(); |
|||
} |
|||
}); |
|||
// 初始状态设置 确定再次进入 按钮保持选中状态
|
|||
if(mainActivity.isFirstInputActive) |
|||
{ |
|||
updateUIState2(firstEditText, secondEditText, |
|||
firstInputContainer, secondInputContainer); |
|||
|
|||
} |
|||
else { |
|||
updateUIState2(secondEditText, firstEditText, |
|||
secondInputContainer, firstInputContainer); |
|||
|
|||
} |
|||
|
|||
dialog.show(); |
|||
|
|||
|
|||
} |
|||
|
|||
public void ParametersCallPopup(View.OnClickListener context,MyDataHelper myDataHelper ) { |
|||
Dialog dialog = new Dialog(mainActivity); |
|||
dialog.setContentView(R.layout.parameters_call); // 设置自定义布局
|
|||
dialog.setCancelable(true); // 设置点击外部是否关闭弹窗
|
|||
|
|||
// 获取布局中的视图
|
|||
Button exitButton = dialog.findViewById(R.id.parametersExit); |
|||
Button confirmButton = dialog.findViewById(R.id.parametersApply); |
|||
Button saveButton=dialog.findViewById(R.id.parametersSavebtn); |
|||
Button clearButton=dialog.findViewById(R.id.parametersClearBtn); |
|||
RadioGroup radioGroup = (RadioGroup) dialog.findViewById(R.id.parameters_call_group); |
|||
|
|||
|
|||
Integer ii= ConvertHelper.convertEditTextToInt(mainActivity.mainBinding.MaintvParameterCallTo32); |
|||
|
|||
switch (ii) |
|||
{ |
|||
case 1: { radioGroup.check(R.id.rb_one); |
|||
break; |
|||
} |
|||
case 2: { radioGroup.check(R.id.rb_two); |
|||
break; |
|||
} |
|||
case 3: { radioGroup.check(R.id.rb_three); |
|||
break; |
|||
} |
|||
case 4: { radioGroup.check(R.id.rb_four); |
|||
break; |
|||
} |
|||
case 5: { radioGroup.check(R.id.rb_five); |
|||
break; |
|||
} |
|||
} |
|||
|
|||
dialog.show(); // 显示弹窗
|
|||
//调用值更新
|
|||
radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { |
|||
@Override |
|||
public void onCheckedChanged(RadioGroup group, int checkedId) { |
|||
RadioButton radioButton = (RadioButton) group.findViewById(checkedId); |
|||
result = radioButton.getText().toString(); |
|||
// mainActivity._parameters_Call_Value = result;
|
|||
} |
|||
}); |
|||
//保存按钮 获取界面参数 存入数据库
|
|||
saveButton.setOnClickListener(new View.OnClickListener() { |
|||
@Override |
|||
public void onClick(View view) { |
|||
//获取界面参数以写进数据库
|
|||
int paraIndex = Integer.parseInt(mainActivity.mainBinding.MaintvParameterCallTo32.getText().toString()); |
|||
int laneChangeDistance = Integer.parseInt(mainActivity.mainBinding.MaintvLaneChangeDistanceTo32.getText().toString()); |
|||
int swingArmSpeed = Integer.parseInt(mainActivity.mainBinding.MaintvSwingArmSpeedTo32.getText().toString()); |
|||
int swingArmAngle = Integer.parseInt(mainActivity.mainBinding.MaintvSwingArmAngleTo32.getText().toString()); |
|||
double backDistance = Double.parseDouble(mainActivity.mainBinding.MaintvBackDistanceTo32.getText().toString()); |
|||
double backSpeed = Double.parseDouble(mainActivity.backSpeedSetValue); |
|||
int pressSet = Integer.parseInt(mainActivity.mainBinding.MaintvPressTo32.getText().toString()); |
|||
double verticalAdjust = Double.parseDouble(mainActivity.mainBinding.MaintvVerticalAdjustTo32.getText().toString()); |
|||
int workLength = Integer.parseInt(mainActivity.workLength); |
|||
int workWidth = Integer.parseInt(mainActivity.workWidth); |
|||
|
|||
//把界面中的值放进PV类的变量中
|
|||
DisplayPV displayPV = new DisplayPV(paraIndex, laneChangeDistance,swingArmSpeed,swingArmAngle, backDistance,backSpeed,pressSet, verticalAdjust, workLength,workWidth ); |
|||
myDataHelper.addOrUpdateDisplayData(displayPV); //创建数据库的实例在这里 PV传进去保存到数据库
|
|||
Toast.makeText(dialog.getContext(), "保存成功", Toast.LENGTH_SHORT).show(); |
|||
} |
|||
}); |
|||
|
|||
//清除按钮 界面显示设为默认值 并存入数据库
|
|||
clearButton.setOnClickListener(new View.OnClickListener() { |
|||
@Override |
|||
public void onClick(View view) { |
|||
mainActivity.mainBinding.MaintvLaneChangeDistanceTo32.setText(String.valueOf(1)); |
|||
mainActivity.mainBinding.MaintvSwingArmSpeedTo32.setText(String.valueOf(1)); |
|||
mainActivity.mainBinding.MaintvSwingArmAngleTo32.setText(String.valueOf(1)); |
|||
mainActivity.mainBinding.MaintvBackDistanceTo32.setText(String.valueOf(1)); |
|||
mainActivity.backSpeedSetValue=String.valueOf(1.0); |
|||
mainActivity.mainBinding.MaintvPressTo32.setText(String.valueOf(1)); |
|||
mainActivity.mainBinding.MaintvVerticalAdjustTo32.setText(String.valueOf(1)); |
|||
mainActivity.workLength=String.valueOf(1); |
|||
mainActivity.workWidth=String.valueOf(1); |
|||
//获取界面参数以写进数据库
|
|||
int paraIndex = Integer.parseInt(mainActivity.mainBinding.MaintvParameterCallTo32.getText().toString()); |
|||
int laneChangeDistance = Integer.parseInt(mainActivity.mainBinding.MaintvLaneChangeDistanceTo32.getText().toString()); |
|||
int swingArmSpeed = Integer.parseInt(mainActivity.mainBinding.MaintvSwingArmSpeedTo32.getText().toString()); |
|||
int swingArmAngle = Integer.parseInt(mainActivity.mainBinding.MaintvSwingArmAngleTo32.getText().toString()); |
|||
double backDistance = Double.parseDouble(mainActivity.mainBinding.MaintvBackDistanceTo32.getText().toString()); |
|||
double backSpeed =Double.parseDouble(mainActivity.backSpeedSetValue); |
|||
int pressSet =Integer.parseInt(mainActivity.mainBinding.MaintvPressTo32.getText().toString()); |
|||
double verticalAdjust =Double.parseDouble(mainActivity.mainBinding.MaintvVerticalAdjustTo32.getText().toString()); |
|||
int workLength = Integer.parseInt(mainActivity.workLength); |
|||
int workWidth = Integer.parseInt(mainActivity.workWidth); |
|||
//把界面中的值放进PV类的变量中
|
|||
DisplayPV displayPV = new DisplayPV(paraIndex, laneChangeDistance,swingArmSpeed,swingArmAngle, backDistance,backSpeed, pressSet, verticalAdjust, workLength,workWidth ); |
|||
myDataHelper.addOrUpdateDisplayData(displayPV); //创建数据库的实例在这里 PV传进去保存到数据库
|
|||
Toast.makeText(dialog.getContext(), "清除成功", Toast.LENGTH_SHORT).show(); |
|||
} |
|||
}); |
|||
|
|||
// 使用按钮 点击事件 //把主界面 调用值显示 改了 并从数据库中读赋值给界面
|
|||
confirmButton.setOnClickListener(v -> { |
|||
mainActivity._parameters_Call_Value = result; |
|||
mainActivity.mainBinding.MaintvParameterCallTo32.setText(mainActivity._parameters_Call_Value);//把主界面 调用值显示 改了
|
|||
|
|||
//读取数据
|
|||
int paraIndex = Integer.parseInt(mainActivity._parameters_Call_Value); |
|||
List<DisplayPV> pvList = mainActivity.myDataHelper.getDisplayData(paraIndex);//从数据库中读,,并对其他控件进行赋值
|
|||
mainActivity.backSpeedSetValue=String.valueOf(pvList.get(0).getBackSpeedValue()); |
|||
mainActivity.mainBinding.MaintvLaneChangeDistanceTo32.setText(String.valueOf(pvList.get(0).getLaneChangeDistance())); |
|||
mainActivity.mainBinding.MaintvSwingArmSpeedTo32.setText(String.valueOf(pvList.get(0).getSwingArmSpeed())); |
|||
mainActivity.mainBinding.MaintvSwingArmAngleTo32.setText(String.valueOf(pvList.get(0).getSwingArmAngle())); |
|||
mainActivity.mainBinding.MaintvBackDistanceTo32.setText(String.valueOf(pvList.get(0).getBackDistance())); |
|||
mainActivity.mainBinding.MaintvPressTo32.setText(String.valueOf(pvList.get(0).getPressSet())); |
|||
mainActivity.mainBinding.MaintvVerticalAdjustTo32.setText(String.valueOf(pvList.get(0).getVerticalAdjust())); |
|||
mainActivity.workLength=String.valueOf(pvList.get(0).getWorkLength()); |
|||
mainActivity.workWidth=String.valueOf(pvList.get(0).getWorkWidth()); |
|||
|
|||
//读取数据库,并对其他控件进行赋值
|
|||
Toast.makeText(dialog.getContext(), "调用成功", Toast.LENGTH_SHORT).show(); |
|||
|
|||
// dialog.dismiss(); // 关闭弹窗
|
|||
}); |
|||
|
|||
|
|||
|
|||
// 退出按钮点击事件
|
|||
exitButton.setOnClickListener(v -> { |
|||
Toast.makeText(dialog.getContext(), "点击了退出", Toast.LENGTH_SHORT).show(); |
|||
dialog.dismiss(); // 关闭弹窗
|
|||
}); |
|||
|
|||
|
|||
|
|||
} |
|||
|
|||
|
|||
public void RobotErrorListPopUp(View.OnClickListener context) |
|||
{ |
|||
Dialog dialog = new Dialog(mainActivity); |
|||
|
|||
dialog.setContentView(R.layout.log_item); // 设置自定义布局
|
|||
dialog.setCancelable(true); // 设置点击外部是否关闭弹窗
|
|||
|
|||
TextView LogText = dialog.findViewById(R.id.popUpErrorLogTextView); |
|||
ScrollBottomScrollView LogScrollView = dialog.findViewById(R.id.popUpErrorLogScrollview); |
|||
List<ErrorModel> list = mainActivity.myDataHelper.GetAllErrorModels(); //读取错误表
|
|||
LogText.setMovementMethod(ScrollingMovementMethod.getInstance()); |
|||
|
|||
final int[] firstDisplay = {1}; |
|||
final int[] display = {2}; |
|||
final int[] displayOver = {0}; |
|||
int displayNum = 25; |
|||
LogScrollView.post(new Runnable() { |
|||
@Override |
|||
public void run() { |
|||
if(firstDisplay[0] == 1){ |
|||
//滑动顶部
|
|||
LogScrollView.fullScroll(ScrollView.FOCUS_UP); |
|||
firstDisplay[0] = 0; |
|||
} |
|||
} |
|||
}); |
|||
|
|||
LogScrollView.onScrollViewScrollToBottom(new ScrollBottomScrollView.OnScrollBottomListener() { |
|||
@Override |
|||
public void scrollToBottom() { |
|||
//请求数据
|
|||
if (!list.isEmpty()) { |
|||
if(list.size()>displayNum * display[0]) { |
|||
for(int i = list.size() - displayNum * (display[0]-1); i-- > list.size() - displayNum * display[0];){ |
|||
ErrorModel item = list.get(i); |
|||
String RobotErrorLog = item.getDateTimeBJ() + item.getErrorInfo() +"\n"; |
|||
LogText.append(RobotErrorLog); |
|||
} |
|||
display[0] ++; |
|||
} |
|||
else{ |
|||
if(displayOver[0]==0){ |
|||
for(int i = list.size() - displayNum * (display[0]-1); i-- > 0;){ |
|||
ErrorModel item = list.get(i); |
|||
String RobotErrorLog = item.getDateTimeBJ() + item.getErrorInfo() +"\n"; |
|||
LogText.append(RobotErrorLog); |
|||
displayOver[0]=1; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
}}); |
|||
|
|||
if (!list.isEmpty()) { |
|||
|
|||
if(list.size()>displayNum) { |
|||
|
|||
for(int i = list.size(); i-- > list.size() - displayNum;){ |
|||
ErrorModel item = list.get(i); |
|||
String RobotErrorLog = item.getDateTimeBJ() + item.getErrorInfo() +"\n"; |
|||
LogText.append(RobotErrorLog); |
|||
} |
|||
} |
|||
else{ |
|||
for(int i = list.size(); i-- > 0;){ |
|||
ErrorModel item = list.get(i); |
|||
String RobotErrorLog = item.getDateTimeBJ() + item.getErrorInfo() +"\n"; |
|||
LogText.append(RobotErrorLog); |
|||
} |
|||
} |
|||
|
|||
} |
|||
// String list3 = mainActivity.myDataHelper.DeleteAllErrorModels();
|
|||
|
|||
dialog.show(); // 显示弹窗
|
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
// 更新后退距离UI状态的辅助方法
|
|||
private void updateUIState2(EditText activeEditText, EditText inactiveEditText, |
|||
View activeContainer, View inactiveContainer) { |
|||
// 更新输入框状态
|
|||
activeEditText.setEnabled(true); |
|||
activeEditText.requestFocus(); |
|||
|
|||
inactiveEditText.setEnabled(false); |
|||
inactiveEditText.clearFocus(); |
|||
|
|||
// 显示/隐藏软键盘
|
|||
InputMethodManager imm = (InputMethodManager) mainActivity.getSystemService(Context.INPUT_METHOD_SERVICE); |
|||
imm.showSoftInput(activeEditText, InputMethodManager.SHOW_IMPLICIT); |
|||
imm.hideSoftInputFromWindow(inactiveEditText.getWindowToken(), 0); |
|||
|
|||
|
|||
|
|||
// 更新容器样式
|
|||
activeContainer.setBackgroundResource(R.drawable.container_active); |
|||
inactiveContainer.setBackgroundResource(R.drawable.container_inactive); |
|||
} |
|||
|
|||
// 更新摆臂角度UI状态的辅助方法
|
|||
private void updateUIState(EditText editText, RadioGroup radioGroup, |
|||
View activeContainer, View inactiveContainer) { |
|||
// 更新输入框状态
|
|||
editText.setEnabled(mainActivity.isInputGroupActive); //
|
|||
if (mainActivity.isInputGroupActive) { |
|||
editText.requestFocus(); |
|||
// 显示软键盘
|
|||
InputMethodManager imm = (InputMethodManager) mainActivity.getSystemService(Context.INPUT_METHOD_SERVICE); |
|||
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); |
|||
} else { |
|||
// 隐藏软键盘
|
|||
InputMethodManager imm = (InputMethodManager) mainActivity.getSystemService(Context.INPUT_METHOD_SERVICE); |
|||
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); |
|||
} |
|||
|
|||
// 更新按钮组状态 true失能 fasle 使能 全部未选中
|
|||
radioGroup.setEnabled(!mainActivity.isInputGroupActive); |
|||
for (int i = 0; i < radioGroup.getChildCount(); i++) { |
|||
radioGroup.getChildAt(i).setEnabled(!mainActivity.isInputGroupActive); |
|||
} |
|||
|
|||
// 重置按钮选择状态
|
|||
if (!mainActivity.isInputGroupActive) { |
|||
radioGroup.clearCheck(); |
|||
} |
|||
|
|||
|
|||
// 更新容器样式
|
|||
activeContainer.setBackgroundResource(R.drawable.container_active); |
|||
// activeContainer.setBackgroundResource(R.drawable.container_inactive);
|
|||
inactiveContainer.setBackgroundResource(R.drawable.container_inactive); |
|||
} |
|||
|
|||
} //根类
|
|||
|
|||
|
|||
@ -0,0 +1,63 @@ |
|||
package com.example.swingarmapp_sandblast.services; |
|||
|
|||
import com.example.swingarmapp_sandblast.models.BspIV; |
|||
import com.example.swingarmapp_sandblast.models.BspPV; |
|||
import com.google.protobuf.InvalidProtocolBufferException; |
|||
|
|||
public class RobotDataHanlder { |
|||
|
|||
|
|||
public static void test() |
|||
{ |
|||
//byte[] data=hexToByteArray("080110830118313A04B1CBBACF");
|
|||
byte[] data=hexToByteArray("100A180A28013A32B1CBBACF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"); |
|||
|
|||
|
|||
|
|||
} |
|||
public static void DeoodeDataFromRobot(byte[] data) |
|||
{ |
|||
try |
|||
{ |
|||
if(data[0]==0x55&&data[1]==0x55) |
|||
{ |
|||
if (data[2]==0x01) |
|||
{ |
|||
BspIV.IV_struct_define iv = BspIV.IV_struct_define.parseFrom(data); |
|||
}else if(data[2]==0x02) |
|||
{ |
|||
BspPV.PV_struct_define pv = BspPV.PV_struct_define.parseFrom(data); |
|||
} |
|||
} |
|||
} catch (InvalidProtocolBufferException e) |
|||
{ |
|||
|
|||
} |
|||
|
|||
|
|||
} |
|||
|
|||
public static byte[] hexToByteArray(String inHex){ |
|||
int hexlen = inHex.length(); |
|||
byte[] result; |
|||
if (hexlen % 2 == 1){ |
|||
//奇数
|
|||
hexlen++; |
|||
result = new byte[(hexlen/2)]; |
|||
inHex="0"+inHex; |
|||
}else { |
|||
//偶数
|
|||
result = new byte[(hexlen/2)]; |
|||
} |
|||
int j=0; |
|||
for (int i = 0; i < hexlen; i+=2){ |
|||
result[j]=hexToByte(inHex.substring(i,i+2)); |
|||
j++; |
|||
} |
|||
return result; |
|||
} |
|||
public static byte hexToByte(String inHex){ |
|||
return (byte)Integer.parseInt(inHex,16); |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,451 @@ |
|||
package com.example.swingarmapp_sandblast.services; |
|||
|
|||
|
|||
import static com.example.swingarmapp_sandblast.services.ErrorDeocdeHelper.ErrorDeocde; |
|||
|
|||
import android.app.PendingIntent; |
|||
import android.content.BroadcastReceiver; |
|||
import android.content.Context; |
|||
import android.content.Intent; |
|||
import android.content.IntentFilter; |
|||
import android.hardware.usb.UsbDevice; |
|||
import android.hardware.usb.UsbDeviceConnection; |
|||
import android.hardware.usb.UsbManager; |
|||
import android.os.Build; |
|||
import android.os.CountDownTimer; |
|||
import android.os.Handler; |
|||
import android.os.Looper; |
|||
|
|||
import androidx.core.content.ContextCompat; |
|||
|
|||
import com.example.swingarmapp_sandblast.BuildConfig; |
|||
import com.example.swingarmapp_sandblast.MainActivity; |
|||
import com.example.swingarmapp_sandblast.models.ErrorModel; |
|||
import com.hoho.android.usbserial.driver.UsbSerialDriver; |
|||
import com.hoho.android.usbserial.driver.UsbSerialPort; |
|||
import com.hoho.android.usbserial.driver.UsbSerialProber; |
|||
import com.hoho.android.usbserial.util.SerialInputOutputManager; |
|||
import com.example.swingarmapp_sandblast.models.BspIV; |
|||
|
|||
import java.io.IOException; |
|||
import java.util.ArrayList; |
|||
import java.util.Iterator; |
|||
import java.util.List; |
|||
import java.util.Objects; |
|||
|
|||
public class USBSerialPortHelper implements SerialInputOutputManager.Listener { |
|||
|
|||
|
|||
public USBSerialPortHelper(MainActivity mainActivity) |
|||
{ |
|||
this.MainActivity=mainActivity; |
|||
} |
|||
|
|||
private MainActivity MainActivity; |
|||
//sserial port part start
|
|||
|
|||
private enum UsbPermission {Unknown, Requested, Granted, Denied} |
|||
|
|||
private final String INTENT_ACTION_GRANT_USB = BuildConfig.APPLICATION_ID + ".GRANT_USB"; |
|||
|
|||
|
|||
// <usb-device vendor-id="4292" product-id="60000" /> <!-- 0xea60: CP2102 and other CP210x single port devices -->
|
|||
// <usb-device vendor-id="4292" product-id="60016" /> <!-- 0xea70: CP2105 -->
|
|||
// <usb-device vendor-id="4292" product-id="60017" /> <!-- 0xea71: CP2108 -->
|
|||
|
|||
|
|||
private int deviceId = 60000; |
|||
private int deviceId_test = 60000; |
|||
private int portNum; |
|||
private final int WRITE_WAIT_MILLIS = 500; |
|||
private final int READ_WAIT_MILLIS = 100; |
|||
private String PortNameContians = "SILICON";/**/ |
|||
// private static String PortNameContians="FTD";
|
|||
private int baudRate = 57600; |
|||
private boolean withIoManager = true; |
|||
|
|||
private BroadcastReceiver broadcastReceiver; |
|||
private Handler mainLooper; |
|||
|
|||
private SerialInputOutputManager usbIoManager; |
|||
private UsbSerialPort usbSerialPort; |
|||
private UsbPermission usbPermission = UsbPermission.Unknown; |
|||
private boolean connected = false; |
|||
|
|||
String errorLast = ""; |
|||
|
|||
public void intialize() { |
|||
|
|||
broadcastReceiver = new BroadcastReceiver() { |
|||
@Override |
|||
public void onReceive(Context context, Intent intent) { |
|||
if (INTENT_ACTION_GRANT_USB.equals(intent.getAction())) { |
|||
usbPermission = intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false) ? UsbPermission.Granted : UsbPermission.Denied; |
|||
connect(); |
|||
} |
|||
} |
|||
}; |
|||
mainLooper = new Handler(Looper.getMainLooper()); |
|||
_receiveBufferlist = new ArrayList<Byte>(); |
|||
} |
|||
|
|||
/* |
|||
* Serial |
|||
*/ |
|||
@Override |
|||
public void onNewData(byte[] data) { |
|||
// status("new data");
|
|||
mainLooper.post(() -> { |
|||
receive(data); |
|||
// receive data
|
|||
}); |
|||
} |
|||
|
|||
@Override |
|||
public void onRunError(Exception e) { |
|||
mainLooper.post(() -> { |
|||
// status("connection lost: " + e.getMessage());
|
|||
disconnect(); |
|||
}); |
|||
} |
|||
|
|||
/* |
|||
* Serial + UI |
|||
*/ |
|||
|
|||
public void connect() { |
|||
|
|||
UsbDevice device = null; |
|||
UsbManager usbManager = (UsbManager) MainActivity.getSystemService(Context.USB_SERVICE); |
|||
for (UsbDevice v : usbManager.getDeviceList().values()) { |
|||
// status(v.getManufacturerName().toUpperCase());
|
|||
if (v.getManufacturerName().toUpperCase().contains(PortNameContians)) { |
|||
device = v; |
|||
break; |
|||
} |
|||
} |
|||
|
|||
if (device == null) { |
|||
// _serialPortSwitch.setChecked(false);
|
|||
|
|||
// status("找不到设备");
|
|||
return; |
|||
} |
|||
UsbSerialDriver driver = UsbSerialProber.getDefaultProber().probeDevice(device); |
|||
if (driver == null) { |
|||
driver = CustomProber.getCustomProber().probeDevice(device); |
|||
} |
|||
if (driver == null) { |
|||
// _serialPortSwitch.setChecked(false);
|
|||
// status("无驱动");
|
|||
return; |
|||
} |
|||
if (driver.getPorts().size() < portNum) //就是0 cp2102 或者同一个驱动,第一个
|
|||
{ |
|||
//status("connection failed: not enough ports at device");
|
|||
//status("找不到设备");
|
|||
return; |
|||
} |
|||
usbSerialPort = driver.getPorts().get(portNum); |
|||
|
|||
UsbDeviceConnection usbConnection = usbManager.openDevice(driver.getDevice()); |
|||
if (usbConnection == null && usbPermission == UsbPermission.Unknown && !usbManager.hasPermission(driver.getDevice())) { |
|||
usbPermission = UsbPermission.Requested; |
|||
int flags = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? PendingIntent.FLAG_MUTABLE : 0; |
|||
Intent intent = new Intent(INTENT_ACTION_GRANT_USB); |
|||
intent.setPackage(MainActivity.getPackageName()); |
|||
PendingIntent usbPermissionIntent = PendingIntent.getBroadcast(MainActivity, 0, intent, flags); |
|||
usbManager.requestPermission(driver.getDevice(), usbPermissionIntent); |
|||
return; |
|||
} |
|||
if (usbConnection == null) { |
|||
if (!usbManager.hasPermission(driver.getDevice())) { |
|||
// status("connection failed: permission denied");
|
|||
} else { |
|||
// status("connection failed: open failed");
|
|||
} |
|||
|
|||
return; |
|||
} |
|||
|
|||
try { |
|||
usbSerialPort.open(usbConnection); |
|||
try { |
|||
usbSerialPort.setParameters(baudRate, 8, 1, UsbSerialPort.PARITY_NONE); |
|||
// status("connected: ");
|
|||
|
|||
} catch (UnsupportedOperationException e) { |
|||
//status("unsupport setparameters");
|
|||
} |
|||
if (withIoManager) { |
|||
usbIoManager = new SerialInputOutputManager(usbSerialPort, this); |
|||
usbIoManager.setReadBufferSize(40960); |
|||
usbIoManager.setReadTimeout(READ_WAIT_MILLIS); |
|||
usbIoManager.start(); |
|||
} |
|||
//status("connected");
|
|||
connected = true; |
|||
// _serialPortSwitch.setChecked(true);
|
|||
//switch set true
|
|||
|
|||
} catch (Exception e) { |
|||
// status("connection failed: " + e.getMessage());
|
|||
disconnect(); |
|||
} |
|||
} |
|||
|
|||
private void disconnect() { |
|||
connected = false; |
|||
|
|||
if (usbIoManager != null) { |
|||
usbIoManager.setListener(null); |
|||
usbIoManager.stop(); |
|||
} |
|||
usbIoManager = null; |
|||
try { |
|||
usbSerialPort.close(); |
|||
} catch (IOException ignored) { |
|||
|
|||
} |
|||
usbSerialPort = null; |
|||
} |
|||
|
|||
List<Byte> _receiveBufferlist; |
|||
|
|||
private static byte[] listTobyte(List<Byte> list) { |
|||
if (list == null || list.size() < 0) return null; |
|||
byte[] bytes = new byte[list.size()]; |
|||
int i = 0; |
|||
Iterator<Byte> iterator = list.iterator(); |
|||
while (iterator.hasNext()) { |
|||
bytes[i] = iterator.next(); |
|||
i++; |
|||
} |
|||
return bytes; |
|||
} |
|||
|
|||
boolean StartCountDown = false; |
|||
|
|||
// byte _receivedData
|
|||
private void receive(byte[] data) { |
|||
|
|||
// status("read data");
|
|||
for (int i = 0; i < data.length; i++) { |
|||
_receiveBufferlist.add(data[i]); |
|||
} |
|||
|
|||
//decodeRceive(data);
|
|||
if (StartCountDown == false)//从收到第一个数据开始计时
|
|||
{ |
|||
StartCountDown = true; |
|||
new CountDownTimer(400, 200) { |
|||
public void onTick(long millisUntilFinished) { |
|||
|
|||
} |
|||
public void onFinish() { |
|||
|
|||
// status("read finished");
|
|||
decodeRceive(listTobyte(_receiveBufferlist)); |
|||
_receiveBufferlist.clear(); |
|||
StartCountDown = false; |
|||
} |
|||
}.start(); |
|||
} |
|||
} |
|||
|
|||
|
|||
/* |
|||
逐位检查并构建二进制字符串 |
|||
*/ |
|||
String unsignedIntToBinary(int value) { |
|||
StringBuilder sb = new StringBuilder(32); |
|||
for (int i = 7; i >= 0; i--) { |
|||
sb.append((value & (1 << i)) == 0 ? '0' : '1'); |
|||
} |
|||
return sb.toString(); |
|||
} |
|||
/* |
|||
逐位检查并构建二进制字符串 每4位添加一个分隔符 |
|||
*/ |
|||
String unsignedIntToBinaryWithSeparator(int value) { |
|||
StringBuilder sb = new StringBuilder(35); |
|||
for (int i = 11; i >= 0; i--) { |
|||
sb.append((value & (1 << i)) == 0 ? '0' : '1'); |
|||
if (i % 4 == 0 && i != 0) { |
|||
sb.append(' '); // 每4位添加一个分隔符
|
|||
} |
|||
} |
|||
return sb.toString(); |
|||
} |
|||
String toHex4Digits(int value) { |
|||
char[] hexChars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; |
|||
int low16Bits = value & 0xFFFF; |
|||
|
|||
char[] result = new char[4]; |
|||
result[0] = hexChars[(low16Bits >> 12) & 0xF]; |
|||
result[1] = hexChars[(low16Bits >> 8) & 0xF]; |
|||
result[2] = hexChars[(low16Bits >> 4) & 0xF]; |
|||
result[3] = hexChars[low16Bits & 0xF]; |
|||
|
|||
return new String(result); |
|||
} |
|||
|
|||
private void decodeRceive(byte[] data) { |
|||
try { |
|||
|
|||
// String dataReceived = bytesToHex(data);
|
|||
//status(dataReceived);
|
|||
// if ((data[0] == 0xFE) && (data[1] == 0xFE))
|
|||
byte[] crcbytes = new byte[data.length - 2]; |
|||
System.arraycopy(data, 0, crcbytes, 0, data.length - 2); |
|||
byte[] crc=ModbusCRC.calculateCRC(crcbytes); |
|||
// status(bytesToHex(data));
|
|||
// status(String.valueOf(crc[0]+" "+ String.valueOf(crc[1])));
|
|||
if(data[data.length-2]==(byte)(crc[1]&0xff) && data[data.length-1]==(byte)(crc[0] & 0xff)) |
|||
{ |
|||
|
|||
if ((data[0] == 0x55) && (data[1] == 0x55) ) |
|||
{ |
|||
|
|||
byte[] bytes = new byte[data.length - 4]; |
|||
System.arraycopy(data, 2, bytes, 0, data.length - 4); |
|||
|
|||
BspIV.IV_struct_define _toReceiveIV=BspIV.IV_struct_define.parseFrom(bytes); |
|||
|
|||
if (_toReceiveIV!=null) |
|||
{ |
|||
MainActivity.mainBinding.tvSpeedFrom32.setText(String.valueOf((double)_toReceiveIV.getRobotMoveDeriSpeed()/10)); |
|||
|
|||
MainActivity.mainBinding.tvAngleFrom32.setText(String.valueOf((double)_toReceiveIV.getRobotGyro()/100)); |
|||
MainActivity.mainBinding.tvHeightFrom32.setText(String.valueOf((double)_toReceiveIV.getDistanceSensor()/10)); |
|||
|
|||
MainActivity.mainBinding.tvLCompensationFrom32.setText(String.valueOf((double)_toReceiveIV.getLeftCompensation()/100)); |
|||
|
|||
MainActivity.mainBinding.tvRCopmpensationFrom32.setText(String.valueOf(((double) _toReceiveIV.getRightCompensation()/100))); |
|||
|
|||
//
|
|||
if(_toReceiveIV.getIsOnline()==0) |
|||
{ |
|||
MainActivity.mainBinding.tvSignal.setText("断开"); |
|||
} |
|||
else if(_toReceiveIV.getIsOnline()==1) |
|||
{ |
|||
MainActivity.mainBinding.tvSignal.setText("已连接"); |
|||
} |
|||
|
|||
int errorInt = _toReceiveIV.getSystemError();//硬件错误
|
|||
String errorString2 = ErrorDeocde(errorInt); |
|||
String errorString = " # " + unsignedIntToBinaryWithSeparator(errorInt); |
|||
errorString += " " + toHex4Digits(_toReceiveIV.getLeftMotorErr()); |
|||
errorString += " " + toHex4Digits(_toReceiveIV.getRightMotorErr()); |
|||
errorString += " " + toHex4Digits(_toReceiveIV.getSwingMotorErr()); |
|||
|
|||
if(errorInt !=0 || _toReceiveIV.getLeftMotorErr()!=0 ||_toReceiveIV.getRightMotorErr()!=0 ||_toReceiveIV.getSwingMotorErr()!=0) |
|||
{ |
|||
if(!Objects.equals(errorLast, errorString)){ |
|||
ErrorModel em = new ErrorModel(System.currentTimeMillis(), errorString); |
|||
MainActivity.myDataHelper.AddOrUpdateErrorModel(em); |
|||
|
|||
if(Objects.equals(errorString2, "未复位")) |
|||
{ |
|||
MainActivity.mainBinding.mainViewErrMessageTxView.setText(String.valueOf(errorString2)); |
|||
} |
|||
else |
|||
{ |
|||
MainActivity.mainBinding.mainViewErrMessageTxView.setText("有"); |
|||
} |
|||
|
|||
errorLast = errorString; |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
MainActivity.mainBinding.mainViewErrMessageTxView.setText("无"); |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
}else |
|||
{ |
|||
// status("null");
|
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
}else |
|||
{ |
|||
|
|||
} |
|||
|
|||
}else |
|||
{ |
|||
//status("crc failed");
|
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
} catch (Exception e) { |
|||
|
|||
} |
|||
} |
|||
|
|||
public static String bytesToHex(byte[] bytes) { |
|||
StringBuilder result = new StringBuilder(); |
|||
for (byte b : bytes) { |
|||
result.append(String.format("%02X ", b & 0xFF)); |
|||
} |
|||
return result.toString(); |
|||
} |
|||
|
|||
public void onStart() { |
|||
|
|||
ContextCompat.registerReceiver(MainActivity, broadcastReceiver, new IntentFilter(INTENT_ACTION_GRANT_USB), ContextCompat.RECEIVER_NOT_EXPORTED); |
|||
//status("onStart");
|
|||
|
|||
} |
|||
|
|||
public void onStop() { |
|||
MainActivity.unregisterReceiver(broadcastReceiver); |
|||
// status("onStop");
|
|||
} |
|||
|
|||
|
|||
public void onResume() { |
|||
|
|||
if (!connected && (usbPermission == UsbPermission.Unknown || usbPermission == UsbPermission.Granted)) { |
|||
mainLooper.post(this::connect); |
|||
|
|||
} |
|||
} |
|||
|
|||
|
|||
public void onPause() { |
|||
if (connected) { |
|||
// status("串口断开");
|
|||
// _serialPortSwitch.setChecked(false);
|
|||
disconnect(); |
|||
} |
|||
} |
|||
public void SendData(byte[] data) { |
|||
if (connected) { |
|||
try { |
|||
usbSerialPort.write(data, WRITE_WAIT_MILLIS); |
|||
} catch (IOException e) |
|||
{ |
|||
// status("Send Failed");
|
|||
connected = false; |
|||
} |
|||
} |
|||
else { |
|||
//status("usb serialport disconnected");
|
|||
|
|||
} |
|||
|
|||
|
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,27 @@ |
|||
package com.example.swingarmapp_sandblast.services; |
|||
|
|||
|
|||
import cn.nodemedia.NodePlayer; |
|||
import cn.nodemedia.NodePlayerView; |
|||
|
|||
public class VideoPlayerHelper { |
|||
|
|||
|
|||
|
|||
public static void startVedio(NodePlayerView nodePlayerView, NodePlayer nodePlayer,String address ){ |
|||
|
|||
|
|||
nodePlayerView.setRenderType(NodePlayerView.RenderType.SURFACEVIEW);//设置渲染器类型
|
|||
nodePlayerView.setUIViewContentMode(NodePlayerView.UIViewContentMode.ScaleToFill);//设置视频画面缩放模式
|
|||
//nodePlayer=new NodePlayer(this);
|
|||
nodePlayer.setPlayerView(nodePlayerView);//设置播放视图
|
|||
//设置RTSP流使用的传输协议,支持的模式有:
|
|||
nodePlayer.setRtspTransport(NodePlayer.RTSP_TRANSPORT_TCP);//设置传输
|
|||
nodePlayer.setInputUrl(address); |
|||
nodePlayer.setVideoEnable(true);//设置视频启用
|
|||
nodePlayer.setBufferTime(100);//设置缓冲时间
|
|||
nodePlayer.setMaxBufferTime(200);//设置最大缓冲时间
|
|||
nodePlayer.start(); |
|||
} |
|||
} |
|||
|
|||
@ -0,0 +1,11 @@ |
|||
package com.example.swingarmapp_sandblast.viewmodels; |
|||
|
|||
import androidx.lifecycle.ViewModel; |
|||
|
|||
public class MainViewModel extends ViewModel { |
|||
|
|||
public MainViewModel() { |
|||
|
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,2 @@ |
|||
protoc --java_out . *.proto |
|||
pause |
|||
@ -0,0 +1,25 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
|
|||
<!-- 设置透明背景色 --> |
|||
<!-- <solid android:color="@color/gainsboro" />--> |
|||
<solid android:color="#f2f3f4" /> |
|||
<!-- 设置一个黑色边框 --> |
|||
<!-- <stroke--> |
|||
<!-- android:width="4px"--> |
|||
<!-- android:color="@color/deepskyblue" />--> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="8dp" |
|||
android:bottomRightRadius="8dp" |
|||
android:topLeftRadius="8dp" |
|||
android:topRightRadius="8dp" /> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
|
|||
|
After Width: | Height: | Size: 20 KiB |
@ -0,0 +1,25 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
|
|||
<!-- 设置透明背景色 --> |
|||
<!-- <solid android:color="@color/white" />--> |
|||
<solid android:color="#d6eaf8" /> |
|||
<!-- 设置一个黑色边框 --> |
|||
<!-- <stroke--> |
|||
<!-- android:width="4px"--> |
|||
<!-- android:color="@color/deepskyblue" />--> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="8dp" |
|||
android:bottomRightRadius="8dp" |
|||
android:topLeftRadius="8dp" |
|||
android:topRightRadius="8dp" /> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
|
|||
@ -0,0 +1,10 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android" > |
|||
|
|||
<!-- 设置一个黑色边框 --> |
|||
<stroke android:width="4px" android:color="#ffffff"/> |
|||
<!-- 渐变 --> |
|||
|
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
|
|||
</shape> |
|||
@ -0,0 +1,8 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
<solid android:color="#e6f7ff" /> |
|||
<stroke |
|||
android:width="2dp" |
|||
android:color="#1890ff" /> |
|||
<corners android:radius="8dp" /> |
|||
</shape> |
|||
@ -0,0 +1,8 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
<solid android:color="#f5f5f5" /> |
|||
<stroke |
|||
android:width="1dp" |
|||
android:color="#d9d9d9" /> |
|||
<corners android:radius="8dp" /> |
|||
</shape> |
|||
@ -0,0 +1,24 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
|
|||
<!-- 设置透明背景色 --> |
|||
<solid android:color="#d6eaf8" /> |
|||
|
|||
<!-- 设置一个黑色边框 --> |
|||
<stroke |
|||
android:width="4px" |
|||
android:color="#000000" /> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="10px" |
|||
android:bottomRightRadius="10px" |
|||
android:topLeftRadius="10px" |
|||
android:topRightRadius="10px" /> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
@ -0,0 +1,24 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
|
|||
<!-- 设置透明背景色 --> |
|||
<solid android:color="#d6eaf8" /> |
|||
|
|||
<!-- 设置一个黑色边框 --> |
|||
<stroke |
|||
android:width="2px" |
|||
android:color="@color/blue_green" /> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="10px" |
|||
android:bottomRightRadius="10px" |
|||
android:topLeftRadius="10px" |
|||
android:topRightRadius="10px" /> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
@ -0,0 +1,31 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
|
|||
<!-- 设置透明背景色 --> |
|||
<!-- <solid android:color="##deebf7" />--> |
|||
<solid android:color="@color/white" /> |
|||
<!-- 设置一个黑色边框 --> |
|||
|
|||
<stroke |
|||
android:width="4px" |
|||
android:color="@color/grey" /> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="5dp" |
|||
android:bottomRightRadius="5dp" |
|||
android:topLeftRadius="5dp" |
|||
android:topRightRadius="5dp" /> |
|||
|
|||
<!-- <corners--> |
|||
<!-- android:bottomLeftRadius="10px"--> |
|||
<!-- android:bottomRightRadius="10px"--> |
|||
<!-- android:topLeftRadius="10px"--> |
|||
<!-- android:topRightRadius="10px" />--> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
@ -0,0 +1,24 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
|
|||
<!-- 设置透明背景色 --> |
|||
<solid android:color="#f6ddcc" /> |
|||
|
|||
<!-- 设置一个黑色边框 --> |
|||
<stroke |
|||
android:width="2dp" |
|||
android:color="#ed7041" /> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="10px" |
|||
android:bottomRightRadius="10px" |
|||
android:topLeftRadius="10px" |
|||
android:topRightRadius="10px" /> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
@ -0,0 +1,24 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
|
|||
<!-- 设置透明背景色 --> |
|||
<!-- <solid android:color="#87CEEB" />--> |
|||
|
|||
<!-- 设置一个黑色边框 --> |
|||
<stroke |
|||
android:width="2px" |
|||
android:color="#ffffff" /> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="10px" |
|||
android:bottomRightRadius="10px" |
|||
android:topLeftRadius="10px" |
|||
android:topRightRadius="10px" /> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
@ -0,0 +1,18 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<selector xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
<item android:state_pressed="true"> |
|||
<!-- 当视图被按下(用户点击并按住)时应用的样式 --> |
|||
<shape> |
|||
<solid android:color="@color/red" /> |
|||
<!-- 填充颜色:深蓝色 --> |
|||
<corners android:radius="15dp" /> |
|||
<!-- 圆角半径:4dp --> |
|||
</shape> |
|||
</item> |
|||
<item> |
|||
<shape> |
|||
<solid android:color="@color/black" /> |
|||
<corners android:radius="0dp" /> |
|||
</shape> |
|||
</item> |
|||
</selector> |
|||
@ -0,0 +1,11 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
<solid android:color="#f5f5f5" /> |
|||
<!-- 浅灰色填充 --> |
|||
|
|||
<stroke |
|||
android:width="3dp" |
|||
android:color="#FBE5D6" /> |
|||
<!-- 2dp 宽的红色实线边框 --> |
|||
<corners android:radius="10dp" /> |
|||
</shape> |
|||
@ -0,0 +1,24 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
|
|||
<!-- 设置透明背景色 --> |
|||
<solid android:color="#00ffffff" /> |
|||
|
|||
<!-- 设置一个黑色边框 --> |
|||
<stroke |
|||
android:width="16px" |
|||
android:color="#ffffff" /> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="10px" |
|||
android:bottomRightRadius="10px" |
|||
android:topLeftRadius="10px" |
|||
android:topRightRadius="10px" /> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
<solid android:color="#E8F0FE" /> |
|||
<stroke android:width="2dp" android:color="#3B88FC" /> |
|||
<corners android:radius="8dp" /> |
|||
</shape> |
|||
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
<solid android:color="#F5F5F5" /> |
|||
<stroke android:width="1dp" android:color="#CCCCCC" /> |
|||
<corners android:radius="8dp" /> |
|||
</shape> |
|||
@ -0,0 +1,14 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line"> |
|||
<stroke |
|||
android:color="#ffffff" |
|||
android:dashWidth="10dp" |
|||
/> |
|||
<!--width:线条的高度 |
|||
color:颜色 |
|||
android:dashGap="8dp" |
|||
dashWidth:破折线的宽度 |
|||
dashGap:破折线间空隙的宽度 |
|||
如果这里设置了width,xml中android:layout_height的值必须比它大。不设置就默认为0 |
|||
--> |
|||
</shape> |
|||
@ -0,0 +1,170 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" |
|||
android:width="108dp" |
|||
android:height="108dp" |
|||
android:viewportWidth="108" |
|||
android:viewportHeight="108"> |
|||
<path |
|||
android:fillColor="#3DDC84" |
|||
android:pathData="M0,0h108v108h-108z" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M9,0L9,108" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M19,0L19,108" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M29,0L29,108" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M39,0L39,108" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M49,0L49,108" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M59,0L59,108" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M69,0L69,108" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M79,0L79,108" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M89,0L89,108" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M99,0L99,108" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M0,9L108,9" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M0,19L108,19" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M0,29L108,29" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M0,39L108,39" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M0,49L108,49" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M0,59L108,59" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M0,69L108,69" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M0,79L108,79" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M0,89L108,89" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M0,99L108,99" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M19,29L89,29" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M19,39L89,39" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M19,49L89,49" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M19,59L89,59" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M19,69L89,69" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M19,79L89,79" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M29,19L29,89" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M39,19L39,89" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M49,19L49,89" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M59,19L59,89" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M69,19L69,89" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
<path |
|||
android:fillColor="#00000000" |
|||
android:pathData="M79,19L79,89" |
|||
android:strokeWidth="0.8" |
|||
android:strokeColor="#33FFFFFF" /> |
|||
</vector> |
|||
@ -0,0 +1,30 @@ |
|||
<vector xmlns:android="http://schemas.android.com/apk/res/android" |
|||
xmlns:aapt="http://schemas.android.com/aapt" |
|||
android:width="108dp" |
|||
android:height="108dp" |
|||
android:viewportWidth="108" |
|||
android:viewportHeight="108"> |
|||
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z"> |
|||
<aapt:attr name="android:fillColor"> |
|||
<gradient |
|||
android:endX="85.84757" |
|||
android:endY="92.4963" |
|||
android:startX="42.9492" |
|||
android:startY="49.59793" |
|||
android:type="linear"> |
|||
<item |
|||
android:color="#44000000" |
|||
android:offset="0.0" /> |
|||
<item |
|||
android:color="#00000000" |
|||
android:offset="1.0" /> |
|||
</gradient> |
|||
</aapt:attr> |
|||
</path> |
|||
<path |
|||
android:fillColor="#FFFFFF" |
|||
android:fillType="nonZero" |
|||
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z" |
|||
android:strokeWidth="1" |
|||
android:strokeColor="#00000000" /> |
|||
</vector> |
|||
@ -0,0 +1,9 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<!--自定义edittext的光标颜色和粗细--> |
|||
<shape xmlns:tools="http://schemas.android.com/tools" |
|||
xmlns:android="http://schemas.android.com/apk/res/android" |
|||
tools:ignore="ExtraText"> |
|||
android:shape="rectangle"> |
|||
<size android:width="3dp" /> <!-- 调整此值控制光标粗细 --> |
|||
<solid android:color="@color/black" /> <!-- 光标颜色 --> |
|||
</shape> |
|||
@ -0,0 +1,25 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
|
|||
<!-- 设置透明背景色 --> |
|||
<!-- <solid android:color="@color/white" />--> |
|||
<solid android:color="#FBE5D6" /> |
|||
<!-- 设置一个黑色边框 --> |
|||
<!-- <stroke--> |
|||
<!-- android:width="4px"--> |
|||
<!-- android:color="@color/deepskyblue" />--> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="8dp" |
|||
android:bottomRightRadius="8dp" |
|||
android:topLeftRadius="8dp" |
|||
android:topRightRadius="8dp" /> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
|
|||
@ -0,0 +1,14 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> |
|||
|
|||
<!-- 设置一个黑色边框 --> |
|||
<stroke android:width="4px" |
|||
android:color="#d6eaf8"/> |
|||
<solid android:color="#d6eaf8" /> |
|||
|
|||
<corners android:radius="10dp" /> |
|||
<!-- 渐变 --> |
|||
|
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
|
|||
</shape> |
|||
@ -0,0 +1,8 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
|
|||
<selector xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
<item android:color="@color/grey" |
|||
android:state_checked="false" /> |
|||
<item android:color="@color/blue_green" |
|||
android:state_checked="true" /> |
|||
</selector> |
|||
@ -0,0 +1,8 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android" |
|||
android:shape="rectangle"> |
|||
<!-- 填充 --> |
|||
<solid android:color="#eaeded" /> |
|||
<!-- 圆角 --> |
|||
<corners android:radius="10dp" /> |
|||
</shape> |
|||
@ -0,0 +1,5 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<selector xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
<item android:state_checked="true" android:drawable="@drawable/radio_button_selected" /> |
|||
<item android:state_checked="false" android:drawable="@drawable/radio_button_unselected" /> |
|||
</selector> |
|||
@ -0,0 +1,28 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
|
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
<!-- 设置Editext的形状--> |
|||
|
|||
|
|||
<!-- 设置透明背景色 --> |
|||
<!-- <solid android:color="#87CEEB" />--> |
|||
|
|||
<!-- 设置一个自定义颜色边框 --> |
|||
<stroke |
|||
android:width="1px" |
|||
android:color="@color/trasnparent" /> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="10px" |
|||
android:bottomRightRadius="10px" |
|||
android:topLeftRadius="10px" |
|||
android:topRightRadius="10px" /> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
|
|||
|
After Width: | Height: | Size: 75 KiB |
@ -0,0 +1,24 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<shape xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
|
|||
<!-- 设置透明背景色 --> |
|||
<solid android:color="@color/white" /> |
|||
<!-- <solid android:color="#d6eaf8" />--> |
|||
<!-- 设置一个黑色边框 --> |
|||
<stroke |
|||
android:width="2px" |
|||
android:color="@color/deepskyblue" /> |
|||
<!-- 设置四个圆角的半径 --> |
|||
<corners |
|||
android:bottomLeftRadius="2dp" |
|||
android:bottomRightRadius="2dp" |
|||
android:topLeftRadius="2dp" |
|||
android:topRightRadius="2dp" /> |
|||
<!-- 设置一下边距,让空间大一点 --> |
|||
<!-- <padding--> |
|||
<!-- android:bottom="5dp"--> |
|||
<!-- android:left="5dp"--> |
|||
<!-- android:right="5dp"--> |
|||
<!-- android:top="5dp" />--> |
|||
|
|||
</shape> |
|||
@ -0,0 +1,227 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
|||
xmlns:tools="http://schemas.android.com/tools" |
|||
android:layout_width="500dp" |
|||
android:layout_height="360dp" |
|||
android:layout_gravity="center" |
|||
android:background="@color/white" |
|||
android:orientation="vertical" |
|||
tools:ignore="MissingDefaultResource"> |
|||
|
|||
<TextView |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center" |
|||
android:layout_marginBottom="10dp" |
|||
android:layout_marginTop="10dp" |
|||
android:letterSpacing="0.5" |
|||
android:text="自动模式" |
|||
android:textColor="@color/dark_ink_blue" |
|||
android:textSize="30sp" |
|||
android:textStyle="bold"> |
|||
</TextView> |
|||
|
|||
<!--第一行 水平 平面--> |
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center|top" |
|||
android:gravity="center" |
|||
android:layout_margin="20dp" |
|||
android:orientation="horizontal"> |
|||
<RadioGroup |
|||
android:id="@+id/autoModeSelectorGroup" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:gravity="center" |
|||
android:orientation="horizontal" > |
|||
|
|||
|
|||
|
|||
<RadioButton |
|||
android:id="@+id/rb_five" |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_marginRight="20dp" |
|||
android:layout_weight="1" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:button="@null" |
|||
android:gravity="center" |
|||
android:padding="10dp" |
|||
android:text="水平" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:textSize="40sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<RadioButton |
|||
android:id="@+id/rb_six" |
|||
android:layout_width="0dp" |
|||
android:layout_weight="1" |
|||
android:layout_height="wrap_content" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:button="@null" |
|||
|
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:gravity="center" |
|||
android:textStyle="bold" |
|||
android:padding="10dp" |
|||
android:textSize="40sp" |
|||
android:text="平面" /> |
|||
|
|||
|
|||
|
|||
</RadioGroup> |
|||
</LinearLayout> |
|||
|
|||
<!--第二行 长度宽度--> |
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="80dp" |
|||
android:orientation="horizontal" |
|||
|
|||
android:layout_gravity="center" |
|||
android:gravity="center" |
|||
android:layout_margin="20dp"> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_weight="1" |
|||
android:background="@drawable/borderblue" |
|||
android:layout_marginRight="20dp" |
|||
> |
|||
<TextView |
|||
android:layout_width="80dp" |
|||
android:layout_height="match_parent" |
|||
android:text="作业\n长度" |
|||
android:gravity="left|center" |
|||
android:layout_gravity="center" |
|||
android:textSize="20sp" |
|||
android:textStyle="bold" |
|||
android:textColor="@color/black" |
|||
android:paddingLeft="20dp" |
|||
/> |
|||
|
|||
<EditText |
|||
android:id="@+id/worklength_input" |
|||
android:inputType="number" |
|||
android:background="@null" |
|||
android:layout_width="100dp" |
|||
android:textColor="@color/blue_green" |
|||
android:gravity="right|center" |
|||
android:layout_height="match_parent" |
|||
android:text="50" |
|||
android:textSize="40sp"> |
|||
|
|||
</EditText> |
|||
|
|||
<TextView |
|||
android:layout_width="50dp" |
|||
android:layout_height="match_parent" |
|||
|
|||
android:gravity="center" |
|||
android:text="m" |
|||
android:textColor="@color/blue_green" |
|||
android:textSize="20dp" |
|||
android:textStyle="bold" /> |
|||
|
|||
</LinearLayout> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="0dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_weight="1" |
|||
android:background="@drawable/borderblue" |
|||
> |
|||
<TextView |
|||
android:layout_width="80dp" |
|||
android:layout_height="match_parent" |
|||
android:text="作业\n宽度" |
|||
android:gravity="left|center" |
|||
android:layout_gravity="center" |
|||
android:textSize="20sp" |
|||
android:textStyle="bold" |
|||
android:textColor="@color/black" |
|||
android:paddingLeft="20dp" |
|||
/> |
|||
|
|||
<EditText |
|||
android:id="@+id/workwidth_input" |
|||
android:inputType="number" |
|||
android:background="@null" |
|||
android:layout_width="100dp" |
|||
android:textColor="@color/blue_green" |
|||
android:gravity="right|center" |
|||
android:layout_height="match_parent" |
|||
android:text="50" |
|||
android:textSize="40sp"> |
|||
|
|||
</EditText> |
|||
<TextView |
|||
android:layout_width="50dp" |
|||
android:layout_height="match_parent" |
|||
|
|||
android:gravity="center" |
|||
android:text="m" |
|||
android:textColor="@color/blue_green" |
|||
android:textSize="20dp" |
|||
android:textStyle="bold" /> |
|||
|
|||
</LinearLayout> |
|||
|
|||
|
|||
</LinearLayout> |
|||
|
|||
<!--第三行 确定取消--> |
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="50dp" |
|||
android:layout_gravity="center" |
|||
android:layout_marginTop="5dp" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="match_parent" |
|||
android:layout_marginRight="20dp" |
|||
android:gravity="center" |
|||
android:background="@drawable/borderbluegreen"> |
|||
|
|||
<Button |
|||
android:id="@+id/autoModeApply" |
|||
android:layout_width="200dp" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:background="@color/trasnparent" |
|||
android:text="确定" |
|||
android:textColor="@color/blue_green" |
|||
android:textSize="20sp" |
|||
android:textStyle="bold"> |
|||
</Button> |
|||
|
|||
</LinearLayout> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:background="@drawable/borderorange"> |
|||
|
|||
<Button |
|||
android:id="@+id/autoModeCancel" |
|||
android:layout_width="200dp" |
|||
android:layout_height="match_parent" |
|||
|
|||
android:background="@color/trasnparent" |
|||
android:text="取消" |
|||
android:textColor="#ed7041" |
|||
android:textSize="20sp" |
|||
android:textStyle="bold"> |
|||
|
|||
</Button> |
|||
</LinearLayout> |
|||
|
|||
</LinearLayout> |
|||
|
|||
</LinearLayout> |
|||
@ -0,0 +1,180 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
|||
xmlns:tools="http://schemas.android.com/tools" |
|||
android:layout_width="500dp" |
|||
android:layout_height="360dp" |
|||
android:layout_gravity="center" |
|||
android:background="@color/white" |
|||
android:orientation="vertical" |
|||
tools:ignore="MissingDefaultResource"> |
|||
|
|||
<TextView |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center" |
|||
android:layout_marginTop="10dp" |
|||
android:layout_marginBottom="10dp" |
|||
android:letterSpacing="0.5" |
|||
android:text="后退距离" |
|||
android:textColor="@color/dark_ink_blue" |
|||
android:textSize="30sp" |
|||
android:textStyle="bold"> |
|||
|
|||
</TextView> |
|||
|
|||
|
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="150dp" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
|
|||
<!-- 第一个输入框组 --> |
|||
<LinearLayout |
|||
android:id="@+id/firstInputContainer" |
|||
android:layout_width="200dp" |
|||
android:layout_height="150dp" |
|||
android:orientation="vertical" |
|||
android:padding="12dp" |
|||
android:clickable="true" |
|||
android:focusable="true" |
|||
android:background="@drawable/container_active"> |
|||
|
|||
<TextView |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center" |
|||
android:text="打退交替" |
|||
android:textSize="16sp" |
|||
android:textStyle="bold" |
|||
android:paddingBottom="8dp" /> |
|||
|
|||
<EditText |
|||
android:id="@+id/firstEditText" |
|||
android:layout_width="90dp" |
|||
android:layout_height="35dp" |
|||
android:layout_marginTop="20dp" |
|||
android:layout_marginLeft="-40dp" |
|||
android:layout_gravity="center" |
|||
android:gravity="right|center" |
|||
android:text="50" |
|||
android:textStyle="bold" |
|||
android:hint="请输入..." |
|||
android:background="@drawable/rounded_edittext" |
|||
android:inputType="numberDecimal" |
|||
android:enabled="true" /> |
|||
<TextView |
|||
android:layout_width="50dp" |
|||
android:layout_height="20dp" |
|||
android:layout_marginTop="-28dp" |
|||
android:layout_marginLeft="100dp" |
|||
android:textStyle="bold" |
|||
android:textSize="15sp" |
|||
android:text="cm"/> |
|||
|
|||
</LinearLayout> |
|||
|
|||
<View |
|||
android:layout_width="50dp" |
|||
android:layout_height="16dp" /> |
|||
|
|||
<!-- 第二个输入框组 --> |
|||
<LinearLayout |
|||
android:id="@+id/secondInputContainer" |
|||
android:layout_width="200dp" |
|||
android:layout_height="150dp" |
|||
android:orientation="vertical" |
|||
android:padding="12dp" |
|||
android:clickable="true" |
|||
android:focusable="true" |
|||
android:background="@drawable/container_inactive"> |
|||
|
|||
<TextView |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center" |
|||
android:text="边打边退" |
|||
android:textSize="16sp" |
|||
android:textStyle="bold" |
|||
android:paddingBottom="8dp" /> |
|||
|
|||
<EditText |
|||
android:id="@+id/secondEditText" |
|||
android:layout_width="90dp" |
|||
android:layout_height="35dp" |
|||
android:layout_marginTop="20dp" |
|||
android:layout_marginLeft="-40dp" |
|||
android:hint="请输入..." |
|||
android:layout_gravity="center" |
|||
android:gravity="right|center" |
|||
android:text="50" |
|||
android:textStyle="bold" |
|||
android:background="@drawable/rounded_edittext" |
|||
android:inputType="numberDecimal" |
|||
android:enabled="false" /> |
|||
<TextView |
|||
android:layout_width="50dp" |
|||
android:layout_height="20dp" |
|||
android:layout_marginTop="-28dp" |
|||
android:layout_marginLeft="100dp" |
|||
android:textStyle="bold" |
|||
android:textSize="15sp" |
|||
android:text="m/min"/> |
|||
</LinearLayout> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
</LinearLayout> |
|||
|
|||
<!--第三行 确定取消--> |
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="50dp" |
|||
android:layout_gravity="center" |
|||
android:layout_marginTop="40dp" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
<!-- 确定--> |
|||
<LinearLayout |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:layout_marginRight="20dp" |
|||
android:background="@drawable/borderbluegreen"> |
|||
|
|||
<Button |
|||
android:id="@+id/backDistanceApply" |
|||
android:layout_width="205dp" |
|||
android:layout_height="match_parent" |
|||
android:background="@color/trasnparent" |
|||
android:text="确定" |
|||
android:textColor="@color/blue_green" |
|||
android:textSize="20sp" |
|||
android:textStyle="bold"></Button> |
|||
|
|||
</LinearLayout> |
|||
<!-- 取消--> |
|||
<LinearLayout |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:background="@drawable/borderorange"> |
|||
|
|||
<Button |
|||
android:id="@+id/backDistanceCancel" |
|||
android:layout_width="200dp" |
|||
android:layout_height="match_parent" |
|||
android:background="@color/trasnparent" |
|||
android:text="取消" |
|||
android:textColor="#ed7041" |
|||
android:textSize="20sp" |
|||
android:textStyle="bold"> |
|||
|
|||
</Button> |
|||
</LinearLayout> |
|||
|
|||
</LinearLayout> |
|||
|
|||
</LinearLayout> |
|||
@ -0,0 +1,31 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
|||
android:layout_width="450dp" |
|||
android:layout_height="350dp" |
|||
android:layout_gravity="center" |
|||
android:background="@drawable/submenu" |
|||
android:orientation="vertical"> |
|||
<com.example.swingarmapp_sandblast.models.ScrollBottomScrollView |
|||
android:id="@+id/popUpErrorLogScrollview" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:layout_margin="8dp" |
|||
android:background="@drawable/borderlog"> |
|||
|
|||
|
|||
<TextView |
|||
android:id="@+id/popUpErrorLogTextView" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:layout_margin="8dp" |
|||
android:scrollbars="vertical" |
|||
android:scrollbarStyle="insideInset" |
|||
android:textSize="12sp" |
|||
android:textColor="@color/midnightblue" /> |
|||
|
|||
|
|||
|
|||
</com.example.swingarmapp_sandblast.models.ScrollBottomScrollView> |
|||
|
|||
|
|||
</LinearLayout> |
|||
@ -0,0 +1,174 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
|||
xmlns:tools="http://schemas.android.com/tools" |
|||
android:layout_width="500dp" |
|||
android:layout_height="360dp" |
|||
android:layout_gravity="center" |
|||
android:background="@color/white" |
|||
android:orientation="vertical" |
|||
tools:ignore="MissingDefaultResource"> |
|||
|
|||
<TextView |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center" |
|||
android:layout_margin="25dp" |
|||
android:letterSpacing="0.5" |
|||
android:text="手动模式" |
|||
android:textColor="@color/dark_ink_blue" |
|||
android:textSize="30sp" |
|||
android:textStyle="bold"> |
|||
|
|||
</TextView> |
|||
|
|||
<!--第一行 模式选择--> |
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center|top" |
|||
android:layout_marginTop="10dp" |
|||
android:layout_marginLeft="10dp" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
<RadioGroup |
|||
android:id="@+id/manualModeSelectorGroup" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:orientation="vertical" > |
|||
|
|||
<RadioButton |
|||
android:id="@+id/rb_one" |
|||
android:layout_width="80dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_marginLeft="50dp" |
|||
android:layout_marginTop="10dp" |
|||
android:gravity="center" |
|||
android:button="@null" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:textStyle="bold" |
|||
android:checked="true" |
|||
android:padding="10dp" |
|||
android:textSize="40sp" |
|||
android:text="无" /> |
|||
|
|||
<RadioButton |
|||
android:id="@+id/rb_two" |
|||
android:layout_width="130dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_marginLeft="150dp" |
|||
android:layout_marginTop="-73dp" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:button="@null" |
|||
android:gravity="center" |
|||
android:padding="10dp" |
|||
android:text="水平" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:textSize="40sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<RadioButton |
|||
android:id="@+id/rb_three" |
|||
android:layout_width="130dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_marginLeft="300dp" |
|||
android:layout_marginTop="-75dp" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:button="@null" |
|||
|
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:gravity="center" |
|||
android:textStyle="bold" |
|||
android:padding="10dp" |
|||
android:textSize="40sp" |
|||
android:text="平面" /> |
|||
|
|||
|
|||
<RadioButton |
|||
android:id="@+id/rb_four" |
|||
android:layout_width="180dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_marginLeft="50dp" |
|||
android:layout_marginTop="20dp" |
|||
android:button="@null" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:gravity="center" |
|||
android:textStyle="bold" |
|||
android:padding="10dp" |
|||
android:textSize="40sp" |
|||
android:text="竖直向左" /> |
|||
<RadioButton |
|||
android:id="@+id/rb_five" |
|||
android:layout_width="180dp" |
|||
android:layout_height="match_parent" |
|||
android:layout_marginLeft="250dp" |
|||
android:layout_marginTop="-75dp" |
|||
android:button="@null" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:gravity="center" |
|||
android:textStyle="bold" |
|||
android:padding="10dp" |
|||
android:textSize="40sp" |
|||
android:text="竖直向右" /> |
|||
|
|||
> |
|||
|
|||
|
|||
</RadioGroup> |
|||
</LinearLayout> |
|||
|
|||
<!--第二行 确认取消--> |
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="50dp" |
|||
android:layout_gravity="center" |
|||
android:layout_marginTop="10dp" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="match_parent" |
|||
android:layout_marginRight="20dp" |
|||
android:gravity="center" |
|||
android:background="@drawable/borderbluegreen"> |
|||
|
|||
<Button |
|||
android:id="@+id/manualModeApply" |
|||
android:layout_width="200dp" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:background="@color/trasnparent" |
|||
android:text="确定" |
|||
android:textColor="@color/blue_green" |
|||
android:textSize="20sp" |
|||
android:textStyle="bold"> |
|||
|
|||
</Button> |
|||
|
|||
</LinearLayout> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:background="@drawable/borderorange"> |
|||
|
|||
<Button |
|||
android:id="@+id/manualModeCancel" |
|||
android:layout_width="200dp" |
|||
android:layout_height="match_parent" |
|||
android:background="@color/trasnparent" |
|||
android:text="取消" |
|||
android:textColor="#ed7041" |
|||
android:textSize="20sp" |
|||
android:textStyle="bold"> |
|||
|
|||
</Button> |
|||
</LinearLayout> |
|||
|
|||
</LinearLayout> |
|||
|
|||
</LinearLayout> |
|||
@ -0,0 +1,201 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
|||
xmlns:tools="http://schemas.android.com/tools" |
|||
android:layout_width="500dp" |
|||
android:layout_height="360dp" |
|||
android:layout_gravity="center" |
|||
android:background="@color/white" |
|||
android:orientation="vertical" |
|||
tools:ignore="MissingDefaultResource"> |
|||
|
|||
<TextView |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center" |
|||
android:layout_margin="40dp" |
|||
android:letterSpacing="0.5" |
|||
android:text="参数预设" |
|||
android:textColor="@color/dark_ink_blue" |
|||
android:textSize="40sp" |
|||
android:textStyle="bold"> |
|||
|
|||
</TextView> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center|top" |
|||
android:layout_marginTop="0dp" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
<RadioGroup |
|||
android:id="@+id/parameters_call_group" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:gravity="center" |
|||
android:orientation="horizontal" > |
|||
|
|||
<RadioButton |
|||
android:id="@+id/rb_one" |
|||
android:button="@null" |
|||
android:layout_width="60dp" |
|||
android:layout_margin="10dp" |
|||
android:layout_height="wrap_content" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:layout_marginLeft="10dp" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:gravity="center" |
|||
android:textStyle="bold" |
|||
android:checked="true" |
|||
android:padding="10dp" |
|||
android:textSize="30sp" |
|||
android:text="1" /> |
|||
|
|||
<RadioButton |
|||
android:id="@+id/rb_two" |
|||
android:layout_width="60dp" |
|||
android:layout_margin="10dp" |
|||
android:layout_height="wrap_content" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:button="@null" |
|||
android:layout_marginLeft="10dp" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:gravity="center" |
|||
android:textStyle="bold" |
|||
android:padding="10dp" |
|||
android:textSize="30sp" |
|||
android:text="2" /> |
|||
<RadioButton |
|||
android:id="@+id/rb_three" |
|||
android:layout_width="60dp" |
|||
android:layout_margin="10dp" |
|||
android:layout_height="wrap_content" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:button="@null" |
|||
android:layout_marginLeft="10dp" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:gravity="center" |
|||
android:textStyle="bold" |
|||
android:padding="10dp" |
|||
android:textSize="30sp" |
|||
android:text="3" /> |
|||
<RadioButton |
|||
android:id="@+id/rb_four" |
|||
android:layout_width="60dp" |
|||
android:layout_margin="10dp" |
|||
android:layout_height="wrap_content" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:button="@null" |
|||
android:layout_marginLeft="10dp" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:gravity="center" |
|||
android:textStyle="bold" |
|||
android:padding="10dp" |
|||
android:textSize="30sp" |
|||
android:text="4" /> |
|||
<RadioButton |
|||
android:id="@+id/rb_five" |
|||
android:layout_width="60dp" |
|||
android:layout_margin="10dp" |
|||
android:layout_height="wrap_content" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:button="@null" |
|||
android:layout_marginLeft="10dp" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:gravity="center" |
|||
android:textStyle="bold" |
|||
android:padding="10dp" |
|||
android:textSize="30sp" |
|||
android:text="5" /> |
|||
</RadioGroup> |
|||
|
|||
|
|||
</LinearLayout> |
|||
<!--四个按钮 --> |
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:layout_gravity="center" |
|||
android:layout_marginTop="40dp" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
|
|||
|
|||
<RadioGroup |
|||
android:layout_width="match_parent" |
|||
android:layout_height="wrap_content" |
|||
android:orientation="horizontal" |
|||
android:gravity="center" |
|||
> |
|||
|
|||
<RadioButton |
|||
android:id="@+id/parametersSavebtn" |
|||
android:layout_width="90dp" |
|||
android:layout_height="30dp" |
|||
android:layout_margin="4dp" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:padding="4dp" |
|||
android:text="保存" |
|||
android:gravity="center" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:textSize="15sp" |
|||
android:button="@null" |
|||
android:textStyle="bold"> |
|||
</RadioButton> |
|||
|
|||
|
|||
<RadioButton |
|||
android:id="@+id/parametersClearBtn" |
|||
android:layout_width="90dp" |
|||
android:layout_height="30dp" |
|||
android:layout_margin="4dp" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:padding="4dp" |
|||
android:text="清除" |
|||
android:gravity="center" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:textSize="15sp" |
|||
android:button="@null" |
|||
android:textStyle="bold"> |
|||
</RadioButton> |
|||
|
|||
<RadioButton |
|||
|
|||
android:id="@+id/parametersApply" |
|||
android:layout_width="90dp" |
|||
android:layout_height="30dp" |
|||
android:layout_margin="4dp" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:padding="4dp" |
|||
android:text="使用" |
|||
android:gravity="center" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:textSize="15sp" |
|||
android:button="@null" |
|||
android:textStyle="bold"> |
|||
</RadioButton> |
|||
|
|||
|
|||
<RadioButton |
|||
android:id="@+id/parametersExit" |
|||
android:layout_width="90dp" |
|||
android:layout_height="30dp" |
|||
android:layout_margin="4dp" |
|||
android:background="@drawable/radiobutton_background" |
|||
android:text="退出" |
|||
android:gravity="center" |
|||
android:padding="4dp" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:textSize="15sp" |
|||
android:button="@null" |
|||
android:textStyle="bold"> |
|||
</RadioButton> |
|||
|
|||
|
|||
</RadioGroup> |
|||
|
|||
|
|||
|
|||
</LinearLayout> |
|||
|
|||
</LinearLayout> |
|||
@ -0,0 +1,190 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
|||
android:layout_width="500dp" |
|||
android:layout_height="360dp" |
|||
android:orientation="vertical" |
|||
android:layout_gravity="center" |
|||
android:padding="16dp"> |
|||
<TextView |
|||
android:layout_width="match_parent" |
|||
android:layout_height="50dp" |
|||
android:text="摆臂角度" |
|||
android:textColor="@color/black" |
|||
android:textStyle="bold" |
|||
android:textSize="30sp" |
|||
android:layout_marginBottom="10dp" |
|||
android:gravity="center"/> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="150dp" |
|||
android:orientation="horizontal"> |
|||
|
|||
<!-- 输入框组 --> |
|||
<LinearLayout |
|||
android:id="@+id/inputContainer" |
|||
android:layout_width="200dp" |
|||
android:layout_height="150dp" |
|||
android:orientation="vertical" |
|||
android:padding="12dp" |
|||
android:clickable="true" |
|||
android:focusable="true" |
|||
android:background="@drawable/container_active"> |
|||
|
|||
<TextView |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:text="对称" |
|||
android:layout_gravity="center" |
|||
android:textSize="20sp" |
|||
android:textStyle="bold" |
|||
android:paddingBottom="8dp" /> |
|||
|
|||
<EditText |
|||
android:id="@+id/EditAngleTo32" |
|||
android:layout_width="100dp" |
|||
android:layout_height="35dp" |
|||
android:enabled="true" |
|||
android:gravity="right|center" |
|||
android:background="@drawable/rounded_edittext" |
|||
android:layout_marginTop="20dp" |
|||
android:layout_marginLeft="0dp" |
|||
android:text="120" |
|||
android:hint="请输入..." |
|||
android:textStyle="bold" |
|||
android:inputType="number" /> |
|||
<TextView |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:layout_marginTop="-30dp" |
|||
android:layout_marginLeft="20dp" |
|||
android:text="°" |
|||
android:layout_gravity="center" |
|||
android:textSize="16sp" |
|||
android:textStyle="bold" |
|||
android:paddingBottom="8dp" /> |
|||
|
|||
</LinearLayout> |
|||
|
|||
<View |
|||
android:layout_width="50dp" |
|||
android:layout_height="16dp" /> |
|||
|
|||
<!-- 按钮组 --> |
|||
|
|||
<LinearLayout |
|||
android:id="@+id/buttonContainer" |
|||
android:layout_width="200dp" |
|||
android:layout_height="150dp" |
|||
android:background="@drawable/container_inactive" |
|||
android:clickable="true" |
|||
android:focusable="true" |
|||
android:orientation="vertical" |
|||
android:padding="12dp"> |
|||
|
|||
<TextView |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:paddingBottom="8dp" |
|||
android:text="非对称" |
|||
android:layout_gravity="center" |
|||
android:textSize="20sp" |
|||
android:textStyle="bold" /> |
|||
|
|||
<RadioGroup |
|||
android:id="@+id/radioGroup" |
|||
android:layout_width="match_parent" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
|
|||
<RadioButton |
|||
android:id="@+id/btn_left" |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:background="@color/trasnparent" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:enabled="false" |
|||
android:button="@null" |
|||
android:gravity="center" |
|||
android:textSize="22dp" |
|||
android:textStyle="bold" |
|||
android:text="左侧" /> |
|||
|
|||
<RadioButton |
|||
android:id="@+id/btn_right" |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:layout_marginStart="16dp" |
|||
android:background="@color/trasnparent" |
|||
android:textColor="@drawable/radio_button_textcolor" |
|||
android:button="@null" |
|||
android:gravity="center" |
|||
android:enabled="false" |
|||
android:textStyle="bold" |
|||
android:textSize="22dp" |
|||
android:text="右侧" /> |
|||
</RadioGroup> |
|||
</LinearLayout> |
|||
|
|||
<View |
|||
android:layout_width="match_parent" |
|||
android:layout_height="16dp" /> |
|||
|
|||
|
|||
|
|||
</LinearLayout> |
|||
|
|||
<!--确定/取消--> |
|||
<LinearLayout |
|||
android:layout_width="match_parent" |
|||
android:layout_height="50dp" |
|||
android:layout_gravity="center" |
|||
android:layout_marginTop="40dp" |
|||
android:gravity="center" |
|||
android:orientation="horizontal"> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="match_parent" |
|||
android:gravity="center" |
|||
android:layout_marginRight="20dp" |
|||
android:background="@drawable/borderbluegreen"> |
|||
|
|||
<Button |
|||
android:id="@+id/swingArmAngleApply" |
|||
android:layout_width="200dp" |
|||
android:layout_height="match_parent" |
|||
|
|||
|
|||
android:background="@color/trasnparent" |
|||
android:text="确定" |
|||
android:textColor="@color/blue_green" |
|||
android:textSize="20sp" |
|||
android:textStyle="bold"> |
|||
</Button> |
|||
|
|||
</LinearLayout> |
|||
|
|||
<LinearLayout |
|||
android:layout_width="wrap_content" |
|||
android:layout_height="wrap_content" |
|||
android:gravity="center" |
|||
android:background="@drawable/borderorange"> |
|||
|
|||
<Button |
|||
android:id="@+id/swingArmAngleCancel" |
|||
android:layout_width="200dp" |
|||
android:layout_height="match_parent" |
|||
android:background="@color/trasnparent" |
|||
android:text="取消" |
|||
android:textColor="#ed7041" |
|||
android:textSize="20sp" |
|||
android:textStyle="bold"> |
|||
|
|||
</Button> |
|||
</LinearLayout> |
|||
|
|||
</LinearLayout> |
|||
|
|||
</LinearLayout> |
|||
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
<background android:drawable="@drawable/ic_launcher_background" /> |
|||
<foreground android:drawable="@drawable/ic_launcher_foreground" /> |
|||
<monochrome android:drawable="@drawable/ic_launcher_foreground" /> |
|||
</adaptive-icon> |
|||
@ -0,0 +1,6 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"> |
|||
<background android:drawable="@drawable/ic_launcher_background" /> |
|||
<foreground android:drawable="@drawable/ic_launcher_foreground" /> |
|||
<monochrome android:drawable="@drawable/ic_launcher_foreground" /> |
|||
</adaptive-icon> |
|||
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 982 B |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 5.8 KiB |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 7.6 KiB |
@ -0,0 +1,16 @@ |
|||
<resources xmlns:tools="http://schemas.android.com/tools"> |
|||
<!-- Base application theme. --> |
|||
<style name="Theme.RougheningApp" parent="Theme.MaterialComponents.DayNight.NoActionBar"> |
|||
<!-- Primary brand color. --> |
|||
<item name="colorPrimary">@color/blue</item> |
|||
<item name="colorPrimaryVariant">@color/blue</item> |
|||
<item name="colorOnPrimary">@color/white</item> |
|||
<!-- Secondary brand color. --> |
|||
<item name="colorSecondary">@color/aliceblue</item> |
|||
<item name="colorSecondaryVariant">@color/blueviolet</item> |
|||
<item name="colorOnSecondary">@color/black</item> |
|||
<!-- Status bar color. --> |
|||
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item> |
|||
<!-- Customize your theme here. --> |
|||
</style> |
|||
</resources> |
|||
@ -0,0 +1,168 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<resources> |
|||
<color name="black">#FF000000</color> |
|||
<color name="white">#FFFFFFFF</color> |
|||
<color name="purple_200">#FFFFFFFF</color> |
|||
<color name="gray">#BDBDBD</color> <!-- 灰色 --> |
|||
<color name="colorPrimary">#3F51B5</color><!--首要颜色--> |
|||
<color name="colorPrimaryDark">#303F9F</color><!--首要颜色暗色--> |
|||
<color name="colorAccent">#FF4081</color><!--色彩强调--> |
|||
<!--自定义颜色--> |
|||
<color name="fecal_yellow"> #FBE5D6 </color><!--左侧 屎黄色--> |
|||
<color name="navy_blue">#1F4E79</color> <!--主界面左侧字体 海军蓝 --> |
|||
<color name="sky_blue">#00ACFC</color> <!-- 主界面右侧字体 - 天蓝色 --> |
|||
<color name="very_light_blue">#DEEBF7</color> <!--弹窗确定按钮背景色 浅天蓝色 --> |
|||
<color name="warm_beige">#FBE5D6</color> <!-- 弹窗取消按钮背景色 暖米色 --> |
|||
<color name="orange_red">#FF713D</color> <!-- 取消按钮字体 橙红色 --> |
|||
<color name="deep_blue">#001E54</color> <!-- 弹窗标题颜色- 深暗蓝色 --> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<color name="dark_ink_blue">#00194d</color><!--摆臂 深蓝黑色--> |
|||
<color name="blue_green">#00ADFC</color> <!--摆臂 蓝绿色--> |
|||
|
|||
<color name="snow">#fffafa</color><!--雪白色 --> |
|||
<color name="floralwhite">#fffaf0</color><!--花白色 --> |
|||
<color name="blanchedalmond">#ffebcd</color><!--杏白色 --> |
|||
<color name="ghostwhite">#f8f8ff</color><!--幽灵白 --> |
|||
<color name="whitesmoke">#f5f5f5</color><!--烟白色 --> |
|||
<color name="antiquewhite">#faebd7</color><!--古董白 --> |
|||
<color name="navajowhite">#ffdead</color><!--纳瓦白 --> |
|||
<color name="grey">#808080</color><!--灰色 --> |
|||
<color name="gainsboro">#dcdcdc</color><!--淡灰色 --> |
|||
<color name="lightgrey">#d3d3d3</color><!--亮灰色 --> |
|||
<color name="darkgrey">#a9a9a9</color><!--暗灰色 --> |
|||
<color name="dimgrey">#696969</color><!--暗灰色 --> |
|||
<color name="slategrey">#708090</color><!--灰石色 --> |
|||
<color name="lightslategrey">#778899</color><!--亮蓝灰 --> |
|||
<color name="darkslategrey">#2f4f4f</color><!--暗瓦灰色 --> |
|||
<color name="silver">#c0c0c0</color><!--银色 --> |
|||
|
|||
<color name="red">#ff0000</color><!--红色 --> |
|||
<color name="darkred">#8b0000</color><!--暗红色 --> |
|||
<color name="crimson">#dc143c</color><!--暗深红色 --> |
|||
<color name="darkmagenta">#8b008b</color><!--暗洋红 --> |
|||
<color name="fuchsia">#ff00ff</color><!--紫红色 --> |
|||
<color name="tomato">#ff6347</color><!--西红柿色 --> |
|||
<color name="lightcoral">#f08080</color><!--亮珊瑚色 --> |
|||
<color name="darksalmon">#e9967a</color><!--暗肉色 --> |
|||
<color name="peachpuff">#ffdab9</color><!--桃色 --> |
|||
<color name="plum">#dda0dd</color><!--洋李色 --> |
|||
<color name="pink">#ffc0cb</color><!--粉红色 --> |
|||
<color name="lightpink">#ffb6c1</color><!--亮粉红色 --> |
|||
<color name="deeppink">#ff1493</color><!--深粉红色 --> |
|||
<color name="hotpink">#ff69b4</color><!--热粉红色 --> |
|||
<color name="lavenderblush">#fff0f5</color><!--淡紫红 --> |
|||
<color name="indianred">#cd5c5c</color><!--印第安红 --> |
|||
<color name="rosybrown">#bc8f8f</color><!--褐玫瑰红 --> |
|||
<color name="firebrick">#b22222</color><!--红砖色 --> |
|||
<color name="maroon">#800000</color><!--粟色 --> |
|||
<color name="honeydew">#f0fff0</color><!--蜜色 --> |
|||
<color name="orangered">#ff4500</color><!--红橙色 --> |
|||
<color name="orange">#ffa500</color><!--橙色 --> |
|||
<color name="limegreen">#32cd32</color><!--橙绿色 --> |
|||
<color name="lime">#00ff00</color><!--酸橙色 --> |
|||
<color name="yellow">#ffff00</color><!--黄色 --> |
|||
<color name="wheat">#f5deb3</color><!--浅黄色 --> |
|||
<color name="khaki">#f0e68c</color><!--黄褐色 --> |
|||
<color name="burlywood">#deb887</color><!--实木色 --> |
|||
<color name="bisque">#ffe4c4</color><!--桔黄色 --> |
|||
<color name="lightyellow">#ffffe0</color><!--亮黄色 --> |
|||
<color name="darkgoldenrod">#b8860b</color><!--暗金黄色 --> |
|||
<color name="darkorange">#ff8c00</color><!--暗桔黄色 --> |
|||
<color name="lightgoldenrodyellow">#fafad2</color><!--亮金黄色 --> |
|||
<color name="lemonchiffon">#fffacd</color><!--柠檬绸色 --> |
|||
<color name="cornsilk">#fff8dc</color><!--米绸色 --> |
|||
<color name="seaShell">#fff5ee</color><!--海贝色 --> |
|||
<color name="papayawhip">#ffefd5</color><!--番木色 --> |
|||
<color name="mistyrose">#ffe4e1</color><!--浅玫瑰色 --> |
|||
<color name="moccasin">#ffe4b5</color><!--鹿皮色 --> |
|||
<color name="ivory">#fffff0</color><!--象牙色 --> |
|||
<color name="gold">#ffd700</color><!--金色 --> |
|||
<color name="goldenrod">#daa520</color><!--金麒麟色 --> |
|||
<color name="lightsalmon">#ffa07a</color><!--亮肉色 --> |
|||
<color name="coral">#ff7f50</color><!--珊瑚色 --> |
|||
<color name="mintcream">#f5fffa</color><!--薄荷色 --> |
|||
<color name="beige">#f5f5dc</color><!--米色 --> |
|||
<color name="sandybrown">#f4a460</color><!--沙褐色 --> |
|||
<color name="oldlace">#fdf5e6</color><!--老花色 --> |
|||
<color name="linen">#faf0e6</color><!--亚麻色 --> |
|||
<color name="salmon">#fa8072</color><!--鲜肉色 --> |
|||
<color name="thistle">#d8bfd8</color><!--蓟色 --> |
|||
<color name="tan">#d2b48c</color><!--茶色 --> |
|||
<color name="chocolate">#d2691e</color><!--巧可力色 --> |
|||
<color name="peru">#cd853f</color><!--秘鲁色 --> |
|||
<color name="darkkhaki">#bdb76b</color><!--暗黄褐色 --> |
|||
<color name="palegoldenrod">#eee8aa</color><!--苍麒麟色 --> |
|||
<color name="brown">#a52a2a</color><!--褐色 --> |
|||
<color name="saddlebrown">#8b4513</color><!--重褐色 --> |
|||
<color name="sienna">#a0522d</color><!--赭色 --> |
|||
<color name="olive">#808000</color><!--橄榄色 --> |
|||
<color name="chartreuse">#7fff00</color><!--黄绿色 --> |
|||
<color name="greenyellow">#adff2f</color><!--黄绿色 --> |
|||
<color name="green">#008000</color><!--绿色 --> |
|||
<color name="darkgreen">#006400</color><!--暗绿色 --> |
|||
<color name="darkolivegreen">#556b2f</color><!--暗橄榄绿 --> |
|||
<color name="olivedrab">#6b8e23</color><!--深绿褐色 --> |
|||
<color name="lawngreen">#7cfc00</color><!--草绿色 --> |
|||
<color name="forestgreen">#228b22</color><!--森林绿 --> |
|||
<color name="aquamarine">#7fffd4</color><!--碧绿色 --> |
|||
<color name="paleturquoise">#afeeee</color><!--苍宝石绿 --> |
|||
<color name="palegreen">#98fb98</color><!--苍绿色 --> |
|||
<color name="mediumturquoise">#48d1cc</color><!--中绿宝石 --> |
|||
<color name="mediumaquamarine">#66cdaa</color><!--中绿色 --> |
|||
<color name="aqua">#00ffff</color><!--浅绿色 --> |
|||
<color name="springgreen">#00ff7f</color><!--春绿色 --> |
|||
<color name="mediumspringgreen">#00fa9a</color><!--中春绿色 --> |
|||
<color name="darkturquoise">#00ced1</color><!--暗宝石绿 --> |
|||
<color name="seagreen">#2e8b57</color><!--海绿色 --> |
|||
<color name="lightgreen">#90ee90</color><!--亮绿色 --> |
|||
<color name="darkseagreen">#8fbc8f</color><!--暗海兰色 --> |
|||
<color name="turquoise">#40e0d0</color><!--青绿色 --> |
|||
<color name="cyan">#00ffff</color><!--青色 --> |
|||
<color name="darkcyan">#008b8b</color><!--暗青色 --> |
|||
<color name="lightcyan">#e0ffff</color><!--亮青色 --> |
|||
<color name="teal">#008080</color><!--水鸭色 --> |
|||
<color name="indigo">#4b0082</color><!--靛青色 --> |
|||
<color name="blue">#0000ff</color><!--蓝色 --> |
|||
<color name="darkblue">#00008b</color><!--暗蓝色 --> |
|||
<color name="mediumblue">#0000cd</color><!--中兰色 --> |
|||
<color name="midnightblue">#191970</color><!--中灰兰色 --> |
|||
<color name="navy">#000080</color><!--海军色 --> |
|||
<color name="royalblue">#4169e1</color><!--皇家蓝 --> |
|||
<color name="azure">#f0ffff</color><!--天蓝色 --> |
|||
<color name="skyblue">#87ceeb</color><!--天蓝色 --> |
|||
<color name="deepskyblue">#00bfff</color><!--深天蓝色 --> |
|||
<color name="lightskyblue">#87cefa</color><!--亮天蓝色 --> |
|||
<color name="lightseagreen">#20b2aa</color><!--亮海蓝色 --> |
|||
<color name="lightblue">#add8e6</color><!--亮蓝色 --> |
|||
<color name="powderblue">#b0e0e6</color><!--粉蓝色 --> |
|||
<color name="aliceblue">#f0f8ff</color><!--艾利斯兰 --> |
|||
<color name="mediumslateblue">#7b68ee</color><!--中暗蓝色 --> |
|||
<color name="slateblue">#6a5acd</color><!--石蓝色 --> |
|||
<color name="darkslateblue">#483d8b</color><!--暗灰蓝色 --> |
|||
<color name="mediumseagreen">#3cb371</color><!--中海蓝 --> |
|||
<color name="steelblue">#4682b4</color><!--钢兰色 --> |
|||
<color name="lightsteelblue">#b0c4de</color><!--亮钢兰色 --> |
|||
<color name="cornflowerblue">#6495ed</color><!--菊兰色 --> |
|||
<color name="dodgerblue">#1e90ff</color><!--闪兰色 --> |
|||
<color name="cadetblue">#5f9ea0</color><!--军兰色 --> |
|||
<color name="blueviolet">#8a2be2</color><!--紫罗兰蓝色 --> |
|||
<color name="purple">#800080</color><!--紫色 --> |
|||
<color name="lavender">#e6e6fa</color><!--淡紫色 --> |
|||
<color name="orchid">#da70d6</color><!--淡紫色 --> |
|||
<color name="mediumpurple">#9370db</color><!--中紫色 --> |
|||
<color name="darkorchid">#9932cc</color><!--暗紫色 --> |
|||
<color name="violet">#ee82ee</color><!--紫罗兰色 --> |
|||
<color name="mediumvioletred">#c71585</color><!--中紫罗兰色 --> |
|||
<color name="palevioletred">#db7093</color><!--苍紫罗兰色 --> |
|||
<color name="darkviolet">#9400d3</color><!--暗紫罗兰色 --> |
|||
<color name="mediumorchid">#ba55d3</color><!--中粉紫色 --> |
|||
<color name="trasnparent">#00000000</color><!--中粉紫色 --> |
|||
|
|||
<color name="bgrgreen">#6efe00</color><!--中粉紫色 --> |
|||
|
|||
|
|||
</resources> |
|||
@ -0,0 +1,42 @@ |
|||
<resources> |
|||
<string name="app_name">摆臂sandbalst</string> |
|||
<string name="信号状态">状态\n信息</string> |
|||
<string name="moveSpeed">移动\n速度</string> |
|||
<string name="realHeight">实时\n高度</string> |
|||
<string name="realAngle">实时\n角度</string> |
|||
<string name="leftCompensation">左侧\n补偿</string> |
|||
<string name="rightCompensation">右侧\n补偿</string> |
|||
<string name="ManualMode">手动\n模式</string> |
|||
<string-array name="operationMode"> |
|||
<item>手动操作</item> |
|||
<item>竖直操作</item> |
|||
<item>水平操作</item> |
|||
</string-array> |
|||
<string-array name="speedSelection"> |
|||
<item>1</item> |
|||
<item>2</item> |
|||
<item>3</item> |
|||
<item>4</item> |
|||
<item>5</item> |
|||
<item>6</item> |
|||
<item>7</item> |
|||
<item>8</item> |
|||
<item>9</item> |
|||
<item>10</item> |
|||
</string-array> |
|||
|
|||
<string-array name="laneChangeSelection"> |
|||
<item>1</item> |
|||
<item>2</item> |
|||
<item>3</item> |
|||
<item>4</item> |
|||
<item>5</item> |
|||
<item>6</item> |
|||
<item>7</item> |
|||
<item>8</item> |
|||
<item>9</item> |
|||
<item>10</item> |
|||
</string-array> |
|||
<integer name="leftRange">20</integer> |
|||
|
|||
</resources> |
|||
@ -0,0 +1,17 @@ |
|||
<resources xmlns:tools="http://schemas.android.com/tools"> |
|||
<!-- Base application theme. --> |
|||
<style name="Theme.RougheningApp" parent="Theme.MaterialComponents.DayNight.NoActionBar"> |
|||
<!-- Primary brand color. --> |
|||
<item name="colorPrimary">@color/blue</item> |
|||
<item name="colorPrimaryVariant">@color/blue</item> |
|||
<item name="colorOnPrimary">@color/white</item> |
|||
<!-- Secondary brand color. --> |
|||
<item name="colorSecondary">@color/aliceblue</item> |
|||
<item name="colorSecondaryVariant">@color/blueviolet</item> |
|||
<item name="colorOnSecondary">@color/black</item> |
|||
<!-- Status bar color. --> |
|||
<item name="android:statusBarColor">?attr/colorPrimaryVariant</item> |
|||
<!-- Customize your theme here. --> |
|||
</style> |
|||
|
|||
</resources> |
|||