app/build.gradle
@@ -11,6 +11,20 @@ multiDexEnabled true testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } signingConfigs { // your debug keystore debug { keyAlias 'moral' keyPassword 'moral123456' storeFile file("C:\\Users\\Administrator\\Desktop\\key\\key.jks") storePassword 'moral123456' } } sourceSets { main { jniLibs.srcDir 'libs' } } buildTypes { release { minifyEnabled false @@ -36,4 +50,5 @@ compile('com.github.niorgai:StatusBarCompat:2.1.4', { exclude group: 'com.android.support' }) compile 'com.github.lecho:hellocharts-library:1.5.8@aar' } app/libs/BaiduLBS_Android.jarBinary files differ
app/libs/arm64-v8a/libBaiduMapSDK_base_v5_1_0.soBinary files differ
app/libs/arm64-v8a/libBaiduMapSDK_map_v5_1_0.soBinary files differ
app/libs/arm64-v8a/libindoor.soBinary files differ
app/libs/arm64-v8a/liblocSDK7b.soBinary files differ
app/libs/armeabi-v7a/libBaiduMapSDK_base_v5_1_0.soBinary files differ
app/libs/armeabi-v7a/libBaiduMapSDK_map_v5_1_0.soBinary files differ
app/libs/armeabi-v7a/libindoor.soBinary files differ
app/libs/armeabi-v7a/liblocSDK7b.soBinary files differ
app/libs/armeabi/libBaiduMapSDK_base_v5_1_0.soBinary files differ
app/libs/armeabi/libBaiduMapSDK_map_v5_1_0.soBinary files differ
app/libs/armeabi/libindoor.soBinary files differ
app/libs/armeabi/liblocSDK7b.soBinary files differ
app/libs/x86/libBaiduMapSDK_base_v5_1_0.soBinary files differ
app/libs/x86/libBaiduMapSDK_map_v5_1_0.soBinary files differ
app/libs/x86/libindoor.soBinary files differ
app/libs/x86/liblocSDK7b.soBinary files differ
app/libs/x86_64/libBaiduMapSDK_base_v5_1_0.soBinary files differ
app/libs/x86_64/libBaiduMapSDK_map_v5_1_0.soBinary files differ
app/libs/x86_64/libindoor.soBinary files differ
app/libs/x86_64/liblocSDK7b.soBinary files differ
app/src/main/AndroidManifest.xml
@@ -2,7 +2,24 @@ <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="com.moral.screen"> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> //获取设备网络状态,禁用后无法获取网络状态 <uses-permission android:name="android.permission.INTERNET"/> //网络权限,当禁用后,无法进行检索等相关业务 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> //读取设备硬件信息,统计数据 <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> //读取系统信息,包含系统版本等信息,用作统计 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> //获取设备的网络状态,鉴权所需网络代理 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> //允许sd卡写权限,需写入地图数据,禁用后无法显示地图 <uses-permission android:name="android.permission.WRITE_SETTINGS" /> //获取统计数据 <uses-permission android:name="android.permission.GET_TASKS" /> //鉴权所需该权限获取进程列表 <uses-permission android:name="android.permission.CAMERA" /> <application android:name=".MainApp" android:allowBackup="true" @@ -10,14 +27,26 @@ android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" tools:replace="android:icon" android:theme="@style/AppTheme"> <activity android:name=".activity.LoginActivity"> android:theme="@style/AppTheme" tools:replace="android:icon"> <activity android:name=".activity.LoginActivity" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".activity.MapActivity" android:screenOrientation="portrait"/> <activity android:name=".activity.DeviceDataActivity" android:screenOrientation="portrait"/> <activity android:name=".activity.ChartActivity" android:screenOrientation="portrait"/> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="Pel4i0XKOQFmw3kO2awBV7uFI1Cb5BMm" /> <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" > </service> </application> </manifest> app/src/main/java/com/moral/screen/MainApp.java
@@ -3,10 +3,13 @@ import android.app.Application; import android.content.Context; import android.support.multidex.MultiDex; import com.baidu.mapapi.SDKInitializer; import com.lzy.okgo.OkGo; import com.lzy.okgo.cookie.store.PersistentCookieStore; import com.moral.andbrickslib.utils.ScreenUtils; import com.moral.andbrickslib.utils.log.XLog; import com.moral.screen.utils.SharedPreferencesUtil; /** @@ -15,8 +18,9 @@ public class MainApp extends Application { public static MainApp theApp; public SharedPreferencesUtil mSharedPreferencesUtil; //用户id public int userId = 0; public int orgId = 0; public int width; @Override public void onCreate() { @@ -24,8 +28,13 @@ this.theApp = this; XLog.init("haijiang"); width = ScreenUtils.getScreenWidth(this); if(mSharedPreferencesUtil==null){ mSharedPreferencesUtil = new SharedPreferencesUtil(this); } orgId = mSharedPreferencesUtil.getOrgId(); OkGo.init(this); OkGo.getInstance().setCookieStore(new PersistentCookieStore()); SDKInitializer.initialize(getApplicationContext()); } @Override app/src/main/java/com/moral/screen/activity/ChartActivity.java
New file @@ -0,0 +1,267 @@ package com.moral.screen.activity; import android.app.AlertDialog; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.support.annotation.IdRes; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.Window; import android.widget.Button; import android.widget.ImageView; import android.widget.RadioGroup; import android.widget.TextView; import com.lzy.okgo.cache.CacheMode; import com.moral.andbrickslib.utils.FastJsonTools; import com.moral.andbrickslib.utils.NumberUtils; import com.moral.andbrickslib.utils.TimeUtil; import com.moral.screen.R; import com.moral.screen.base.BaseActivity; import com.moral.screen.common.API; import com.moral.screen.httputils.HttpCallBack; import com.moral.screen.model.SensorData; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Timer; import java.util.TimerTask; import lecho.lib.hellocharts.formatter.AxisValueFormatter; import lecho.lib.hellocharts.formatter.LineChartValueFormatter; import lecho.lib.hellocharts.formatter.SimpleAxisValueFormatter; import lecho.lib.hellocharts.formatter.SimpleLineChartValueFormatter; import lecho.lib.hellocharts.gesture.ContainerScrollType; import lecho.lib.hellocharts.gesture.ZoomType; import lecho.lib.hellocharts.model.Axis; import lecho.lib.hellocharts.model.AxisValue; import lecho.lib.hellocharts.model.Line; import lecho.lib.hellocharts.model.LineChartData; import lecho.lib.hellocharts.model.PointValue; import lecho.lib.hellocharts.model.ValueShape; import lecho.lib.hellocharts.model.Viewport; import lecho.lib.hellocharts.view.LineChartView; /** * Created by haijiang on 2017/7/13. */ public class ChartActivity extends BaseActivity { private LineChartView chartView; Line line; LineChartData data; Axis axisX; Axis axisY; private List<PointValue> mPointValues = new ArrayList<>(); private List<AxisValue> mAxisXValues = new ArrayList<>(); private TextView tv_sub; private String sensorKey, mac, name, unit; private float maxValue; private Timer timer; /** * 计时器 */ private boolean isFinish = false; private void showChangeLineChart() { timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { if(!isFinish){ getData(1,false); } } },0,5*1000); } @Override protected void getBundleExtras(Bundle extras) { sensorKey = getIntent().getStringExtra("sensorKey"); mac = getIntent().getStringExtra("mac"); name = getIntent().getStringExtra("name"); unit = getIntent().getStringExtra("unit"); maxValue = getIntent().getFloatExtra("maxValue", 0); } @Override protected int getLayoutId() { return R.layout.ac_charts_layout; } @Override protected void initViews() { initTopBar(); tv_title.setText("动态走势"); tv_sub = findView(R.id.tv_sub); tv_sub.setText(name + "动态走势图"); chartView = findView(R.id.chart); initLineChart(); } @Override protected void initListener() { } @Override protected void initData() { getData(8,true); showChangeLineChart(); } @Override protected void processClick(View view) { switch (view.getId()) { case R.id.tv_left: finish(); break; } } @Override protected void onErrorPageClick() { } private void initLineChart() { line = new Line(mPointValues).setColor(Color.parseColor("#ffffff")); //折线的颜色 List<Line> lines = new ArrayList<>(); line.setShape(ValueShape.CIRCLE);//折线图上每个数据点的形状 这里是圆形 (有三种 :ValueShape.SQUARE ValueShape.CIRCLE ValueShape.DIAMOND) line.setPointColor(Color.parseColor("#ffffff")); line.setCubic(false);//曲线是否平滑,即是曲线还是折线 line.setFilled(false);//是否填充曲线的面积 line.setHasLabels(true);//曲线的数据坐标是否加上备注 // line.setHasLabelsOnlyForSelected(true);//点击数据坐标提示数据(设置了这个line.setHasLabels(true);就无效) line.setHasLines(true);//是否用线显示。如果为false 则没有曲线只有点显示 line.setHasPoints(true);//是否显示圆点 如果为false 则没有原点只有点显示(每个数据点都是个大的圆点) LineChartValueFormatter chartValueFormatter = new SimpleLineChartValueFormatter(1); line.setFormatter(chartValueFormatter);//显示小数点 lines.add(line); data = new LineChartData(); data.setLines(lines); data.setValueLabelBackgroundColor(Color.TRANSPARENT);//此处设置坐标点旁边的文字背景 data.setValueLabelBackgroundEnabled(false); data.setValueLabelsTextColor(Color.GRAY); //坐标轴 axisX = new Axis(); //X轴 axisX.setHasTiltedLabels(true); //X坐标轴字体是斜的显示还是直的,true是斜的显示 axisX.setName("实时数据"); //表格名称 axisX.setTextSize(8);//设置字体大小 axisX.setTextColor(getResources().getColor(R.color.blue_txt)); // axisX.setMaxLabelChars(7); //最多几个X轴坐标,意思就是你的缩放让X轴上数据的个数7<=x<=mAxisXValues.length axisX.setValues(mAxisXValues); //填充X轴的坐标名称 axisX.setHasLines(true); //x 轴分割线 axisX.setLineColor(getResources().getColor(R.color.blue_txt)); axisX.setHasSeparationLine(true); data.setAxisXBottom(axisX); //x 轴在底部 //data.setAxisXTop(axisX); //x 轴在顶部 // Y轴是根据数据的大小自动设置Y轴上限(在下面我会给出固定Y轴数据个数的解决方案) axisY = Axis.generateAxisFromRange((float) 0.0, maxValue == 0 ? 100 : maxValue, maxValue == 0 ? 10 : maxValue / 16); //Y轴 // axisY = new Axis(); axisY.setAutoGenerated(false); AxisValueFormatter yvalue = new SimpleAxisValueFormatter(1); axisY.setFormatter(yvalue); axisY.setHasLines(true); axisY.setHasSeparationLine(true); axisY.setName("单位:" + unit);//y轴标注 axisY.setTextSize(10);//设置字体大小 axisY.setTextColor(getResources().getColor(R.color.blue_txt)); axisY.setLineColor(getResources().getColor(R.color.blue_txt)); data.setAxisYLeft(axisY); //Y轴设置在左边 //设置行为属性,支持缩放、滑动以及平移 chartView.setInteractive(true); chartView.setZoomType(ZoomType.HORIZONTAL); chartView.setMaxZoom((float) 2);//最大方法比例 chartView.setContainerScrollEnabled(true, ContainerScrollType.HORIZONTAL); chartView.setLineChartData(data); chartView.setVisibility(View.VISIBLE); /**注:下面的7,10只是代表一个数字去类比而已 * 当时是为了解决X轴固定数据个数。见(http://forum.xda-developers.com/tools/programming/library-hellocharts-charting-library-t2904456/page2); */ final Viewport v = new Viewport(chartView.getMaximumViewport()); v.bottom = (float) 0.0; v.top = maxValue; chartView.setMaximumViewport(v); chartView.setCurrentViewport(v); } private int index = 0; private void reshowChart(final SensorData sensorData) { chartView.post(new Runnable() { @Override public void run() { mPointValues.add(new PointValue(index, sensorData.getValue())); mAxisXValues.add(new AxisValue(index).setLabel(index + "")); if(mPointValues.size()>8){ mPointValues.remove(0); } if(mAxisXValues.size()>8){ mAxisXValues.remove(0); } axisX.setValues(mAxisXValues); data.setAxisXBottom(axisX); line.setValues(mPointValues); List<Line> lines = new ArrayList<Line>(); lines.add(line); data.setLines(lines); chartView.setLineChartData(data); index++; final Viewport v = new Viewport(chartView.getMaximumViewport()); v.bottom = (float) 0.0; v.top = maxValue; chartView.setMaximumViewport(v); chartView.setCurrentViewport(v); } }); } private ArrayList<SensorData> dataList = new ArrayList<>(); private void getData(int size,boolean show) { HashMap<String, String> params = new HashMap<>(); params.put("sensorKey", sensorKey); params.put("mac", mac); params.put("size", size + ""); mHttpUtils.doGet(API.SENSOR, params, CacheMode.DEFAULT, show, new HttpCallBack() { @Override public void onSuccess(String res, String msg) { if (progressDialog.isShowing()) { progressDialog.dismiss(); } ArrayList<SensorData> temp = (ArrayList<SensorData>) FastJsonTools.getArrayJson(res, SensorData.class); if (temp != null) { dataList.clear(); dataList.addAll(temp); } for (SensorData data:dataList){ reshowChart(data); } } @Override public void showLoadingDialog() { progressDialog.show(); } @Override public void onFail(int errno, String s) { if (progressDialog.isShowing()) { progressDialog.dismiss(); } } }); } } app/src/main/java/com/moral/screen/activity/DeviceDataActivity.java
New file @@ -0,0 +1,160 @@ package com.moral.screen.activity; import android.content.Intent; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.TextView; import com.baidu.mapapi.map.MapStatus; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.model.LatLng; import com.lzy.okgo.cache.CacheMode; import com.moral.andbrickslib.baseadapter.recyclerview.MultiItemTypeAdapter; import com.moral.andbrickslib.utils.FastJsonTools; import com.moral.screen.MainApp; import com.moral.screen.R; import com.moral.screen.adapter.DeviceDataAdapter; import com.moral.screen.base.BaseActivity; import com.moral.screen.common.API; import com.moral.screen.httputils.HttpCallBack; import com.moral.screen.model.DeviceBean; import com.moral.screen.model.DeviceDataBean; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.HashMap; import java.util.Timer; import java.util.TimerTask; /** * Created by hjzhang on 2018/7/4. */ public class DeviceDataActivity extends BaseActivity { private TextView tv_left; private RecyclerView rv_data; private DeviceDataAdapter adapter; private ArrayList<DeviceDataBean> dataList = new ArrayList<>(); private int deviceVersionId,deviceId; private String mac; private Timer timer; /** * 计时器 */ private boolean isFinish = false; private void getDataForTime() { timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { if(!isFinish){ getData(false); } } },0,10*1000); } @Override protected void getBundleExtras(Bundle extras) { deviceVersionId = getIntent().getIntExtra("deviceVersionId",0); deviceId = getIntent().getIntExtra("deviceId",0); mac = getIntent().getStringExtra("mac"); } @Override protected int getLayoutId() { return R.layout.ac_device_data_layout; } @Override protected void initViews() { tv_left = findView(R.id.tv_left); rv_data = findView(R.id.rv_data); adapter = new DeviceDataAdapter(rv_data,R.layout.list_item_data,dataList); rv_data.setLayoutManager(new LinearLayoutManager(rv_data.getContext())); rv_data.setAdapter(adapter); adapter.setOnItemClickListener(new MultiItemTypeAdapter.OnItemClickListener() { @Override public void onItemClick(View view, RecyclerView.ViewHolder holder, int position) { DeviceDataBean data = dataList.get(position); Intent intent = new Intent(DeviceDataActivity.this,ChartActivity.class); intent.putExtra("sensorKey",data.getSensor_key()); intent.putExtra("name",data.getDescription()); intent.putExtra("mac",mac); intent.putExtra("maxValue",data.getUpper()); intent.putExtra("unit",data.getUnit()); startActivity(intent); } @Override public boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, int position) { return false; } }); } @Override protected void initListener() { tv_left.setOnClickListener(this); } @Override protected void initData() { getData(true); getDataForTime(); } @Override protected void processClick(View view) { switch (view.getId()){ case R.id.tv_left: finish(); break; } } @Override protected void onErrorPageClick() { } private void getData(boolean show) { HashMap<String, String> params = new HashMap<>(); params.put("deviceVersionId", deviceVersionId+""); params.put("deviceId", deviceId+""); params.put("mac", mac); mHttpUtils.doGet(API.SENSORS, params, CacheMode.DEFAULT, show, new HttpCallBack() { @Override public void onSuccess(String res, String msg) { if (progressDialog.isShowing()) { progressDialog.dismiss(); } ArrayList<DeviceDataBean> temp = (ArrayList<DeviceDataBean>) FastJsonTools.getArrayJson(res,DeviceDataBean.class); if(temp!=null){ dataList.clear(); dataList.addAll(temp); } adapter.notifyDataSetChanged(); } @Override public void showLoadingDialog() { progressDialog.setTitleText("正在获取数据..."); progressDialog.show(); } @Override public void onFail(int errno, String s) { mToatUtils.showSingletonToast(s); if (progressDialog.isShowing()) { progressDialog.dismiss(); } } }); } } app/src/main/java/com/moral/screen/activity/LoginActivity.java
@@ -1,10 +1,24 @@ package com.moral.screen.activity; import android.content.Intent; import android.content.SearchRecentSuggestionsProvider; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.widget.Button; import android.widget.EditText; import com.lzy.okgo.cache.CacheMode; import com.moral.screen.MainApp; import com.moral.screen.R; import com.moral.screen.base.BaseActivity; import com.moral.screen.common.API; import com.moral.screen.httputils.HttpCallBack; import org.json.JSONException; import org.json.JSONObject; import java.util.HashMap; /** * 登录界面 @@ -12,6 +26,9 @@ */ public class LoginActivity extends BaseActivity { private Button bt_sure; private EditText et_phone, et_pwd; @Override protected void getBundleExtras(Bundle extras) { @@ -24,11 +41,16 @@ @Override protected void initViews() { bt_sure = findView(R.id.bt_sure); et_phone = findView(R.id.et_phone); et_pwd = findView(R.id.et_pwd); et_phone.setText("admin"); et_pwd.setText("123456"); } @Override protected void initListener() { bt_sure.setOnClickListener(this); } @Override @@ -38,6 +60,21 @@ @Override protected void processClick(View view) { switch (view.getId()) { case R.id.bt_sure: String phone = et_phone.getText().toString(); if (TextUtils.isEmpty(phone)) { mToatUtils.showSingletonToast("请输入手机号码"); return; } String password = et_pwd.getText().toString(); if (TextUtils.isEmpty(password)) { mToatUtils.showSingletonToast("请输入密码"); return; } login(phone, password); break; } } @@ -45,4 +82,44 @@ protected void onErrorPageClick() { } private void login(String phone, String password) { HashMap<String, String> params = new HashMap<>(); params.put("account", phone); params.put("password", password); mHttpUtils.doGet(API.LOGIN, params, CacheMode.DEFAULT, true, new HttpCallBack() { @Override public void onSuccess(String res, String msg) { if (progressDialog.isShowing()) { progressDialog.dismiss(); } try { JSONObject json = new JSONObject(res); int organizationId = json.optInt("organizationId"); MainApp.theApp.orgId = organizationId; MainApp.theApp.mSharedPreferencesUtil.saveOrgId(organizationId); Intent intent = new Intent(LoginActivity.this, MapActivity.class); startActivity(intent); finish(); } catch (JSONException e) { e.printStackTrace(); } } @Override public void showLoadingDialog() { progressDialog.setTitleText("正在登录..."); progressDialog.show(); } @Override public void onFail(int errno, String s) { mToatUtils.showSingletonToast(s); if (progressDialog.isShowing()) { progressDialog.dismiss(); } } }); } } app/src/main/java/com/moral/screen/activity/MapActivity.java
New file @@ -0,0 +1,257 @@ package com.moral.screen.activity; import android.content.Intent; import android.graphics.Point; import android.os.Bundle; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BitmapDescriptor; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.InfoWindow; import com.baidu.mapapi.map.MapStatus; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.Marker; import com.baidu.mapapi.map.MarkerOptions; import com.baidu.mapapi.model.LatLng; import com.lzy.okgo.cache.CacheMode; import com.moral.andbrickslib.utils.FastJsonTools; import com.moral.screen.MainApp; import com.moral.screen.common.API; import com.moral.screen.httputils.HttpCallBack; import com.moral.screen.model.DeviceBean; import com.moral.screen.R; import com.moral.screen.base.BaseActivity; import java.util.ArrayList; import java.util.HashMap; /** * Created by hjzhang on 2018/7/2. */ public class MapActivity extends BaseActivity { private TextView tv_left; private MapView bmapView; private BaiduMap mBaiduMap; BitmapDescriptor bdNormal = BitmapDescriptorFactory .fromResource(R.mipmap.icon_normal); BitmapDescriptor bdA = BitmapDescriptorFactory .fromResource(R.mipmap.icon_level1); BitmapDescriptor bdB = BitmapDescriptorFactory .fromResource(R.mipmap.icon_level2); BitmapDescriptor bdC = BitmapDescriptorFactory .fromResource(R.mipmap.icon_level3); BitmapDescriptor bdOffline = BitmapDescriptorFactory .fromResource(R.mipmap.icon_offline); private ArrayList<Marker> mkList = new ArrayList<>(); private ArrayList<DeviceBean> deviceList = new ArrayList<>(); private View popView; private TextView tv_name,tv_address; private ImageView iv_close; private LinearLayout ll_pop; private DeviceBean curDeviceBean; @Override protected void getBundleExtras(Bundle extras) { } @Override protected int getLayoutId() { return R.layout.ac_map_layout; } @Override protected void initViews() { tv_left = findView(R.id.tv_left); bmapView = findView(R.id.bmapView); popView = LayoutInflater.from(this).inflate(R.layout.pop_layout,null); tv_name = popView.findViewById(R.id.tv_name); tv_address = popView.findViewById(R.id.tv_address); iv_close = popView.findViewById(R.id.iv_close); ll_pop = popView.findViewById(R.id.ll_pop); initMap(); } @Override protected void initListener() { tv_left.setOnClickListener(this); iv_close.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mBaiduMap.hideInfoWindow(); } }); ll_pop.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if("4".equals(curDeviceBean.getState())){ mToatUtils.showSingletonToast("该设备正在维保中..."); return; } Intent intent = new Intent(MapActivity.this,DeviceDataActivity.class); intent.putExtra("deviceVersionId",curDeviceBean.getDeviceVersionId()); intent.putExtra("mac",curDeviceBean.getMac()); intent.putExtra("deviceId",curDeviceBean.getId()); startActivity(intent); } }); } @Override protected void initData() { getData(); } @Override protected void processClick(View view) { switch (view.getId()){ case R.id.tv_left: finish(); break; } } @Override protected void onErrorPageClick() { } private void initMap(){ mBaiduMap = bmapView.getMap(); // 开启定位图层 mBaiduMap.setMyLocationEnabled(true); mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() { public boolean onMarkerClick(final Marker marker) { if (marker != null) { curDeviceBean = deviceList.get(marker.getZIndex()); tv_address.setText("地址:"+curDeviceBean.getAddress()); tv_name.setText(curDeviceBean.getName()); final LatLng ll = marker.getPosition(); InfoWindow mInfoWindow; Point p = mBaiduMap.getProjection().toScreenLocation(ll); p.y -= 47; LatLng llInfo = mBaiduMap.getProjection().fromScreenLocation(p); //为弹出的InfoWindow添加点击事件 mInfoWindow = new InfoWindow(popView,llInfo,0); mBaiduMap.showInfoWindow(mInfoWindow); } return true; } }); } /** * 标注地图 */ private void showMapData(){ mBaiduMap.clear(); MarkerOptions mo = null; Marker mMarker = null; LatLng ll = null; for (int i = 0; i < deviceList.size(); i++) { DeviceBean bean = deviceList.get(i); double lat = bean.getLatitude(); double lon = bean.getLongitude(); ll = new LatLng(lat, lon); // 0 正常 // 1 一级警报 // 2 二级警报 // 3 三级警报 // 4 维保 if ("0".equals(bean.getState())) { mo = new MarkerOptions().position(ll).icon(bdNormal) .zIndex(i); } else if ("1".equals(bean.getState())) { mo = new MarkerOptions().position(ll).icon(bdA) .zIndex(i); } else if ("2".equals(bean.getState())) { mo = new MarkerOptions().position(ll).icon(bdB) .zIndex(i); }else if ("3".equals(bean.getState())) { mo = new MarkerOptions().position(ll).icon(bdC) .zIndex(i); }else if ("4".equals(bean.getState())) { mo = new MarkerOptions().position(ll).icon(bdOffline) .zIndex(i); } // 掉下动画 mo.animateType(MarkerOptions.MarkerAnimateType.drop); mMarker = (Marker) (mBaiduMap.addOverlay(mo)); mkList.add(mMarker); } } @Override public void onResume() { super.onResume(); bmapView.onResume(); } @Override public void onPause() { super.onPause(); bmapView.onPause(); } @Override public void onDestroy() { bdNormal.recycle(); bdOffline.recycle(); bdA.recycle(); bdB.recycle(); bdC.recycle(); super.onDestroy(); bmapView.onDestroy(); } private void getData() { HashMap<String, String> params = new HashMap<>(); params.put("organizationId", MainApp.theApp.orgId+""); mHttpUtils.doGet(API.DEVICES, params, CacheMode.DEFAULT, true, new HttpCallBack() { @Override public void onSuccess(String res, String msg) { if (progressDialog.isShowing()) { progressDialog.dismiss(); } ArrayList<DeviceBean> temp = (ArrayList<DeviceBean>) FastJsonTools.getArrayJson(res,DeviceBean.class); if(temp!=null){ deviceList.clear(); deviceList.addAll(temp); } if(deviceList.size()>0){ DeviceBean bean = deviceList.get(0); LatLng ll = new LatLng(bean.getLatitude(), bean.getLongitude()); MapStatus.Builder builder = new MapStatus.Builder(); builder.target(ll).zoom(18.0f); mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build())); } showMapData(); } @Override public void showLoadingDialog() { progressDialog.setTitleText("正在获取数据..."); progressDialog.show(); } @Override public void onFail(int errno, String s) { mToatUtils.showSingletonToast(s); if (progressDialog.isShowing()) { progressDialog.dismiss(); } } }); } } app/src/main/java/com/moral/screen/adapter/DeviceDataAdapter.java
New file @@ -0,0 +1,40 @@ package com.moral.screen.adapter; import android.annotation.TargetApi; import android.os.Build; import android.support.v7.widget.RecyclerView; import android.widget.ProgressBar; import android.widget.TextView; import com.moral.andbrickslib.baseadapter.recyclerview.CommonAdapter; import com.moral.andbrickslib.baseadapter.recyclerview.base.ViewHolder; import com.moral.screen.R; import com.moral.screen.model.DeviceBean; import com.moral.screen.model.DeviceDataBean; import java.util.List; /** * Created by hjzhang on 2018/7/4. */ public class DeviceDataAdapter extends CommonAdapter<DeviceDataBean> { public DeviceDataAdapter(RecyclerView v, int layoutId, List<DeviceDataBean> datas) { super(v, layoutId, datas); } @Override protected void convert(ViewHolder holder, DeviceDataBean item, int position) { TextView tv_name = holder.getView(R.id.tv_name); TextView tv_unit = holder.getView(R.id.tv_unit); ProgressBar progressBar = holder.getView(R.id.progressBar); tv_name.setText(item.getDescription()); tv_unit.setText(item.getValue()+" ("+item.getUnit()+")"); float barIndex = 0; try { barIndex = (Math.abs(item.getValue()) /item.getUpper()); }catch (Exception e){ }finally { progressBar.setProgress((int) (barIndex*100)); } } } app/src/main/java/com/moral/screen/common/API.java
@@ -5,7 +5,10 @@ */ public class API { public static final String BASE_HTTP = "http://dcdev3.s1.natapp.cc/bronzecoll/"; public static final String URL_HTTP = BASE_HTTP+"api/"; public static final String BASE_HTTP = "http://192.168.1.101:8090/screen_api_v2"; public static final String LOGIN = BASE_HTTP+"/mobile/login"; public static final String DEVICES = BASE_HTTP+"/mobile/devices"; public static final String SENSORS = BASE_HTTP+"/mobile/sensors"; public static final String SENSOR = BASE_HTTP+"/mobile/sensor"; } app/src/main/java/com/moral/screen/httputils/HttpUtils.java
@@ -28,12 +28,14 @@ public class HttpUtils { private Context mConetext; public HttpUtils(Context context) { this.mConetext = context; } /** * Get请求 * * @param url * @param params * @param cacheMode @@ -62,101 +64,12 @@ XLog.e("result:" + s); try { JSONObject jsonObject = new JSONObject(s); int errno = jsonObject.optInt("resultCode"); String message = jsonObject.optString("msg"); int errno = jsonObject.optInt("code"); String message = jsonObject.optString("message"); if(errno == 1){ httpCallBack.onSuccess(jsonObject.optString("resObj"),message); }else if(errno == 1002||errno == 1003){ String errorMsg = jsonObject.optString("errorMsg"); httpCallBack.onFail(errno,errorMsg); httpCallBack.onSuccess(jsonObject.optString("data"), message); }else{ String errorMsg = jsonObject.optString("errorMsg"); httpCallBack.onFail(errno,errorMsg); } } catch (JSONException e) { e.printStackTrace(); } } @Override public void onError(Call call, Response response, Exception e) { super.onError(call, response, e); if (response != null) { int httpCode = response.code(); switch (httpCode) { case 400: XLog.e("请求的语法出错"); T.show("请求的语法出错"); break; case 401: XLog.e("未授权"); T.show("未授权"); break; case 403: XLog.e("请求被拒绝"); T.show("请求被拒绝"); break; case 404: XLog.e("请求的接口不存在"); T.show("请求的接口不存在"); break; case 408: XLog.e("请求超时"); T.show("请求超时"); break; case 500: XLog.e("服务器错误"); T.show("服务器错误"); break; case 503: XLog.e("服务器停机或正在维护"); T.show("服务器停机或正在维护"); break; } } } }); } /** * Get请求 * @param url * @param params * @param cacheMode * @param showLoadingDialog * @param httpCallBack */ public void doGet(final String url, Map<String, String> params, CacheMode cacheMode, final boolean showLoadingDialog, final HttpListCallBack httpCallBack) { OkGo.get(url) .params(params) .cacheKey(String.valueOf(url)) .tag(String.valueOf(url)) .cacheMode(cacheMode) .execute(new StringCallback() { @Override public void onBefore(BaseRequest request) { super.onBefore(request); XLog.e("url:" + request.getUrl()); XLog.e("method:" + request.getMethod()); XLog.e("params:" + request.getParams().toString()); if (showLoadingDialog) httpCallBack.showLoadingDialog(); } @Override public void onSuccess(String s, Call call, Response response) { XLog.e("result:" + s); try { JSONObject jsonObject = new JSONObject(s); int errno = jsonObject.optInt("resultCode"); String message = jsonObject.optString("msg"); int totalPage = jsonObject.optInt("totalPage"); if(errno == 1){ httpCallBack.onSuccess(jsonObject.optString("resObj"),message,totalPage); }else if(errno == 1002||errno == 1003){ String errorMsg = jsonObject.optString("errorMsg"); httpCallBack.onFail(errno,errorMsg); }else{ String errorMsg = jsonObject.optString("errorMsg"); String errorMsg = jsonObject.optString("message"); httpCallBack.onFail(errno,errorMsg); } } catch (JSONException e) { @@ -204,100 +117,6 @@ }); } /** * POST请求 * @param url * @param params * @param cacheMode * @param showLoadingDialog * @param httpCallBack */ public void doPostList(final String url, Map<String, String> params, CacheMode cacheMode, final boolean showLoadingDialog, final HttpListCallBack httpCallBack) { OkGo.post(url) .params(params) .cacheKey(String.valueOf(url)) .tag(String.valueOf(url)) .cacheMode(cacheMode) .execute(new StringCallback() { @Override public void onBefore(BaseRequest request) { super.onBefore(request); XLog.e("url:" + request.getUrl()); XLog.e("method:" + request.getMethod()); XLog.e("params:" + request.getParams().toString()); if (showLoadingDialog) httpCallBack.showLoadingDialog(); } @Override public void onSuccess(String s, Call call, Response response) { XLog.e("result:" + s); try { JSONObject jsonObject = new JSONObject(s); int errno = jsonObject.optInt("resultCode"); String message = jsonObject.optString("msg"); int totalPage = jsonObject.optInt("totalPage"); if(errno == 1){ httpCallBack.onSuccess(jsonObject.optString("resObj"),message,totalPage); }else if(errno == 1002||errno == 1003){ String errorMsg = jsonObject.optString("errorMsg"); httpCallBack.onFail(errno,errorMsg); }else{ String errorMsg = jsonObject.optString("errorMsg"); httpCallBack.onFail(errno,errorMsg); } } catch (JSONException e) { e.printStackTrace(); } } @Override public void onError(Call call, Response response, Exception e) { super.onError(call, response, e); if (response != null) { int httpCode = response.code(); switch (httpCode) { case 400: XLog.e("请求的语法出错"); T.show("请求的语法出错"); break; case 401: XLog.e("未授权"); T.show("未授权"); break; case 403: XLog.e("请求被拒绝"); T.show("请求被拒绝"); break; case 404: XLog.e("请求的接口不存在"); T.show("请求的接口不存在"); break; case 408: XLog.e("请求超时"); T.show("请求超时"); break; case 500: XLog.e("服务器错误"); T.show("服务器错误"); break; case 503: XLog.e("服务器停机或正在维护"); T.show("服务器停机或正在维护"); break; } } } }); } /** * Post请求 * @param url * @param params * @param cacheMode * @param showLoadingDialog * @param httpCallBack */ public void doPost(final String url, Map<String, String> params, CacheMode cacheMode, final boolean showLoadingDialog, final HttpCallBack httpCallBack) { OkGo.post(url) .cacheKey(String.valueOf(url)) @@ -320,15 +139,12 @@ XLog.e("result:" + s); try { JSONObject jsonObject = new JSONObject(s); int errno = jsonObject.optInt("resultCode"); String message = jsonObject.optString("msg"); int errno = jsonObject.optInt("code"); String message = jsonObject.optString("message"); if(errno == 1){ httpCallBack.onSuccess(jsonObject.optString("resObj"),message); }else if(errno == 1002||errno == 1003){ String errorMsg = jsonObject.optString("errorMsg"); httpCallBack.onFail(errno,errorMsg); httpCallBack.onSuccess(jsonObject.optString("data"), message); }else{ String errorMsg = jsonObject.optString("errorMsg"); String errorMsg = jsonObject.optString("message"); httpCallBack.onFail(errno,errorMsg); } } catch (JSONException e) { @@ -367,247 +183,6 @@ break; } } }); } /** * 上传文件 * @param url * @param params * @param uploadCallBack * @param files */ public void uploadFiles(final String url, Map<String, String> params, final UploadCallBack uploadCallBack, List<File> files) { OkGo.post(url) .params(params) .isMultipart(true) .addFileParams("file", files) .execute(new StringCallback() { @Override public void onBefore(BaseRequest request) { super.onBefore(request); PostRequest re = (PostRequest) request; XLog.e("url:" + re.getUrl()); XLog.e("method:" + re.getMethod()); } @Override public void onSuccess(String s, Call call, Response response) { XLog.e("result:" + s); try { JSONObject jsonObject = new JSONObject(s); int errno = jsonObject.optInt("resultCode"); String message = jsonObject.optString("msg"); if(errno == 1){ uploadCallBack.onSuccess(jsonObject.optString("resObj"),message); }else{ uploadCallBack.onFail(message); } } catch (JSONException e) { e.printStackTrace(); } } @Override public void upProgress(long currentSize, long totalSize, float progress, long networkSpeed) { super.upProgress(currentSize, totalSize, progress, networkSpeed); uploadCallBack.onProgress(currentSize, totalSize, progress, networkSpeed); } @Override public void onError(Call call, Response response, Exception e) { super.onError(call, response, e); if (response == null) return; int httpCode = response.code(); switch (httpCode) { case 400: T.show("请求的语法出错"); break; case 401: T.show("未授权"); break; case 403: T.show("请求被拒绝"); break; case 404: T.show("请求的接口不存在"); break; case 408: T.show("请求超时"); break; case 500: T.show("服务器错误"); break; case 503: T.show("服务器停机或正在维护"); break; } } }); } public void uploadFiles(final String url, Map<String, String> params, final UploadCallBack uploadCallBack, List<File> files,List<File> files2) { OkGo.post(url) .params(params) .isMultipart(true) .addFileParams("door", files) .addFileParams("images", files2) .execute(new StringCallback() { @Override public void onBefore(BaseRequest request) { super.onBefore(request); PostRequest re = (PostRequest) request; XLog.e("url:" + re.getUrl()); XLog.e("method:" + re.getMethod()); } @Override public void onSuccess(String s, Call call, Response response) { XLog.e("result:" + s); try { JSONObject jsonObject = new JSONObject(s); int errno = jsonObject.optInt("resultCode"); String message = jsonObject.optString("msg"); if(errno == 1){ uploadCallBack.onSuccess(jsonObject.optString("resObj"),message); }else{ uploadCallBack.onFail(message); } } catch (JSONException e) { e.printStackTrace(); } } @Override public void upProgress(long currentSize, long totalSize, float progress, long networkSpeed) { super.upProgress(currentSize, totalSize, progress, networkSpeed); uploadCallBack.onProgress(currentSize, totalSize, progress, networkSpeed); } @Override public void onError(Call call, Response response, Exception e) { super.onError(call, response, e); if (response == null) return; int httpCode = response.code(); switch (httpCode) { case 400: T.show("请求的语法出错"); break; case 401: T.show("未授权"); break; case 403: T.show("请求被拒绝"); break; case 404: T.show("请求的接口不存在"); break; case 408: T.show("请求超时"); break; case 500: T.show("服务器错误"); break; case 503: T.show("服务器停机或正在维护"); break; } } }); } /** * 上传文件 * @param url * @param params * @param uploadCallBack * @param files */ public void uploadFiles(final String url, Map<String, String> params, final UploadCallBack uploadCallBack, Map<String, File> files) { PostRequest postRequest = OkGo.post(url); postRequest.isMultipart(true); for (String key : files.keySet()) { postRequest.params(key, files.get(key)); } postRequest.params(params) .execute(new StringCallback() { @Override public void onBefore(BaseRequest request) { super.onBefore(request); PostRequest re = (PostRequest) request; XLog.e("url:" + re.getUrl()); XLog.e("method:" + re.getMethod()); } @Override public void onSuccess(String s, Call call, Response response) { XLog.e("result:" + s); try { JSONObject jsonObject = new JSONObject(s); int errno = jsonObject.optInt("resultCode"); String message = jsonObject.optString("msg"); if(errno == 1){ uploadCallBack.onSuccess(jsonObject.optString("resObj"),message); }else{ uploadCallBack.onFail(message); } } catch (JSONException e) { e.printStackTrace(); } } @Override public void upProgress(long currentSize, long totalSize, float progress, long networkSpeed) { super.upProgress(currentSize, totalSize, progress, networkSpeed); uploadCallBack.onProgress(currentSize, totalSize, progress, networkSpeed); } @Override public void onError(Call call, Response response, Exception e) { super.onError(call, response, e); if (response == null) return; int httpCode = response.code(); switch (httpCode) { case 400: T.show("请求的语法出错"); break; case 401: T.show("未授权"); break; case 403: T.show("请求被拒绝"); break; case 404: T.show("请求的接口不存在"); break; case 408: T.show("请求超时"); break; case 500: T.show("服务器错误"); break; case 503: T.show("服务器停机或正在维护"); break; } } }); } public interface UploadCallBack { void onSuccess(String res, String msg); void onFail(String s); void onProgress(long currentSize, long totalSize, float progress, long networkSpeed); } } app/src/main/java/com/moral/screen/model/DeviceBean.java
New file @@ -0,0 +1,143 @@ package com.moral.screen.model; /** * Created by hjzhang on 2018/7/4. */ public class DeviceBean { private int id; private String name; private String address; private double longitude; private double latitude; private String mac; private int operateUserId; private String state; private long createTime; private String installTime; private int monitorPointId; private int deviceVersionId; private String isDelete; private int professionId; private String device_name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public double getLongitude() { return longitude; } public void setLongitude(double longitude) { this.longitude = longitude; } public double getLatitude() { return latitude; } public void setLatitude(double latitude) { this.latitude = latitude; } public String getMac() { return mac; } public void setMac(String mac) { this.mac = mac; } public int getOperateUserId() { return operateUserId; } public void setOperateUserId(int operateUserId) { this.operateUserId = operateUserId; } public String getState() { return state; } public void setState(String state) { this.state = state; } public long getCreateTime() { return createTime; } public void setCreateTime(long createTime) { this.createTime = createTime; } public String getInstallTime() { return installTime; } public void setInstallTime(String installTime) { this.installTime = installTime; } public int getMonitorPointId() { return monitorPointId; } public void setMonitorPointId(int monitorPointId) { this.monitorPointId = monitorPointId; } public int getDeviceVersionId() { return deviceVersionId; } public void setDeviceVersionId(int deviceVersionId) { this.deviceVersionId = deviceVersionId; } public String getIsDelete() { return isDelete; } public void setIsDelete(String isDelete) { this.isDelete = isDelete; } public int getProfessionId() { return professionId; } public void setProfessionId(int professionId) { this.professionId = professionId; } public String getDevice_name() { return device_name; } public void setDevice_name(String device_name) { this.device_name = device_name; } } app/src/main/java/com/moral/screen/model/DeviceDataBean.java
New file @@ -0,0 +1,89 @@ package com.moral.screen.model; /** * Created by hjzhang on 2018/7/4. */ public class DeviceDataBean { private String sensor_key; private String unit; private float upper; private float lower; private String name; private String description; private int id; private String state; private float value; public String getSensor_key() { return sensor_key; } public void setSensor_key(String sensor_key) { this.sensor_key = sensor_key; } public String getUnit() { return unit; } public void setUnit(String unit) { this.unit = unit; } public float getUpper() { return upper; } public void setUpper(float upper) { this.upper = upper; } public float getLower() { return lower; } public void setLower(float lower) { this.lower = lower; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getState() { return state; } public void setState(String state) { this.state = state; } public float getValue() { return value; } public void setValue(float value) { this.value = value; } } app/src/main/java/com/moral/screen/model/SensorData.java
New file @@ -0,0 +1,17 @@ package com.moral.screen.model; /** * Created by hjzhang on 2018/7/10. */ public class SensorData { private float value; public float getValue() { return value; } public void setValue(float value) { this.value = value; } } app/src/main/java/com/moral/screen/utils/SharedPreferencesUtil.java
New file @@ -0,0 +1,45 @@ package com.moral.screen.utils; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; public class SharedPreferencesUtil { private Context mContext; public final static String SP_LOGIN_USER_KEY = "login_user"; public SharedPreferencesUtil(Context context) { this.mContext = context; } public void saveOrgId(int orgId){ SharedPreferences preferences = mContext.getSharedPreferences(SP_LOGIN_USER_KEY, Context.MODE_PRIVATE); Editor editor = preferences.edit(); editor.putInt("orgId",orgId); editor.commit(); } public int getOrgId(){ SharedPreferences sp = mContext.getSharedPreferences(SP_LOGIN_USER_KEY, Context.MODE_PRIVATE); int orgId = sp.getInt("orgId",0); return orgId; } /** * 保存是否第一次登陆 * @param flag */ public void saveFirstUse(int flag) { SharedPreferences preferences = mContext.getSharedPreferences("firstInfo", Context.MODE_PRIVATE); Editor editor = preferences.edit(); editor.putInt("firstUse", flag); editor.commit(); } public int getFirstUse() { SharedPreferences preferences = mContext.getSharedPreferences("firstInfo", Context.MODE_PRIVATE); int firstUse = preferences.getInt("firstUse", 0); return firstUse; } } app/src/main/res/drawable/my_progress_background.xml
New file @@ -0,0 +1,18 @@ <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@android:id/background"> <color android:color="#00ffffff"/> </item> <item android:id="@android:id/progress"> <clip android:clipOrientation="horizontal" android:gravity="left"> <shape> <gradient android:startColor="#00a445" android:endColor="#00ffde"/> </shape> </clip> </item> </layer-list> app/src/main/res/layout/ac_charts_layout.xml
New file @@ -0,0 +1,53 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@mipmap/bg" android:fitsSystemWindows="true" android:orientation="vertical"> <include layout="@layout/top_bar_layout"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:layout_marginLeft="@dimen/x8" android:layout_marginRight="@dimen/x8" android:layout_marginTop="@dimen/x20" android:padding="@dimen/x10" android:background="@mipmap/bg_chart"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:gravity="center_vertical" android:orientation="horizontal"> <ImageView android:layout_width="@dimen/x10" android:layout_height="@dimen/x10" android:src="@mipmap/icon_yuan"/> <TextView android:id="@+id/tv_sub" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/white" android:textSize="16sp" android:layout_gravity="center_horizontal" android:text="PM2.5走势图" android:layout_marginRight="@dimen/x4" android:layout_marginLeft="@dimen/x4" /> <ImageView android:layout_width="@dimen/x10" android:layout_height="@dimen/x10" android:src="@mipmap/icon_xia"/> </LinearLayout> <lecho.lib.hellocharts.view.LineChartView android:id="@+id/chart" android:layout_width="match_parent" android:layout_marginTop="@dimen/x8" android:layout_height="@dimen/y300"> </lecho.lib.hellocharts.view.LineChartView> </LinearLayout> </LinearLayout> app/src/main/res/layout/ac_device_data_layout.xml
New file @@ -0,0 +1,51 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@mipmap/bg" android:fitsSystemWindows="true" android:orientation="vertical"> <RelativeLayout android:layout_width="match_parent" android:layout_height="@dimen/y38"> <TextView android:id="@+id/tv_left" android:layout_width="@dimen/x60" android:layout_height="match_parent" android:gravity="center" android:textColor="@color/white" android:drawablePadding="@dimen/x4" android:textSize="16sp" android:text="返回" android:paddingLeft="@dimen/x16" /> <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:ellipsize="marquee" android:focusable="true" android:focusableInTouchMode="true" android:gravity="center" android:textColor="@color/white" android:marqueeRepeatLimit="marquee_forever" android:singleLine="true" android:text="详细数据" android:textSize="17sp" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="@dimen/x6" android:paddingLeft="@dimen/x2" android:paddingRight="@dimen/x2" android:paddingBottom="@dimen/x10" android:paddingTop="@dimen/x2" android:background="@mipmap/bg_data"> <android.support.v7.widget.RecyclerView android:id="@+id/rv_data" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout> </LinearLayout> app/src/main/res/layout/ac_login_layout.xml
@@ -19,7 +19,6 @@ android:layout_height="@dimen/x40" android:layout_marginLeft="@dimen/x36" android:layout_marginRight="@dimen/x36" android:inputType="number" android:textSize="16sp" android:textColor="@color/white" android:textColorHint="@color/white" @@ -59,5 +58,6 @@ android:textColor="@color/blue_txt" android:text="忘记密码" android:gravity="center" android:visibility="invisible" android:layout_marginTop="@dimen/x60"/> </LinearLayout> app/src/main/res/layout/ac_map_layout.xml
New file @@ -0,0 +1,49 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@mipmap/bg" android:fitsSystemWindows="true" android:orientation="vertical"> <RelativeLayout android:layout_width="match_parent" android:layout_height="@dimen/y38"> <TextView android:id="@+id/tv_left" android:layout_width="@dimen/x60" android:layout_height="match_parent" android:gravity="center" android:textColor="@color/white" android:drawablePadding="@dimen/x4" android:textSize="16sp" android:text="返回" android:paddingLeft="@dimen/x16" /> <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:ellipsize="marquee" android:focusable="true" android:focusableInTouchMode="true" android:gravity="center" android:textColor="@color/white" android:marqueeRepeatLimit="marquee_forever" android:singleLine="true" android:text="监测地点" android:textSize="17sp" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="@dimen/x6" android:padding="@dimen/x2" android:background="@mipmap/bg_map"> <com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /> </RelativeLayout> </LinearLayout> app/src/main/res/layout/list_item_data.xml
New file @@ -0,0 +1,46 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:orientation="horizontal" android:paddingTop="@dimen/x14" android:paddingLeft="@dimen/x4" android:paddingRight="@dimen/x4"> <TextView android:id="@+id/tv_name" android:layout_width="0dp" android:layout_height="wrap_content" android:gravity="right" android:layout_weight="1.2" android:textSize="13sp" android:textColor="@color/white" android:text="颗粒物2.5"/> <RelativeLayout android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="3" android:background="@mipmap/pro_kuang" android:layout_marginRight="@dimen/x6" android:layout_marginLeft="@dimen/x6" android:padding="@dimen/x2"> <ProgressBar android:id="@+id/progressBar" android:layout_width="match_parent" android:layout_height="wrap_content" style="?android:attr/progressBarStyleHorizontal" android:max="100" android:progressDrawable="@drawable/my_progress_background" /> </RelativeLayout> <TextView android:id="@+id/tv_unit" android:layout_width="0dp" android:layout_height="wrap_content" android:gravity="left" android:layout_weight="2.2" android:textColor="@color/white" android:textSize="13sp" android:text="6396(PCS/0.1L)"/> </LinearLayout> app/src/main/res/layout/pop_layout.xml
New file @@ -0,0 +1,40 @@ <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ll_pop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@mipmap/bg_pop" android:paddingLeft="@dimen/x8" android:paddingTop="@dimen/x8" android:paddingRight="@dimen/x8" android:paddingBottom="@dimen/x16" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:orientation="horizontal"> <TextView android:id="@+id/tv_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="XXXXXXXXXXXXXXXXXXXXXXX" android:textSize="13sp" android:textColor="@color/yellow_txt" android:layout_weight="1"/> <ImageView android:id="@+id/iv_close" android:layout_width="@dimen/x20" android:layout_height="@dimen/x20" android:padding="@dimen/x6" android:src="@mipmap/icon_close" /> </LinearLayout> <TextView android:id="@+id/tv_address" android:layout_width="match_parent" android:layout_height="match_parent" android:text="XXXXXXXXXXXXXXXXXXXXXXX" android:textSize="13sp" android:layout_marginTop="@dimen/x4" android:layout_weight="1"/> </LinearLayout> app/src/main/res/layout/top_bar_layout.xml
@@ -1,15 +1,14 @@ <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="@dimen/y38" android:background="@color/white"> android:layout_height="@dimen/y38"> <TextView android:id="@+id/tv_left" android:layout_width="@dimen/x60" android:layout_height="match_parent" android:gravity="center" android:textColor="@color/black_txt" android:textColor="@color/white" android:drawablePadding="@dimen/x4" android:textSize="16sp" android:text="返回" @@ -25,7 +24,7 @@ android:focusable="true" android:focusableInTouchMode="true" android:gravity="center" android:textColor="@color/black_txt" android:textColor="@color/white" android:marqueeRepeatLimit="marquee_forever" android:singleLine="true" android:text="标题" @@ -48,6 +47,6 @@ android:gravity="center" android:text="" android:visibility="gone" android:textColor="@color/black_txt" android:textColor="@color/white" android:layout_alignParentRight="true" /> </RelativeLayout> app/src/main/res/mipmap-xxxhdpi/bg_chart.png
app/src/main/res/mipmap-xxxhdpi/bg_data.png
app/src/main/res/mipmap-xxxhdpi/bg_map.png
app/src/main/res/mipmap-xxxhdpi/bg_pop.png
app/src/main/res/mipmap-xxxhdpi/icon_close.png
app/src/main/res/mipmap-xxxhdpi/icon_level1.png
app/src/main/res/mipmap-xxxhdpi/icon_level2.png
app/src/main/res/mipmap-xxxhdpi/icon_level3.png
app/src/main/res/mipmap-xxxhdpi/icon_normal.png
app/src/main/res/mipmap-xxxhdpi/icon_offline.png
app/src/main/res/mipmap-xxxhdpi/icon_white_jiantou.png
app/src/main/res/mipmap-xxxhdpi/icon_xia.png
app/src/main/res/mipmap-xxxhdpi/icon_yuan.png
app/src/main/res/mipmap-xxxhdpi/pro_kuang.png
app/src/main/res/values/colors.xml
@@ -10,7 +10,7 @@ <color name="dark_black_txt">#040000</color> <color name="black_txt">#323333</color> <color name="green_txt">#92c755</color> <color name="yellow_txt">#eb8600</color> <color name="yellow_txt">#ff7800</color> <color name="ac_bg">#f0f0f0</color> <color name="trans_white">#CCffffff</color> <color name="trans">#00ffffff</color>