From 2b270f01facd18f5d2c105e48279482d3ff4b9c8 Mon Sep 17 00:00:00 2001 From: 陈力 <chenli@lotaai.com> Date: 星期一, 29 五月 2023 21:52:12 +0800 Subject: [PATCH] 增加登录、长按进入管理端的功能 --- app/src/main/java/com/lotaai/canguiayw/mqtt/MQTTService.java | 181 ++++++++++++++++++++ app/src/main/java/com/lotaai/canguiayw/device/CanGuiCommand.java | 10 app/src/main/res/mipmap-hdpi/logo.png | 0 app/src/main/AndroidManifest.xml | 1 app/src/main/java/com/lotaai/canguiayw/AdminLoginActivity.java | 60 ++++++ app/src/main/java/com/lotaai/canguiayw/MainActivity.java | 15 + app/src/main/java/com/lotaai/canguiayw/sqllitedb/Order.java | 2 app/src/main/java/com/lotaai/canguiayw/sqllitedb/OrderDetail.java | 50 +++++ app/src/main/java/com/lotaai/canguiayw/sqllitedb/DaoMaster.java | 3 app/src/main/res/layout/activity_admin_login.xml | 94 ++++++++++ app/src/main/res/layout/activity_main.xml | 10 + app/src/main/java/com/lotaai/canguiayw/OpenDoorFragment.java | 1 app/src/main/java/com/lotaai/canguiayw/sqllitedb/DaoSession.java | 14 + app/src/main/java/com/lotaai/canguiayw/ManageActivity.java | 35 +++ app/src/main/java/com/lotaai/canguiayw/SettingFragment.java | 17 + app/src/main/java/com/lotaai/canguiayw/device/service/CanGuiService.java | 4 app/build.gradle | 3 17 files changed, 492 insertions(+), 8 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 7ab9202..0f1de9b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -66,6 +66,9 @@ implementation 'com.github.huangyanbin:SmartTable:2.2.0' //下拉选择框控件 implementation 'com.github.arcadefire:nice-spinner:1.3.4' + //支持MQTT协议 + implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0' + implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 75e581b..f8cf84d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -24,6 +24,7 @@ </activity> <activity android:name=".TakeActivity"/> <activity android:name="ManageActivity"/> + <activity android:name=".AdminLoginActivity"/> <service android:name=".device.service.CanGuiService" diff --git a/app/src/main/java/com/lotaai/canguiayw/AdminLoginActivity.java b/app/src/main/java/com/lotaai/canguiayw/AdminLoginActivity.java new file mode 100644 index 0000000..0e852b4 --- /dev/null +++ b/app/src/main/java/com/lotaai/canguiayw/AdminLoginActivity.java @@ -0,0 +1,60 @@ +package com.lotaai.canguiayw; + +import android.content.Context; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.view.MotionEvent; +import android.view.View; +import android.view.inputmethod.InputMethodManager; +import android.widget.EditText; + +import androidx.appcompat.app.AppCompatActivity; + +import com.blankj.utilcode.util.LogUtils; +import com.lotaai.canguiayw.device.service.CanGuiService; + +public class AdminLoginActivity extends AppCompatActivity { + private Context context; + private EditText loginName; + private EditText loginPwd; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_admin_login); + context = AdminLoginActivity.this; + loginName = findViewById(R.id.loginName); + loginPwd = findViewById(R.id.loginpwd); + } + + public void confirmLogin(View view){ + Intent intent = new Intent(); + intent.setClass(AdminLoginActivity.this, ManageActivity.class); + startActivity(intent); + } + + public void cancelLogin(View view){ + Intent intent = new Intent(); + intent.setClass(AdminLoginActivity.this, MainActivity.class); + startActivity(intent); + } + + @Override + public void finish(){ + + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + if(null != this.getCurrentFocus()){ + /** + * 点击空白位置 隐藏软键盘 + */ + InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE); + assert mInputMethodManager != null; + return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0); + } + return super .onTouchEvent(event); + } +} diff --git a/app/src/main/java/com/lotaai/canguiayw/MainActivity.java b/app/src/main/java/com/lotaai/canguiayw/MainActivity.java index ecae83b..f143975 100644 --- a/app/src/main/java/com/lotaai/canguiayw/MainActivity.java +++ b/app/src/main/java/com/lotaai/canguiayw/MainActivity.java @@ -9,6 +9,8 @@ import android.os.Bundle; import android.util.Log; import android.view.View; +import android.widget.ImageView; + import com.blankj.utilcode.util.LogUtils; import com.lotaai.canguiayw.device.CanGuiCommand; import com.lotaai.canguiayw.device.CanguiStatus; @@ -20,19 +22,30 @@ public class MainActivity extends AppCompatActivity { private Context context; + private ImageView logoView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LogUtils.i("VERSION.SDK_INT:" +VERSION.SDK_INT); + logoView = findViewById(R.id.logo); context = MainActivity.this; Intent startIntent = new Intent(context, CanGuiService.class); startService(startIntent); + logoView.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View view) { + Intent intent = new Intent(); + intent.setClass(MainActivity.this, AdminLoginActivity.class); + startActivity(intent); + return true; + } + }); } public void gotoSetting(View view){ Intent intent = new Intent(); - intent.setClass(MainActivity.this, ManageActivity.class); + intent.setClass(MainActivity.this, AdminLoginActivity.class); startActivity(intent); } diff --git a/app/src/main/java/com/lotaai/canguiayw/ManageActivity.java b/app/src/main/java/com/lotaai/canguiayw/ManageActivity.java index d4ac2b1..ef55242 100644 --- a/app/src/main/java/com/lotaai/canguiayw/ManageActivity.java +++ b/app/src/main/java/com/lotaai/canguiayw/ManageActivity.java @@ -3,8 +3,10 @@ import android.content.Intent; import android.graphics.Color; import android.os.Bundle; +import android.view.MotionEvent; import android.view.View; import android.view.Window; +import android.view.inputmethod.InputMethodManager; import android.widget.Button; import android.widget.ImageButton; import android.widget.LinearLayout; @@ -205,4 +207,37 @@ finish(); } + public interface MyTouchListener { + public void onTouchEvent(MotionEvent event); + } + + // 保存MyTouchListener接口的列表 + private ArrayList<MyTouchListener> myTouchListeners = new ArrayList<ManageActivity.MyTouchListener>(); + + /** + * 提供给Fragment通过getActivity()方法来注册自己的触摸事件的方法 + * @param listener + */ + public void registerMyTouchListener(MyTouchListener listener) { + myTouchListeners.add(listener); + } + + /** + * 提供给Fragment通过getActivity()方法来取消注册自己的触摸事件的方法 + * @param listener + */ + public void unRegisterMyTouchListener(MyTouchListener listener) { + myTouchListeners.remove( listener ); + } + + /** + * 分发触摸事件给所有注册了MyTouchListener的接口 + */ + @Override + public boolean dispatchTouchEvent(MotionEvent ev) { + for (MyTouchListener listener : myTouchListeners) { + listener.onTouchEvent(ev); + } + return super.dispatchTouchEvent(ev); + } } diff --git a/app/src/main/java/com/lotaai/canguiayw/OpenDoorFragment.java b/app/src/main/java/com/lotaai/canguiayw/OpenDoorFragment.java index 78a2393..54d071a 100644 --- a/app/src/main/java/com/lotaai/canguiayw/OpenDoorFragment.java +++ b/app/src/main/java/com/lotaai/canguiayw/OpenDoorFragment.java @@ -100,7 +100,6 @@ try { Thread.sleep(1000); showHandler.sendEmptyMessage(1); - Log.i(TAG,"在运行"); } catch (InterruptedException e) { e.printStackTrace(); }catch (Exception e){ diff --git a/app/src/main/java/com/lotaai/canguiayw/SettingFragment.java b/app/src/main/java/com/lotaai/canguiayw/SettingFragment.java index 8e26e26..d485d06 100644 --- a/app/src/main/java/com/lotaai/canguiayw/SettingFragment.java +++ b/app/src/main/java/com/lotaai/canguiayw/SettingFragment.java @@ -10,8 +10,10 @@ import android.os.Message; import android.text.Spannable; import android.view.LayoutInflater; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.view.inputmethod.InputMethodManager; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Spinner; @@ -52,6 +54,20 @@ } context = container.getContext(); initSpinner(); + /* Fragment中,注册 + * 接收MainActivity的Touch回调的对象 + * 重写其中的onTouchEvent函数,并进行该Fragment的逻辑处理 + */ + ManageActivity.MyTouchListener myTouchListener = new ManageActivity.MyTouchListener() { + @Override + public void onTouchEvent(MotionEvent event) { + System.out.println("23333333333333333"); + + } + }; + + // 将myTouchListener注册到分发列表 + ((ManageActivity)this.getActivity()).registerMyTouchListener(myTouchListener); return root; } @@ -73,4 +89,5 @@ } }); } + } diff --git a/app/src/main/java/com/lotaai/canguiayw/device/CanGuiCommand.java b/app/src/main/java/com/lotaai/canguiayw/device/CanGuiCommand.java index 9a71dcb..7457c5e 100644 --- a/app/src/main/java/com/lotaai/canguiayw/device/CanGuiCommand.java +++ b/app/src/main/java/com/lotaai/canguiayw/device/CanGuiCommand.java @@ -189,15 +189,19 @@ List<CanguiStatus> list = new ArrayList<>(); if (recv.length > 0) { int guiHao = recv[3] & 0xff; - for (int i = 1; i <= 9; i++) { - //开始解析8个格子的状态 + int num = 9; + if (guiHao == 0){ + num = 8; + } + for (int i = 1; i <= num; i++) { + //开始解析格子的状态 CanguiStatus status = new CanguiStatus(); //柜号 status.setGuiHao(guiHao); //格子号 status.setGridNo(i); //温度 - int site = i * 2 + 5;//温度 + int site = (i-1) * 2 + 5;//温度 int wendu = recv[site] & 0xff; status.setWendu(wendu); site = site + 1; diff --git a/app/src/main/java/com/lotaai/canguiayw/device/service/CanGuiService.java b/app/src/main/java/com/lotaai/canguiayw/device/service/CanGuiService.java index dfaaed0..2bafe38 100644 --- a/app/src/main/java/com/lotaai/canguiayw/device/service/CanGuiService.java +++ b/app/src/main/java/com/lotaai/canguiayw/device/service/CanGuiService.java @@ -105,8 +105,8 @@ for (int i = 0; i < statuses.size(); i++){ CanguiStatus s = statuses.get(i); SettingConfig.getInstance().addStatusInList(s); -// LogUtils.i("柜:" + s.getGuiHao(),"格:" + s.getGridNo(),"温度:" + s.getWendu(), -// "门:"+s.isDoorIsOpen(),"加热:"+s.isJiareIsOpen(),"灯光:" + s.isDengGuangIsOpen(),"消毒:" + s.isXiaoDuIsOpen()); + LogUtils.i("柜:" + s.getGuiHao(),"格:" + s.getGridNo(),"温度:" + s.getWendu(), + "门:"+s.isDoorIsOpen(),"加热:"+s.isJiareIsOpen(),"灯光:" + s.isDengGuangIsOpen(),"消毒:" + s.isXiaoDuIsOpen()); } } } diff --git a/app/src/main/java/com/lotaai/canguiayw/mqtt/MQTTService.java b/app/src/main/java/com/lotaai/canguiayw/mqtt/MQTTService.java new file mode 100644 index 0000000..257107c --- /dev/null +++ b/app/src/main/java/com/lotaai/canguiayw/mqtt/MQTTService.java @@ -0,0 +1,181 @@ +package com.lotaai.canguiayw.mqtt; + +import android.app.Service; +import android.content.Context; +import android.content.Intent; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.os.IBinder; +import android.util.Log; + +import androidx.annotation.Nullable; + +import org.eclipse.paho.android.service.MqttAndroidClient; +import org.eclipse.paho.client.mqttv3.IMqttActionListener; +import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken; +import org.eclipse.paho.client.mqttv3.IMqttToken; +import org.eclipse.paho.client.mqttv3.MqttCallback; +import org.eclipse.paho.client.mqttv3.MqttConnectOptions; +import org.eclipse.paho.client.mqttv3.MqttException; +import org.eclipse.paho.client.mqttv3.MqttMessage; + +public class MQTTService extends Service { + + public static final String TAG = MQTTService.class.getSimpleName(); + + private static MqttAndroidClient client; + private MqttConnectOptions conOpt; + + private String host = "tcp://xxx"; //服务器地址 + private String userName = "xxx"; //账号 + private String passWord = " xxx"; //密码 + private static String myTopic = "topic"; //频道名 + private String clientId = "mqtt_client"; //客户端ID + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + init(); + return super.onStartCommand(intent, flags, startId); + } + + public static void publish(String msg) { + String topic = myTopic; + Integer qos = 2; + Boolean retained = false; + try { + client.publish(topic, msg.getBytes(), qos.intValue(), retained.booleanValue()); + } catch (MqttException e) { + e.printStackTrace(); + } + } + + private void init() { + // 服务器地址(协议+地址+端口号) + String uri = host; + client = new MqttAndroidClient(this, uri, clientId); + // 设置MQTT监听并且接受消息 + client.setCallback(mqttCallback); + + conOpt = new MqttConnectOptions(); + // 清除缓存 + conOpt.setCleanSession(true); + // 设置超时时间,单位:秒 + conOpt.setConnectionTimeout(10); + // 心跳包发送间隔,单位:秒 + conOpt.setKeepAliveInterval(20); + // 用户名 + conOpt.setUserName(userName); + // 密码 + conOpt.setPassword(passWord.toCharArray()); + + // last will message + boolean doConnect = true; + String message =""; + String topic = myTopic; + Integer qos = 2; + Boolean retained = false; + if ((!message.equals("")) || (!topic.equals(""))) { + // 最后 + try { + conOpt.setWill(topic, message.getBytes(), qos.intValue(), retained.booleanValue()); + } catch (Exception e) { + Log.i(TAG, "Exception Occured", e); + doConnect = false; + iMqttActionListener.onFailure(null, e); + } + } + if (doConnect) { + doClientConnection(); + } + } + + @Override + public void onDestroy() { + try { + client.disconnect(); //服务销毁,断开连接 + } catch (MqttException e) { + e.printStackTrace(); + } + super.onDestroy(); + } + + /** + * 连接MQTT服务器 + */ + private void doClientConnection() { + if (!client.isConnected() && isConnectIsNomarl()) { + try { + client.connect(conOpt, null, iMqttActionListener); + } catch (MqttException e) { + e.printStackTrace(); + } + } + + } + + // MQTT是否连接成功 + private IMqttActionListener iMqttActionListener = new IMqttActionListener() { + + @Override + public void onSuccess(IMqttToken arg0) { + Log.i(TAG, "连接成功 "); + try { + // 订阅myTopic话题,当订阅多条频道,需要遍历逐条订阅,否则有可能订阅失败 + client.subscribe(myTopic, 1); + } catch (MqttException e) { + e.printStackTrace(); + } + } + + @Override + public void onFailure(IMqttToken arg0, Throwable arg1) { + arg1.printStackTrace(); + // 连接失败,重连 + } + }; + + // MQTT监听并且接受消息 + private MqttCallback mqttCallback = new MqttCallback() { + + @Override + public void messageArrived(String topic, MqttMessage message) throws Exception { + String str1 = new String(message.getPayload()); + String str2 = topic + ";qos:" + message.getQos() + ";retained:" + message.isRetained(); + Log.i(TAG, "messageArrived:" + str1); + Log.i(TAG, str2); + } + + @Override + public void deliveryComplete(IMqttDeliveryToken arg0) { + + } + + @Override + public void connectionLost(Throwable arg0) { + // 失去连接,重连 + } + }; + + /** + * 判断网络是否连接 + */ + private boolean isConnectIsNomarl() { + ConnectivityManager connectivityManager = (ConnectivityManager) this.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE); + NetworkInfo info = connectivityManager.getActiveNetworkInfo(); + if (info != null && info.isAvailable()) { + String name = info.getTypeName(); + Log.i(TAG, "MQTT当前网络名称:" + name); + return true; + } else { + Log.i(TAG, "MQTT 没有可用网络"); + return false; + } + } + + @Nullable + @Override + public IBinder onBind(Intent intent) { + return null; + } + +} diff --git a/app/src/main/java/com/lotaai/canguiayw/sqllitedb/DaoMaster.java b/app/src/main/java/com/lotaai/canguiayw/sqllitedb/DaoMaster.java index c546c16..e1fa5c3 100644 --- a/app/src/main/java/com/lotaai/canguiayw/sqllitedb/DaoMaster.java +++ b/app/src/main/java/com/lotaai/canguiayw/sqllitedb/DaoMaster.java @@ -22,12 +22,14 @@ /** Creates underlying database table using DAOs. */ public static void createAllTables(Database db, boolean ifNotExists) { OrderDao.createTable(db, ifNotExists); + OrderDetailDao.createTable(db, ifNotExists); TestDao.createTable(db, ifNotExists); } /** Drops underlying database table using DAOs. */ public static void dropAllTables(Database db, boolean ifExists) { OrderDao.dropTable(db, ifExists); + OrderDetailDao.dropTable(db, ifExists); TestDao.dropTable(db, ifExists); } @@ -48,6 +50,7 @@ public DaoMaster(Database db) { super(db, SCHEMA_VERSION); registerDaoClass(OrderDao.class); + registerDaoClass(OrderDetailDao.class); registerDaoClass(TestDao.class); } diff --git a/app/src/main/java/com/lotaai/canguiayw/sqllitedb/DaoSession.java b/app/src/main/java/com/lotaai/canguiayw/sqllitedb/DaoSession.java index 59419e8..8294c77 100644 --- a/app/src/main/java/com/lotaai/canguiayw/sqllitedb/DaoSession.java +++ b/app/src/main/java/com/lotaai/canguiayw/sqllitedb/DaoSession.java @@ -9,9 +9,11 @@ import org.greenrobot.greendao.internal.DaoConfig; import com.lotaai.canguiayw.sqllitedb.Order; +import com.lotaai.canguiayw.sqllitedb.OrderDetail; import com.lotaai.canguiayw.sqllitedb.Test; import com.lotaai.canguiayw.sqllitedb.OrderDao; +import com.lotaai.canguiayw.sqllitedb.OrderDetailDao; import com.lotaai.canguiayw.sqllitedb.TestDao; // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. @@ -24,9 +26,11 @@ public class DaoSession extends AbstractDaoSession { private final DaoConfig orderDaoConfig; + private final DaoConfig orderDetailDaoConfig; private final DaoConfig testDaoConfig; private final OrderDao orderDao; + private final OrderDetailDao orderDetailDao; private final TestDao testDao; public DaoSession(Database db, IdentityScopeType type, Map<Class<? extends AbstractDao<?, ?>>, DaoConfig> @@ -36,18 +40,24 @@ orderDaoConfig = daoConfigMap.get(OrderDao.class).clone(); orderDaoConfig.initIdentityScope(type); + orderDetailDaoConfig = daoConfigMap.get(OrderDetailDao.class).clone(); + orderDetailDaoConfig.initIdentityScope(type); + testDaoConfig = daoConfigMap.get(TestDao.class).clone(); testDaoConfig.initIdentityScope(type); orderDao = new OrderDao(orderDaoConfig, this); + orderDetailDao = new OrderDetailDao(orderDetailDaoConfig, this); testDao = new TestDao(testDaoConfig, this); registerDao(Order.class, orderDao); + registerDao(OrderDetail.class, orderDetailDao); registerDao(Test.class, testDao); } public void clear() { orderDaoConfig.clearIdentityScope(); + orderDetailDaoConfig.clearIdentityScope(); testDaoConfig.clearIdentityScope(); } @@ -55,6 +65,10 @@ return orderDao; } + public OrderDetailDao getOrderDetailDao() { + return orderDetailDao; + } + public TestDao getTestDao() { return testDao; } diff --git a/app/src/main/java/com/lotaai/canguiayw/sqllitedb/Order.java b/app/src/main/java/com/lotaai/canguiayw/sqllitedb/Order.java index 16472d3..e305039 100644 --- a/app/src/main/java/com/lotaai/canguiayw/sqllitedb/Order.java +++ b/app/src/main/java/com/lotaai/canguiayw/sqllitedb/Order.java @@ -13,7 +13,7 @@ @NotNull private String gridNo; @NotNull - private int state;//0--空闲 1-占用 2-锁定 + private int state;//状态;0-未存餐 1-已存餐 2-已取餐 3-取消 private long putInDate; private String takeCode; @Generated(hash = 2118332125) diff --git a/app/src/main/java/com/lotaai/canguiayw/sqllitedb/OrderDetail.java b/app/src/main/java/com/lotaai/canguiayw/sqllitedb/OrderDetail.java new file mode 100644 index 0000000..8d60830 --- /dev/null +++ b/app/src/main/java/com/lotaai/canguiayw/sqllitedb/OrderDetail.java @@ -0,0 +1,50 @@ +package com.lotaai.canguiayw.sqllitedb; + +import org.greenrobot.greendao.annotation.Entity; +import org.greenrobot.greendao.annotation.Id; +import org.greenrobot.greendao.annotation.NotNull; +import org.greenrobot.greendao.annotation.Generated; + +@Entity +public class OrderDetail { + @Id + private long id; + @NotNull + private String orderNo; + private String itemName; + private int num; + @Generated(hash = 1442626585) + public OrderDetail(long id, @NotNull String orderNo, String itemName, int num) { + this.id = id; + this.orderNo = orderNo; + this.itemName = itemName; + this.num = num; + } + @Generated(hash = 268085433) + public OrderDetail() { + } + public long getId() { + return this.id; + } + public void setId(long id) { + this.id = id; + } + public String getOrderNo() { + return this.orderNo; + } + public void setOrderNo(String orderNo) { + this.orderNo = orderNo; + } + public String getItemName() { + return this.itemName; + } + public void setItemName(String itemName) { + this.itemName = itemName; + } + public int getNum() { + return this.num; + } + public void setNum(int num) { + this.num = num; + } +} diff --git a/app/src/main/res/layout/activity_admin_login.xml b/app/src/main/res/layout/activity_admin_login.xml new file mode 100644 index 0000000..29431ba --- /dev/null +++ b/app/src/main/res/layout/activity_admin_login.xml @@ -0,0 +1,94 @@ +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@color/bgcolor" + android:layout_gravity="center" + android:orientation="vertical"> + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="120dp" + android:layout_gravity="center" + android:layout_marginTop="200dp" + android:orientation="horizontal"> + <TextView + android:layout_width="150dp" + android:layout_height="80dp" + android:gravity="right|center_vertical" + android:text="账号:" + android:layout_margin="10dp" + android:textColor="@color/white" + android:textSize="30dp" /> + <EditText + android:id="@+id/loginName" + android:layout_width="300dp" + android:layout_height="80dp" + android:layout_margin="10dp" + android:gravity="center" + android:background="@drawable/round_editstyle" + android:hint="账号" + android:textColorHint="@color/white" + android:textAlignment="center" + android:textColor="@color/white" + android:textSize="30dp" /> + </LinearLayout> + <LinearLayout + android:layout_width="wrap_content" + android:layout_height="120dp" + android:layout_gravity="center" + android:orientation="horizontal"> + <TextView + android:layout_width="150dp" + android:layout_height="80dp" + android:layout_margin="10dp" + android:gravity="right|center_vertical" + android:text="密码:" + android:textColor="@color/white" + android:textSize="30dp" /> + <EditText + android:id="@+id/loginpwd" + android:layout_width="300dp" + android:layout_height="80dp" + android:layout_margin="10dp" + android:gravity="center" + android:background="@drawable/round_editstyle" + android:hint="密码" + android:textColorHint="@color/white" + android:textAlignment="center" + android:inputType="textPassword" + android:textColor="@color/white" + android:textSize="30dp" /> + </LinearLayout> + + <LinearLayout + android:layout_width="540dp" + android:layout_height="120dp" + android:layout_gravity="center" + android:layout_marginTop="50dp" + android:orientation="horizontal"> + <Button + android:id="@+id/jihuo" + android:layout_width="250dp" + android:layout_height="80dp" + android:textSize="30dp" + android:layout_margin="10dp" + android:layout_gravity="center" + android:gravity="center" + android:onClick="confirmLogin" + android:background="@drawable/circular_button" + android:text="登录"/> + + <Button + android:id="@+id/save" + android:layout_width="250dp" + android:layout_height="80dp" + android:textSize="30dp" + android:layout_margin="10dp" + android:layout_gravity="center" + android:gravity="center" + android:onClick="cancelLogin" + android:background="@drawable/circular_button_blue" + android:text="返回"/> + </LinearLayout> +</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 0979624..b7e7c71 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -9,6 +9,7 @@ <com.google.android.material.floatingactionbutton.FloatingActionButton android:id="@+id/fab" + android:visibility="gone" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentEnd="true" @@ -24,6 +25,15 @@ app:pressedTranslationZ="5dp" app:rippleColor="@color/DarkGray" /> + <ImageView + android:id="@+id/logo" + android:layout_width="100dp" + android:layout_height="100dp" + android:scaleType="center" + android:layout_marginTop="50dp" + android:layout_marginLeft="50dp" + android:src="@mipmap/logo"/> + <LinearLayout android:layout_width="450dp" android:layout_height="450dp" diff --git a/app/src/main/res/mipmap-hdpi/logo.png b/app/src/main/res/mipmap-hdpi/logo.png new file mode 100644 index 0000000..7693b4f --- /dev/null +++ b/app/src/main/res/mipmap-hdpi/logo.png Binary files differ -- Gitblit v1.7.1