diff --git a/.idea/misc.xml b/.idea/misc.xml index bcf70f3..d01cd1e 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -14,7 +14,8 @@ - + + @@ -23,6 +24,9 @@ + + + diff --git a/modulesCore/main/src/main/debug/AndroidManifest.xml b/modulesCore/main/src/main/debug/AndroidManifest.xml index 6b4fd0b..f3c2a29 100644 --- a/modulesCore/main/src/main/debug/AndroidManifest.xml +++ b/modulesCore/main/src/main/debug/AndroidManifest.xml @@ -1,7 +1,7 @@ + package="com.example.modulescore.main"> @@ -17,13 +17,16 @@ tools:ignore="ProtectedPermissions" /> - + . + android:supportsRtl="true"> + @@ -33,9 +36,10 @@ + android:launchMode="singleTask"> + @@ -47,9 +51,11 @@ android:name=".Activities.RunningActivity" android:exported="true" android:launchMode="singleInstance" /> + + diff --git a/modulesCore/main/src/main/java/com/example/modulescore/main/Activities/PreRunActivity.java b/modulesCore/main/src/main/java/com/example/modulescore/main/Activities/PreRunActivity.java index 5a9c9ef..dcae770 100644 --- a/modulesCore/main/src/main/java/com/example/modulescore/main/Activities/PreRunActivity.java +++ b/modulesCore/main/src/main/java/com/example/modulescore/main/Activities/PreRunActivity.java @@ -129,6 +129,14 @@ private void myRequestPermissions(){ //申请WRITE_EXTERNAL_STORAGE权限 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, WRITE_COARSE_LOCATION_REQUEST_CODE); + } else if(ContextCompat.checkSelfPermission(this, Manifest.permission.WAKE_LOCK) + != PackageManager.PERMISSION_GRANTED){ + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WAKE_LOCK}, + WRITE_COARSE_LOCATION_REQUEST_CODE); + }else if(ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) + != PackageManager.PERMISSION_GRANTED){ + ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, + WRITE_COARSE_LOCATION_REQUEST_CODE); } } } \ No newline at end of file diff --git a/modulesCore/main/src/main/java/com/example/modulescore/main/Activities/RunActivity.java b/modulesCore/main/src/main/java/com/example/modulescore/main/Activities/RunActivity.java index 537c3e5..ad73aa7 100644 --- a/modulesCore/main/src/main/java/com/example/modulescore/main/Activities/RunActivity.java +++ b/modulesCore/main/src/main/java/com/example/modulescore/main/Activities/RunActivity.java @@ -1,12 +1,10 @@ package com.example.modulescore.main.Activities; -import android.Manifest; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.content.Intent; -import android.content.pm.PackageManager; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -20,12 +18,10 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.cardview.widget.CardView; import androidx.constraintlayout.widget.ConstraintLayout; -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; import com.amap.api.maps.model.LatLng; -import com.example.modulescore.main.DataBase.MyDataBase; -import com.example.modulescore.main.DataBase.RunningRecord; +import com.example.modulespublic.common.base.MyDataBase; +import com.example.modulespublic.common.base.RunningRecord; import com.example.modulescore.main.EventBus.MessageEvent; import com.example.modulescore.main.UI.View.ProgressButton; import com.example.modulescore.main.R; @@ -38,6 +34,7 @@ import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; +import java.util.Date; import java.util.List; public class RunActivity extends AppCompatActivity implements View.OnClickListener { @@ -55,6 +52,8 @@ public class RunActivity extends AppCompatActivity implements View.OnClickListen RunningRecord record = new RunningRecord(); TextView calorieText; List mPathPointsLine; + Date startTime; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -88,24 +87,23 @@ protected void onCreate(Bundle savedInstanceState) { public void onFinish() { final String TAG = "FINISH_RUNNING"; Log.d(TAG,"start finish"); + //record.setId(Long.valueOf(001)); + record.setUserId("1"); record.setCalorie((String) calorieText.getText()); record.setDistance( distanceview.getText()); Log.d(TAG,passedSeconds.toString()); record.setRunningtime(passedSeconds); - Log.d(TAG,"0"); record.setSpeed((String) speedText.getText()); - Log.d(TAG,"1"); record.setPathPointsLine(mPathPointsLine); - Log.d(TAG,"2"); + record.setStartTime(startTime); new Thread(new Runnable() { @Override public void run() { MyDataBase.getsInstance(getApplicationContext()).runningDao().insertRunningRecord(record); Log.d(TAG,record.toString()); - Log.d(TAG,MyDataBase.getsInstance(getApplicationContext()).runningDao().loadAllRunningRecordss().toString()); + Log.d(TAG+"length", String.valueOf(MyDataBase.getsInstance(getApplicationContext()).runningDao().loadAllRunningRecordss().length)); } }).start(); - Log.d(TAG,"finish finish"); finish(); } @@ -231,6 +229,9 @@ record = event.getRunningRecord(); if(event.getmPathPointsLine()!=null){ mPathPointsLine = event.getmPathPointsLine(); } + if(event.getStartTime()!=null){ + startTime = event.getStartTime(); + } }; @Override protected void onDestroy() { diff --git a/modulesCore/main/src/main/java/com/example/modulescore/main/Activities/RunningActivity.java b/modulesCore/main/src/main/java/com/example/modulescore/main/Activities/RunningActivity.java index 2c02ade..d01a0ef 100644 --- a/modulesCore/main/src/main/java/com/example/modulescore/main/Activities/RunningActivity.java +++ b/modulesCore/main/src/main/java/com/example/modulescore/main/Activities/RunningActivity.java @@ -28,7 +28,7 @@ import com.amap.api.maps.model.LatLng; import com.amap.api.maps.model.MyLocationStyle; import com.amap.api.maps.model.PolylineOptions; -import com.example.modulescore.main.DataBase.RunningRecord; +import com.example.modulespublic.common.base.RunningRecord; import com.example.modulescore.main.EventBus.MessageEvent; import com.example.modulescore.main.R; import com.example.modulescore.main.Util.TimeManager; @@ -80,6 +80,8 @@ public class RunningActivity extends AppCompatActivity implements LocationSource int weight = 60; RunningRecord record = new RunningRecord(); private DecimalFormat decimalFormat = new DecimalFormat("0.00"); + MessageEvent messageEvent = new MessageEvent();//跑步时间 + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -103,9 +105,9 @@ public void onClick(View view) { tv_mapDistance = findViewById(R.id.distanceTicker); tv_mapDistance.setCharacterLists(TickerUtils.provideNumberList()); tv_mapDistance.setAnimationDuration(500); - initMapUI(); initLoc(); + messageEvent.setStartTime(startTime); Intent startRunIntent = new Intent(this,RunActivity.class); startActivity(startRunIntent); if(getIntent().getType()!= null && getIntent().getType().equals(TargetDistanceActivity.isTarget)){ @@ -188,8 +190,6 @@ private void initLoc() { @Override public void onLocationChanged(AMapLocation amapLocation) { String TAG = "RunningActivity_LocationChanged"; - MessageEvent messageEvent = new MessageEvent();//跑步时间 - Log.d(TAG,""); if (amapLocation != null) { if (amapLocation.getErrorCode() == 0) { float nowSpeed = amapLocation.getSpeed(); @@ -230,13 +230,13 @@ public void onLocationChanged(AMapLocation amapLocation) { }else if(isFirstLoc){//如果是第一次,那么改isFirstLoc为false,则之后都不是第一次了 //设置缩放级别 Log.d(TAG,"FirstLoc"); - aMap.moveCamera(CameraUpdateFactory.zoomTo(18)); - aMap.moveCamera(CameraUpdateFactory.changeTilt(0)); + aMap.moveCamera(CameraUpdateFactory.zoomTo(18));//设置地图缩放级别。 + aMap.moveCamera(CameraUpdateFactory.changeTilt(0));//设置地图倾斜度。 isFirstLoc = false; Log.d(TAG,"FirstLoc0"); } //将地图移动到定位点 - aMap.moveCamera(CameraUpdateFactory.changeLatLng(nowLatLng)); + aMap.moveCamera(CameraUpdateFactory.changeLatLng(nowLatLng));//设置地图的中心点。 //点击定位按钮 能够将地图的中心移动到定位点 mListener.onLocationChanged(amapLocation); Log.d(TAG,"FirstLoc00"); diff --git a/modulesCore/main/src/main/java/com/example/modulescore/main/Activities/TargetDistanceActivity.java b/modulesCore/main/src/main/java/com/example/modulescore/main/Activities/TargetDistanceActivity.java index 430b65d..ff30e69 100644 --- a/modulesCore/main/src/main/java/com/example/modulescore/main/Activities/TargetDistanceActivity.java +++ b/modulesCore/main/src/main/java/com/example/modulescore/main/Activities/TargetDistanceActivity.java @@ -104,7 +104,6 @@ public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) { tab.setText(tabs[position]); } }).attach(); - btn_back.setOnClickListener(this); startDistanceRunView.setOnClickListener(this); } diff --git a/modulesCore/main/src/main/java/com/example/modulescore/main/EventBus/MessageEvent.java b/modulesCore/main/src/main/java/com/example/modulescore/main/EventBus/MessageEvent.java index 997dc1d..7f72500 100644 --- a/modulesCore/main/src/main/java/com/example/modulescore/main/EventBus/MessageEvent.java +++ b/modulesCore/main/src/main/java/com/example/modulescore/main/EventBus/MessageEvent.java @@ -2,8 +2,9 @@ import com.amap.api.maps.model.LatLng; -import com.example.modulescore.main.DataBase.RunningRecord; +import com.example.modulespublic.common.base.RunningRecord; +import java.util.Date; import java.util.List; public class MessageEvent { @@ -13,6 +14,15 @@ public class MessageEvent { private RunningRecord runningRecord; private String calorie; private List mPathPointsLine; + private Date startTime; + + public Date getStartTime() { + return startTime; + } + + public void setStartTime(Date startTime) { + this.startTime = startTime; + } public List getmPathPointsLine() { return mPathPointsLine; diff --git a/modulesCore/main/src/main/java/com/example/modulescore/main/Pre/PreDataFragment.java b/modulesCore/main/src/main/java/com/example/modulescore/main/Pre/PreDataFragment.java index bf2ce71..0629bae 100644 --- a/modulesCore/main/src/main/java/com/example/modulescore/main/Pre/PreDataFragment.java +++ b/modulesCore/main/src/main/java/com/example/modulescore/main/Pre/PreDataFragment.java @@ -1,11 +1,10 @@ package com.example.modulescore.main.Pre; +import android.content.Intent; import android.os.Bundle; -import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; -import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log; @@ -15,12 +14,15 @@ import android.widget.LinearLayout; import android.widget.TextView; -import com.example.modulescore.main.DataBase.MyDataBase; -import com.example.modulescore.main.DataBase.RunningRecord; +import com.example.modulespublic.common.base.MyDataBase; +import com.example.modulespublic.common.base.RunningRecord; import com.example.modulescore.main.R; +import com.example.modulescore.main.Trace.TraceActivity; import com.example.modulescore.main.Util.TimeManager; -public class PreDataFragment extends Fragment { +import java.text.SimpleDateFormat; + +public class PreDataFragment extends Fragment implements View.OnClickListener{ public PreDataFragment() { } LinearLayout linearLayout; @@ -35,17 +37,16 @@ public void onCreate(Bundle savedInstanceState) { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - final String TAG = "PreDataFragmentonCreateViewTAG"; + // Inflate the layout for this fragment - View view = inflater.inflate(R.layout.fragment_pre_data, container, false); + View view = inflater.inflate(R.layout.pre_data_item0, container, false); linearLayout = view.findViewById(R.id.linearlayout_pre_data); - Handler handler = new Handler(Looper.getMainLooper()){ - @Override - public void handleMessage(@NonNull Message msg) { - super.handleMessage(msg); - RefreshDataItem(); - } - }; + QueryAllRunningRecords(); + return view; + } + + private void QueryAllRunningRecords(){ + final String TAG = "QueryAllRunningRecordsTAG"; new Thread(new Runnable() { @Override public void run() { @@ -56,9 +57,7 @@ public void run() { preHandler.sendMessage(message); } }).start(); - return view; } - public void RefreshDataItem(){ final String TAG = "RefreshDataItem"; Log.d(TAG, String.valueOf(runningRecords.length)); @@ -72,12 +71,33 @@ private void LinearAddView(RunningRecord record){ TextView distancetext = view.findViewById(R.id.distancetext_runrecord); TextView durationtext = view.findViewById(R.id.duration_text_runrecorditem); TextView calorietext = view.findViewById(R.id.calorietext_runrecoritem); - //startTimetext.setText(TimeManager.formatseconds(record.getStartTime())); - distancetext.setText(record.getDistance()); + TextView speedtext = view.findViewById(R.id.speedtext_runrecoritem); + TextView recordDateText = view.findViewById(R.id.runrecord_Date); + SimpleDateFormat yearFormat = new SimpleDateFormat ("yyyy年"); + SimpleDateFormat dateFormat = new SimpleDateFormat ("MM月dd日"); + SimpleDateFormat minuteFormat = new SimpleDateFormat ("hh:mm"); + recordDateText.setText(dateFormat.format(record.getStartTime())); + startTimetext.setText(minuteFormat.format(record.getStartTime())); + distancetext.setText(record.getDistance()+","+record.getId()); durationtext.setText(TimeManager.formatseconds(record.getRunningtime())); calorietext.setText(record.getCalorie()); + speedtext.setText(record.getSpeed()); linearLayout.addView(view); + view.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(getActivity(), TraceActivity.class); + intent.setType(String.valueOf(record.getId())); + startActivity(intent); + } + }); Log.d("LinearAddView","FINISH"); } + @Override + public void onClick(View view) { + switch (view.getId()){ + + } + } } \ No newline at end of file diff --git a/modulesCore/main/src/main/java/com/example/modulescore/main/Target/ScrollPickerView.java b/modulesCore/main/src/main/java/com/example/modulescore/main/Target/ScrollPickerView.java index bb02204..0578d5f 100644 --- a/modulesCore/main/src/main/java/com/example/modulescore/main/Target/ScrollPickerView.java +++ b/modulesCore/main/src/main/java/com/example/modulescore/main/Target/ScrollPickerView.java @@ -3,10 +3,8 @@ import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; -import android.graphics.Rect; import android.util.AttributeSet; import android.util.Log; -import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; @@ -16,6 +14,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.example.modulescore.main.R; +import com.example.modulescore.main.Util.ScreenUtil; public class ScrollPickerView extends RecyclerView { // diff --git a/modulesCore/main/src/main/java/com/example/modulescore/main/Target/TargetAdapter.java b/modulesCore/main/src/main/java/com/example/modulescore/main/Target/TargetAdapter.java index 1043f97..56f3642 100644 --- a/modulesCore/main/src/main/java/com/example/modulescore/main/Target/TargetAdapter.java +++ b/modulesCore/main/src/main/java/com/example/modulescore/main/Target/TargetAdapter.java @@ -98,6 +98,7 @@ public int getItemViewType(int position) { } return 0; } + public int getViewPagerPostion() { return viewPagerPostion; } diff --git a/modulesCore/main/src/main/java/com/example/modulescore/main/Trace/TraceActivity.java b/modulesCore/main/src/main/java/com/example/modulescore/main/Trace/TraceActivity.java new file mode 100644 index 0000000..53e362b --- /dev/null +++ b/modulesCore/main/src/main/java/com/example/modulescore/main/Trace/TraceActivity.java @@ -0,0 +1,69 @@ +package com.example.modulescore.main.Trace; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.viewpager2.widget.ViewPager2; + +import android.os.Bundle; +import android.os.Looper; +import android.os.Message; + +import com.example.modulespublic.common.base.MyDataBase; +import com.example.modulespublic.common.base.RunningRecord; +import com.example.modulescore.main.R; +import com.google.android.material.tabs.TabLayout; +import com.google.android.material.tabs.TabLayoutMediator; + +public class TraceActivity extends AppCompatActivity { + + final String[] tabs = new String[]{"轨迹","信息"}; + ViewPager2 viewPager2; + TabLayout tabLayout; + RunningRecord selectedRecord; + Bundle savedInstanceState; + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + this.savedInstanceState = savedInstanceState; + setContentView(R.layout.activity_trace); + Long recordId = Long.parseLong(getIntent().getType()); + TraceHandler traceHandler = new TraceHandler(this,Looper.getMainLooper()); + new Thread(new Runnable() { + @Override + public void run() { + selectedRecord = MyDataBase.getsInstance(getApplicationContext()).runningDao().queryRunningRecordById(recordId); + Message message = new Message(); + message.what = traceHandler.finishQuery; + traceHandler.sendMessage(message); + } + }).start(); + viewPager2 = findViewById(R.id.viewpager2_TarceActivity); + tabLayout = findViewById(R.id.tabLayout_TarceActivity); + viewPager2.setOrientation(viewPager2.ORIENTATION_HORIZONTAL); + viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + super.onPageScrolled(position, positionOffset, positionOffsetPixels); + } + @Override + public void onPageSelected(int position) { + super.onPageSelected(position); + } + @Override + public void onPageScrollStateChanged(int state) { + super.onPageScrollStateChanged(state); + } + }); + viewPager2.setOffscreenPageLimit(1); + } + public void initViewPager2Adapter(){ + TraceAdapter traceAdapter = new TraceAdapter(selectedRecord,this,savedInstanceState); + viewPager2.setAdapter(traceAdapter); + new TabLayoutMediator(tabLayout, viewPager2, new TabLayoutMediator.TabConfigurationStrategy() { + @Override + public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) { + tab.setText(tabs[position]); + } + }).attach(); + } +} \ No newline at end of file diff --git a/modulesCore/main/src/main/java/com/example/modulescore/main/Trace/TraceAdapter.java b/modulesCore/main/src/main/java/com/example/modulescore/main/Trace/TraceAdapter.java new file mode 100644 index 0000000..dc10818 --- /dev/null +++ b/modulesCore/main/src/main/java/com/example/modulescore/main/Trace/TraceAdapter.java @@ -0,0 +1,65 @@ +package com.example.modulescore.main.Trace; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.amap.api.maps.model.LatLng; +import com.example.modulespublic.common.base.RunningRecord; +import com.example.modulescore.main.R; + +import java.util.ArrayList; + +public class TraceAdapter extends RecyclerView.Adapter { + private RunningRecord selectedRecord; + private Bundle savedInstanceState; + private TraceActivity traceActivity; + public TraceAdapter(RunningRecord selectedRecord,TraceActivity traceActivity,Bundle savedInstanceState) { + this.selectedRecord = selectedRecord; + this.savedInstanceState = savedInstanceState; + this.traceActivity =traceActivity; + } + + public enum ItemType { + ITEM0, ITEM1 + } + @NonNull + @Override + public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + if(viewType == TraceAdapter.ItemType.ITEM0.ordinal()) { + return new TraceViewHolder0(selectedRecord,savedInstanceState,traceActivity,LayoutInflater.from(parent.getContext()).inflate(R.layout.trace_item0, parent, false)); + }else if(viewType == TraceAdapter.ItemType.ITEM1.ordinal()){ + return new TraceViewHolder1(selectedRecord,LayoutInflater.from(parent.getContext()).inflate(R.layout.trace_item1,parent,false)); + } + return null; + } + + @Override + public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { + if(holder instanceof TraceViewHolder0){ + TraceViewHolder0 traceViewHolder0 = (TraceViewHolder0) holder; + ArrayList pathPointsLine = (ArrayList) selectedRecord.getPathPointsLine(); + traceViewHolder0.addTrace(pathPointsLine.get(0),pathPointsLine.get(pathPointsLine.size()-1),pathPointsLine); + }else { + TraceViewHolder1 traceViewHolder1 = (TraceViewHolder1) holder; + } + } + + @Override + public int getItemCount() { + return 2; + } + + + @Override + public void onViewRecycled(@NonNull RecyclerView.ViewHolder holder) { + super.onViewRecycled(holder); + if(holder instanceof TraceViewHolder0){ + TraceViewHolder0 holder0 = (TraceViewHolder0)holder; + holder0.onDestory(); + } + } +} diff --git a/modulesCore/main/src/main/java/com/example/modulescore/main/Trace/TraceHandler.java b/modulesCore/main/src/main/java/com/example/modulescore/main/Trace/TraceHandler.java new file mode 100644 index 0000000..29c5c68 --- /dev/null +++ b/modulesCore/main/src/main/java/com/example/modulescore/main/Trace/TraceHandler.java @@ -0,0 +1,32 @@ +package com.example.modulescore.main.Trace; + +import android.os.Handler; +import android.os.Looper; +import android.os.Message; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +public class TraceHandler extends Handler { + public final static int finishQuery = 1; + private TraceActivity traceActivity; + public TraceHandler(TraceActivity traceActivity,@NonNull Looper looper) { + super(looper); + this.traceActivity = traceActivity; + } + + public TraceHandler(@NonNull Looper looper, @Nullable Callback callback) { + super(looper, callback); + } + + @Override + public void handleMessage(@NonNull Message msg) { + super.handleMessage(msg); + switch (msg.what){ + case finishQuery: + traceActivity.initViewPager2Adapter(); + break; + } + } + +} diff --git a/modulesCore/main/src/main/java/com/example/modulescore/main/Trace/TraceViewHolder0.java b/modulesCore/main/src/main/java/com/example/modulescore/main/Trace/TraceViewHolder0.java new file mode 100644 index 0000000..9eb24af --- /dev/null +++ b/modulesCore/main/src/main/java/com/example/modulescore/main/Trace/TraceViewHolder0.java @@ -0,0 +1,119 @@ +package com.example.modulescore.main.Trace; + +import android.graphics.Color; +import android.os.Bundle; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; + +import com.amap.api.location.AMapLocationClient; +import com.amap.api.location.AMapLocationClientOption; +import com.amap.api.maps.AMap; +import com.amap.api.maps.CameraUpdateFactory; +import com.amap.api.maps.TextureMapView; +import com.amap.api.maps.UiSettings; +import com.amap.api.maps.model.BitmapDescriptorFactory; +import com.amap.api.maps.model.LatLng; +import com.amap.api.maps.model.LatLngBounds; +import com.amap.api.maps.model.MarkerOptions; +import com.amap.api.maps.model.MyLocationStyle; +import com.amap.api.maps.model.Polyline; +import com.amap.api.maps.model.PolylineOptions; +import com.example.modulespublic.common.base.RunningRecord; +import com.example.modulescore.main.R; + +import java.util.List; + +public class TraceViewHolder0 extends RecyclerView.ViewHolder { + private PolylineOptions polylineOptions; + private Polyline polyline; + private AMap aMap; + private List latLngList; + TextureMapView mapView; + private AMapLocationClient locationClient; + private AMapLocationClientOption LocationOption; + private RunningRecord selectedRecord; + private Bundle savedInstanceState; + + private TraceActivity traceActivity; + public TraceViewHolder0(RunningRecord selectedRecord,Bundle savedInstanceState,TraceActivity traceActivity,@NonNull View itemView) { + super(itemView); + mapView = itemView.findViewById(R.id.mapView_tracefragment0); + this.selectedRecord = selectedRecord; + this.savedInstanceState = savedInstanceState; + this.traceActivity =traceActivity; + initMap(); + } + + private void initMap(){ + + mapView.onCreate(savedInstanceState);// 此方法必须重写 + mapView.onResume(); + //初始化地图控制器对象 + aMap = mapView.getMap(); + //设置地图模式普通地图 + aMap.setMapType(AMap.MAP_TYPE_NORMAL); + //设置定位源(locationSource)。 + //aMap.setLocationSource(this); + //设置是否打开定位图层(myLocationOverlay)。 + aMap.setMyLocationEnabled(true); + + //设置显示定位按钮 并且可以点击 + UiSettings settings = aMap.getUiSettings(); + //设置定位按钮是否可见。 + settings.setMyLocationButtonEnabled(true); + + //定位小蓝点(当前位置)的绘制样式类。 + MyLocationStyle myLocationStyle = new MyLocationStyle(); + //设置圆形的填充颜色 + myLocationStyle.radiusFillColor(Color.argb(0, 0, 0, 0)); + // 设置圆形的边框颜色 + myLocationStyle.strokeColor(Color.TRANSPARENT); + //设置是否显示定位小蓝点,true 显示,false不显示。 + myLocationStyle.showMyLocation(true); + //设置我的位置展示模式,定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。 + myLocationStyle.myLocationType(myLocationStyle.LOCATION_TYPE_LOCATION_ROTATE); + //设置定位图层,我的位置图层(myLocationOverlay)的样式。 + aMap.setMyLocationStyle(myLocationStyle); + } + public void addTrace(LatLng startPoint, LatLng endPoint, + List pathList){ + polylineOptions = new PolylineOptions() + .addAll(pathList) + .width(20) + .color(ContextCompat.getColor(traceActivity, R.color.green));//追加一批顶点到线段的坐标集合。 + aMap.addPolyline(polylineOptions); + aMap.addMarker(new MarkerOptions().position( + startPoint).icon( + BitmapDescriptorFactory.fromResource(R.drawable.startpoint))); + aMap.addMarker(new MarkerOptions().position( + endPoint).icon( + BitmapDescriptorFactory.fromResource(R.drawable.endpoint))); + try { + aMap.moveCamera(CameraUpdateFactory.zoomTo(18));//设置地图缩放级别。 + //设置显示在规定屏幕范围内的地图经纬度范围。 + //设置经纬度范围和mapView边缘的空隙,单位像素。这个值适用于区域的四个边。 + aMap.moveCamera(CameraUpdateFactory.newLatLngBounds(getBounds(), 16));//设置显示在规定屏幕范围内的地图经纬度范围。 + } catch (Exception e) { + e.printStackTrace(); + } + } + + private LatLngBounds getBounds() {//经纬度划分的一个矩形区域。 + LatLngBounds.Builder b = LatLngBounds.builder(); + if (latLngList == null) { + return b.build(); + } + for (int i = 0; i < latLngList.size(); i++) { +//区域包含传入的坐标。区域将进行小范围延伸包含传入的坐标。 更准确来说,它会考虑向东或向西方向扩展(哪一种方法可能环绕地图), +//并选择最小扩展的方法。 如果两种方向得到的矩形区域大小相同,则会选择向东方向扩展。 + b.include(latLngList.get(i)); + } + return b.build(); + } + public void onDestory(){ + mapView.onDestroy(); + } +} diff --git a/modulesCore/main/src/main/java/com/example/modulescore/main/Trace/TraceViewHolder1.java b/modulesCore/main/src/main/java/com/example/modulescore/main/Trace/TraceViewHolder1.java new file mode 100644 index 0000000..a3ff276 --- /dev/null +++ b/modulesCore/main/src/main/java/com/example/modulescore/main/Trace/TraceViewHolder1.java @@ -0,0 +1,19 @@ +package com.example.modulescore.main.Trace; + + +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.example.modulespublic.common.base.RunningRecord; + +public class TraceViewHolder1 extends RecyclerView.ViewHolder { + + private RunningRecord selectedRecord; + public TraceViewHolder1(RunningRecord selectedRecord,@NonNull View itemView) { + super(itemView); + this.selectedRecord = selectedRecord; + } + +} \ No newline at end of file diff --git a/modulesCore/main/src/main/java/com/example/modulescore/main/Target/ScreenUtil.java b/modulesCore/main/src/main/java/com/example/modulescore/main/Util/ScreenUtil.java similarity index 95% rename from modulesCore/main/src/main/java/com/example/modulescore/main/Target/ScreenUtil.java rename to modulesCore/main/src/main/java/com/example/modulescore/main/Util/ScreenUtil.java index 3fc0309..891d634 100644 --- a/modulesCore/main/src/main/java/com/example/modulescore/main/Target/ScreenUtil.java +++ b/modulesCore/main/src/main/java/com/example/modulescore/main/Util/ScreenUtil.java @@ -1,4 +1,4 @@ -package com.example.modulescore.main.Target; +package com.example.modulescore.main.Util; import android.content.res.Resources; import android.util.DisplayMetrics; diff --git a/modulesCore/main/src/main/res/layout/activity_trace.xml b/modulesCore/main/src/main/res/layout/activity_trace.xml new file mode 100644 index 0000000..853db1d --- /dev/null +++ b/modulesCore/main/src/main/res/layout/activity_trace.xml @@ -0,0 +1,19 @@ + + + + + \ No newline at end of file diff --git a/modulesCore/main/src/main/res/layout/fragment_pre_data.xml b/modulesCore/main/src/main/res/layout/pre_data_item0.xml similarity index 93% rename from modulesCore/main/src/main/res/layout/fragment_pre_data.xml rename to modulesCore/main/src/main/res/layout/pre_data_item0.xml index e32a7d5..0fd5c26 100644 --- a/modulesCore/main/src/main/res/layout/fragment_pre_data.xml +++ b/modulesCore/main/src/main/res/layout/pre_data_item0.xml @@ -51,10 +51,6 @@ app:layout_constraintTop_toBottomOf="@id/distancetext_fragment_predata" app:layout_constraintBottom_toBottomOf="parent" android:orientation="vertical"> - \ No newline at end of file diff --git a/modulesCore/main/src/main/res/layout/runrecord_item.xml b/modulesCore/main/src/main/res/layout/runrecord_item.xml index 04b942b..7e68874 100644 --- a/modulesCore/main/src/main/res/layout/runrecord_item.xml +++ b/modulesCore/main/src/main/res/layout/runrecord_item.xml @@ -2,31 +2,40 @@ + - -sys + android:textSize="21sp"/> + android:textSize="14sp"/> + android:textSize="14sp"/> + + + \ No newline at end of file diff --git a/modulesCore/main/src/main/res/layout/trace_item1.xml b/modulesCore/main/src/main/res/layout/trace_item1.xml new file mode 100644 index 0000000..77d9ef6 --- /dev/null +++ b/modulesCore/main/src/main/res/layout/trace_item1.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/modulesCore/main/src/main/java/com/example/modulescore/main/DataBase/LatLngTypeConverter.java b/modulesPublic/common/src/main/java/com/example/modulespublic/common/base/Converters.java similarity index 52% rename from modulesCore/main/src/main/java/com/example/modulescore/main/DataBase/LatLngTypeConverter.java rename to modulesPublic/common/src/main/java/com/example/modulespublic/common/base/Converters.java index 9dc8727..f978ede 100644 --- a/modulesCore/main/src/main/java/com/example/modulescore/main/DataBase/LatLngTypeConverter.java +++ b/modulesPublic/common/src/main/java/com/example/modulespublic/common/base/Converters.java @@ -1,4 +1,4 @@ -package com.example.modulescore.main.DataBase; +package com.example.modulespublic.common.base; import androidx.room.TypeConverter; @@ -8,25 +8,33 @@ import java.lang.reflect.Type; import java.util.Collections; +import java.util.Date; import java.util.List; -public class LatLngTypeConverter { +public class Converters { + @TypeConverter + public static Date fromTimestamp(Long value) { + return value == null ? null : new Date(value); + } + + @TypeConverter + public static Long dateToTimestamp(Date date) { + return date == null ? null : date.getTime(); + } Gson gson = new Gson(); @TypeConverter - public List stringToSomeObjectList(String data) { + public List LatLngListToSomeObjectList(String data) { if (data == null) { return Collections.emptyList(); } - Type listType = new TypeToken>() {}.getType(); - return gson.fromJson(data, listType); } @TypeConverter - public String someObjectListToString(List someObjects) { + public String someObjectListToLatLngList(List someObjects) { return gson.toJson(someObjects); } } diff --git a/modulesCore/main/src/main/java/com/example/modulescore/main/DataBase/MyDataBase.java b/modulesPublic/common/src/main/java/com/example/modulespublic/common/base/MyDataBase.java similarity index 78% rename from modulesCore/main/src/main/java/com/example/modulescore/main/DataBase/MyDataBase.java rename to modulesPublic/common/src/main/java/com/example/modulespublic/common/base/MyDataBase.java index 27f85dd..a91e88c 100644 --- a/modulesCore/main/src/main/java/com/example/modulescore/main/DataBase/MyDataBase.java +++ b/modulesPublic/common/src/main/java/com/example/modulespublic/common/base/MyDataBase.java @@ -1,21 +1,16 @@ -package com.example.modulescore.main.DataBase; +package com.example.modulespublic.common.base; import android.content.Context; -import androidx.annotation.NonNull; -import androidx.room.AutoMigration; import androidx.room.Database; -import androidx.room.DatabaseConfiguration; -import androidx.room.InvalidationTracker; import androidx.room.Room; import androidx.room.RoomDatabase; -import androidx.sqlite.db.SupportSQLiteOpenHelper; - -import java.lang.annotation.Annotation; +import androidx.room.TypeConverters; //数据库持有者,并作为与应用持久关联数据的底层连接的主要访问点。在运行时, //通过Room.databaseBuilder() 或者 Room.inMemoryDatabaseBuilder()获取Database实例。 @Database(entities = {RunningRecord.class}, version = 1, exportSchema = false) +@TypeConverters({Converters.class}) public abstract class MyDataBase extends RoomDatabase { private static MyDataBase Instance; public MyDataBase() { diff --git a/modulesCore/main/src/main/java/com/example/modulescore/main/DataBase/RunningDao.java b/modulesPublic/common/src/main/java/com/example/modulespublic/common/base/RunningDao.java similarity index 75% rename from modulesCore/main/src/main/java/com/example/modulescore/main/DataBase/RunningDao.java rename to modulesPublic/common/src/main/java/com/example/modulespublic/common/base/RunningDao.java index 3ae2f36..13ad0d5 100644 --- a/modulesCore/main/src/main/java/com/example/modulescore/main/DataBase/RunningDao.java +++ b/modulesPublic/common/src/main/java/com/example/modulespublic/common/base/RunningDao.java @@ -1,4 +1,4 @@ -package com.example.modulescore.main.DataBase; +package com.example.modulespublic.common.base; import androidx.room.Dao; import androidx.room.Delete; @@ -7,11 +7,10 @@ import androidx.room.Query; import androidx.room.Update; -import java.util.List; @Dao public interface RunningDao { @Insert(onConflict = OnConflictStrategy.REPLACE) - public void insertRunningRecord(RunningRecord... record);//插入多个数据 + public void insertRunningRecord(RunningRecord... record);//插入多个数据,冲突策略是取代旧数据同时继续事务 @Insert public void insertBothRunningRecords(RunningRecord record1, RunningRecord record2); @Update @@ -20,4 +19,6 @@ public interface RunningDao { public void deleteRunningRecordss(RunningRecord... records); @Query("SELECT * FROM RunningRecord") public RunningRecord[] loadAllRunningRecordss(); + @Query("SELECT * FROM RunningRecord where id = :id") + public RunningRecord queryRunningRecordById(Long id); } diff --git a/modulesCore/main/src/main/java/com/example/modulescore/main/DataBase/RunningRecord.java b/modulesPublic/common/src/main/java/com/example/modulespublic/common/base/RunningRecord.java similarity index 83% rename from modulesCore/main/src/main/java/com/example/modulescore/main/DataBase/RunningRecord.java rename to modulesPublic/common/src/main/java/com/example/modulespublic/common/base/RunningRecord.java index 3bb9939..5b43d7a 100644 --- a/modulesCore/main/src/main/java/com/example/modulescore/main/DataBase/RunningRecord.java +++ b/modulesPublic/common/src/main/java/com/example/modulespublic/common/base/RunningRecord.java @@ -1,4 +1,4 @@ -package com.example.modulescore.main.DataBase; +package com.example.modulespublic.common.base; import androidx.room.ColumnInfo; import androidx.room.Entity; @@ -10,6 +10,7 @@ import com.amap.api.maps.model.LatLng; import java.util.ArrayList; +import java.util.Date; import java.util.List; @Entity(tableName = "RunningRecord") @@ -20,26 +21,31 @@ public class RunningRecord { // 当这个主键是一个字符串时,还要加上@NonNull注解,不然会出现编译错误。 @PrimaryKey private Long id; - //运动轨迹 //表示这是数据库表中的一个列。其中的name表示此对象在表中对应的类名, // 如果不添加此注解,Room默认会以此变量名作为其在表中的列名。 - @TypeConverters(LatLngTypeConverter.class) private List PathPointsLine; //运动距离 private String Distance; //运动时长 private Long Runningtime; //运动开始时间 - private Long StartTime; + private Date StartTime; //消耗卡路里 private String Calorie; //平均时速(公里/小时) private String Speed; //平均配速(分钟/公里) private Double Distribution; - //日期标记 - private String DateTag; + private String UserId; + + public String getUserId() { + return UserId; + } + + public void setUserId(String userId) { + UserId = userId; + } @Override public String toString() { @@ -52,10 +58,17 @@ public String toString() { ", Calorie='" + Calorie + '\'' + ", Speed='" + Speed + '\'' + ", Distribution=" + Distribution + - ", DateTag='" + DateTag + '\'' + '}'; } + public Date getStartTime() { + return StartTime; + } + + public void setStartTime(Date startTime) { + StartTime = startTime; + } + public Long getId() { return id; } @@ -88,14 +101,6 @@ public void setRunningtime(Long runningtime) { Runningtime = runningtime; } - public Long getStartTime() { - return StartTime; - } - - public void setStartTime(Long startTime) { - StartTime = startTime; - } - public String getCalorie() { return Calorie; } @@ -115,16 +120,4 @@ public void setSpeed(String speed) { public Double getDistribution() { return Distribution; } - - public void setDistribution(Double distribution) { - Distribution = distribution; - } - - public String getDateTag() { - return DateTag; - } - - public void setDateTag(String dateTag) { - DateTag = dateTag; - } } diff --git a/modulesPublic/common/src/main/res/drawable/endpoint.png b/modulesPublic/common/src/main/res/drawable/endpoint.png new file mode 100644 index 0000000..9ece8f0 Binary files /dev/null and b/modulesPublic/common/src/main/res/drawable/endpoint.png differ diff --git a/modulesPublic/common/src/main/res/drawable/startpoint.png b/modulesPublic/common/src/main/res/drawable/startpoint.png new file mode 100644 index 0000000..cecbf51 Binary files /dev/null and b/modulesPublic/common/src/main/res/drawable/startpoint.png differ