From 3f6723f64aba44b3e2756b936322108b5cc20a9b Mon Sep 17 00:00:00 2001 From: Fanhuitong <981964879@qq.com> Date: Fri, 8 Mar 2024 09:25:39 +0800 Subject: [PATCH] =?UTF-8?q?version:4.6=20fix:=20update:=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E9=A1=B5=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=BF=AB?= =?UTF-8?q?=E9=80=92=E8=AF=A6=E6=83=85=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 +- app/src/main/AndroidManifest.xml | 5 + .../uiuios/aios/activity/ExpressActivity.java | 112 ++++++++++++ .../aios/activity/InformationActivity.java | 7 +- .../aios/activity/OrderListActivity.java | 17 +- .../aios/adapter/InformationAdapter.java | 2 +- .../com/uiuios/aios/adapter/OrderAdapter.java | 22 ++- .../com/uiuios/aios/bean/ExpressData.java | 44 +++++ .../com/uiuios/aios/bean/LogisticsTrace.java | 99 +++++++++++ .../uiuios/aios/bean/LogisticsTraceDeta.java | 62 +++++++ .../com/uiuios/aios/bean/OrderIndexBean.java | 6 +- .../aios/fragment/second/SecondFragment.java | 2 +- .../aios/network/NetInterfaceManager.java | 8 + .../network/api/order/OrderExpressApi.java | 18 ++ .../java/com/uiuios/aios/utils/TimeUtils.java | 6 + .../com/uiuios/aios/view/TimelineLayout.java | 162 ++++++++++++++++++ .../res/drawable-hdpi/goods_placeholder.png | Bin 0 -> 5916 bytes app/src/main/res/drawable-hdpi/ic_ok.png | Bin 0 -> 1853 bytes .../res/drawable-hdpi/icon_list_nodata.png | Bin 0 -> 9690 bytes .../main/res/drawable/express_background.xml | 13 ++ app/src/main/res/drawable/search_bg.xml | 2 +- app/src/main/res/layout/activity_express.xml | 106 ++++++++++++ app/src/main/res/layout/activity_goods.xml | 11 +- .../main/res/layout/activity_information.xml | 37 ++-- app/src/main/res/layout/activity_order.xml | 2 +- .../main/res/layout/activity_order_list.xml | 43 ++++- app/src/main/res/layout/activity_pay.xml | 5 +- app/src/main/res/layout/item_information.xml | 26 ++- app/src/main/res/layout/item_order.xml | 53 +++++- app/src/main/res/layout/item_timeline.xml | 58 +++++++ app/src/main/res/values/attrs.xml | 17 ++ 31 files changed, 900 insertions(+), 49 deletions(-) create mode 100644 app/src/main/java/com/uiuios/aios/activity/ExpressActivity.java create mode 100644 app/src/main/java/com/uiuios/aios/bean/ExpressData.java create mode 100644 app/src/main/java/com/uiuios/aios/bean/LogisticsTrace.java create mode 100644 app/src/main/java/com/uiuios/aios/bean/LogisticsTraceDeta.java create mode 100644 app/src/main/java/com/uiuios/aios/network/api/order/OrderExpressApi.java create mode 100644 app/src/main/java/com/uiuios/aios/view/TimelineLayout.java create mode 100644 app/src/main/res/drawable-hdpi/goods_placeholder.png create mode 100644 app/src/main/res/drawable-hdpi/ic_ok.png create mode 100644 app/src/main/res/drawable-hdpi/icon_list_nodata.png create mode 100644 app/src/main/res/drawable/express_background.xml create mode 100644 app/src/main/res/layout/activity_express.xml create mode 100644 app/src/main/res/layout/item_timeline.xml diff --git a/app/build.gradle b/app/build.gradle index d0a723c..08c37f9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -15,8 +15,8 @@ android { applicationId "com.uiuios.aios" minSdkVersion 24 targetSdkVersion 29 - versionCode 36 - versionName "4.5" + versionCode 37 + versionName "4.6" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 20df242..6b776a1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -201,6 +201,11 @@ android:name=".activity.OrderListActivity" android:launchMode="singleTask" android:screenOrientation="userPortrait" /> + + >() { + @Override + public void onSubscribe(@NonNull Disposable d) { + Log.e("getOrderExpress", "onSubscribe: "); + } + + @Override + public void onNext(@NonNull BaseResponse expressDataBaseResponse) { + Log.e("getOrderExpress", "onNext: " + expressDataBaseResponse); + if (expressDataBaseResponse.code == 200) { + ExpressData expressData = expressDataBaseResponse.data; + if (expressData.isSuccess()) { + LogisticsTrace logisticsTrace = expressData.getLogisticsTrace(); + mBinding.tvExpressNo.setText(logisticsTrace.getMailNo()); + List logisticsTraceDetaList = logisticsTrace.getLogisticsTraceDetailList(); + for (LogisticsTraceDeta logisticsTraceDeta : logisticsTraceDetaList) { + View view = LayoutInflater.from(ExpressActivity.this).inflate(R.layout.item_timeline, mBinding.timelineLayout, false); + ((TextView) view.findViewById(R.id.tv_action)).setText(logisticsTraceDeta.getDesc()); + ((TextView) view.findViewById(R.id.tv_action_time)).setText(TimeUtils.transferLongToDate(logisticsTraceDeta.getTime())); + ((TextView) view.findViewById(R.id.tv_action_status)).setText(logisticsTraceDeta.getAreaName()); + mBinding.timelineLayout.addView(view); + } + mBinding.timelineLayout.setVisibility(View.VISIBLE); + mBinding.clNodata.setVisibility(View.GONE); + }else { + mBinding.timelineLayout.setVisibility(View.GONE); + mBinding.clNodata.setVisibility(View.VISIBLE); + } + } else { + mBinding.timelineLayout.setVisibility(View.GONE); + mBinding.clNodata.setVisibility(View.VISIBLE); + } + } + + @Override + public void onError(@NonNull Throwable e) { + Log.e("getOrderExpress", "onError: " + e.getMessage()); + } + + @Override + public void onComplete() { + Log.e("getOrderExpress", "onComplete: "); + } + }); + } +} diff --git a/app/src/main/java/com/uiuios/aios/activity/InformationActivity.java b/app/src/main/java/com/uiuios/aios/activity/InformationActivity.java index 24092f6..fa18bf4 100644 --- a/app/src/main/java/com/uiuios/aios/activity/InformationActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/InformationActivity.java @@ -38,10 +38,11 @@ import io.reactivex.rxjava3.disposables.Disposable; public class InformationActivity extends DataBindingActivity { private static final String TAG = InformationActivity.class.getSimpleName(); + @BindView(R.id.tabLayout) TabLayout tabLayout; - @BindView(R.id.root) - ConstraintLayout root; + @BindView(R.id.cl_bar) + ConstraintLayout cl_bar; @BindView(R.id.rv_video) RecyclerView rv_video; @BindView(R.id.cl_nodata) @@ -60,7 +61,7 @@ public class InformationActivity extends DataBindingActivity { .transparent() .apply(); - UltimateBarX.addStatusBarTopPadding(tabLayout); + UltimateBarX.addStatusBarTopPadding(cl_bar); mInformationAdapter = new InformationAdapter(); LinearLayoutManager linearLayoutManager1 = new LinearLayoutManager(this); diff --git a/app/src/main/java/com/uiuios/aios/activity/OrderListActivity.java b/app/src/main/java/com/uiuios/aios/activity/OrderListActivity.java index 46503a5..e83a86e 100644 --- a/app/src/main/java/com/uiuios/aios/activity/OrderListActivity.java +++ b/app/src/main/java/com/uiuios/aios/activity/OrderListActivity.java @@ -4,6 +4,7 @@ import androidx.databinding.DataBindingUtil; import androidx.recyclerview.widget.LinearLayoutManager; import android.util.Log; +import android.view.View; import com.google.android.material.tabs.TabLayout; import com.trello.rxlifecycle4.RxLifecycle; @@ -81,6 +82,12 @@ public class OrderListActivity extends BaseDataBindingActivity { Log.e(TAG, "onTabReselected: " + tab.getText()); } }); + mBinding.ivExit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); } /** @@ -117,14 +124,22 @@ public class OrderListActivity extends BaseDataBindingActivity { OrderIndexData orderIndexData = baseResponse.data; List orderIndexBeanList = orderIndexData.getData(); mOrderAdapter.setOrderIndexBeans(orderIndexBeanList); - }else { + mBinding.rvOrder.setVisibility(View.VISIBLE); + mBinding.clNodata.setVisibility(View.GONE); + } else { mOrderAdapter.setOrderIndexBeans(null); + mBinding.rvOrder.setVisibility(View.GONE); + mBinding.clNodata.setVisibility(View.VISIBLE); } } @Override public void onError(@NonNull Throwable e) { Log.e("getAllOrderListObserver", "onError: " + e.getMessage()); + mOrderAdapter.setOrderIndexBeans(null); + mBinding.rvOrder.setVisibility(View.GONE); + mBinding.clNodata.setVisibility(View.VISIBLE); + onComplete(); } @Override diff --git a/app/src/main/java/com/uiuios/aios/adapter/InformationAdapter.java b/app/src/main/java/com/uiuios/aios/adapter/InformationAdapter.java index 76c315d..21a8cd5 100644 --- a/app/src/main/java/com/uiuios/aios/adapter/InformationAdapter.java +++ b/app/src/main/java/com/uiuios/aios/adapter/InformationAdapter.java @@ -42,7 +42,7 @@ public class InformationAdapter extends RecyclerView.Adapter holder.tv_unit_price.setText("¥" + orderGoods.getBuy_price()); holder.tv_amount.setText(String.valueOf(orderIndexBean.getGoods_total())); holder.tv_paid.setText("实付:¥" + orderIndexBean.getPrice_total() + "元"); + String latest_transport = orderIndexBean.getLatest_transport(); + if (TextUtils.isEmpty(latest_transport)) { + holder.tv_express_info.setText("暂无物流信息"); + } else { + holder.tv_express_info.setText(latest_transport); + } + holder.tv_express.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(mContext, ExpressActivity.class); + intent.putExtra("order_sn",orderIndexBean.getOrder_sn()); + intent.putExtra("order_id",orderIndexBean.getId()); + mContext.startActivity(intent); + } + }); } @Override @@ -71,7 +88,7 @@ public class OrderAdapter extends RecyclerView.Adapter } class OrderHolder extends RecyclerView.ViewHolder { - TextView tv_statu, tv_title, tv_unit_price, tv_amount, tv_paid, tv_express; + TextView tv_statu, tv_title, tv_unit_price, tv_amount, tv_paid, tv_express, tv_express_info; ImageView iv_goods; public OrderHolder(@NonNull View itemView) { @@ -83,6 +100,7 @@ public class OrderAdapter extends RecyclerView.Adapter tv_paid = itemView.findViewById(R.id.tv_paid); tv_express = itemView.findViewById(R.id.tv_express); iv_goods = itemView.findViewById(R.id.iv_goods); + tv_express_info = itemView.findViewById(R.id.tv_express_info); } } diff --git a/app/src/main/java/com/uiuios/aios/bean/ExpressData.java b/app/src/main/java/com/uiuios/aios/bean/ExpressData.java new file mode 100644 index 0000000..4daadfb --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/bean/ExpressData.java @@ -0,0 +1,44 @@ +package com.uiuios.aios.bean; + +import java.io.Serializable; + +public class ExpressData implements Serializable { + private static final long serialVersionUID = 6282718995656979667L; + + String traceId; + String trace_id; + boolean success; + LogisticsTrace logisticsTrace; + + public String getTraceId() { + return traceId; + } + + public void setTraceId(String traceId) { + this.traceId = traceId; + } + + public String getTrace_id() { + return trace_id; + } + + public void setTrace_id(String trace_id) { + this.trace_id = trace_id; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public LogisticsTrace getLogisticsTrace() { + return logisticsTrace; + } + + public void setLogisticsTrace(LogisticsTrace logisticsTrace) { + this.logisticsTrace = logisticsTrace; + } +} diff --git a/app/src/main/java/com/uiuios/aios/bean/LogisticsTrace.java b/app/src/main/java/com/uiuios/aios/bean/LogisticsTrace.java new file mode 100644 index 0000000..49b3546 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/bean/LogisticsTrace.java @@ -0,0 +1,99 @@ +package com.uiuios.aios.bean; + +import java.io.Serializable; +import java.util.List; + +public class LogisticsTrace implements Serializable { + private static final long serialVersionUID = 3064293483233992595L; + + String theLastTime; + String cpCode; + String cpUrl; + String logisticsStatusDesc; + List logisticsTraceDetailList; + String mailNo; + String theLastMessage; + String cpMobile; + String logisticsCompanyName; + String logisticsStatus; + + public String getTheLastTime() { + return theLastTime; + } + + public void setTheLastTime(String theLastTime) { + this.theLastTime = theLastTime; + } + + public String getCpCode() { + return cpCode; + } + + public void setCpCode(String cpCode) { + this.cpCode = cpCode; + } + + public String getCpUrl() { + return cpUrl; + } + + public void setCpUrl(String cpUrl) { + this.cpUrl = cpUrl; + } + + public String getLogisticsStatusDesc() { + return logisticsStatusDesc; + } + + public void setLogisticsStatusDesc(String logisticsStatusDesc) { + this.logisticsStatusDesc = logisticsStatusDesc; + } + + public List getLogisticsTraceDetailList() { + return logisticsTraceDetailList; + } + + public void setLogisticsTraceDetailList(List logisticsTraceDetailList) { + this.logisticsTraceDetailList = logisticsTraceDetailList; + } + + public String getMailNo() { + return mailNo; + } + + public void setMailNo(String mailNo) { + this.mailNo = mailNo; + } + + public String getTheLastMessage() { + return theLastMessage; + } + + public void setTheLastMessage(String theLastMessage) { + this.theLastMessage = theLastMessage; + } + + public String getCpMobile() { + return cpMobile; + } + + public void setCpMobile(String cpMobile) { + this.cpMobile = cpMobile; + } + + public String getLogisticsCompanyName() { + return logisticsCompanyName; + } + + public void setLogisticsCompanyName(String logisticsCompanyName) { + this.logisticsCompanyName = logisticsCompanyName; + } + + public String getLogisticsStatus() { + return logisticsStatus; + } + + public void setLogisticsStatus(String logisticsStatus) { + this.logisticsStatus = logisticsStatus; + } +} diff --git a/app/src/main/java/com/uiuios/aios/bean/LogisticsTraceDeta.java b/app/src/main/java/com/uiuios/aios/bean/LogisticsTraceDeta.java new file mode 100644 index 0000000..d49d90e --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/bean/LogisticsTraceDeta.java @@ -0,0 +1,62 @@ +package com.uiuios.aios.bean; + +import java.io.Serializable; + +public class LogisticsTraceDeta implements Serializable { + private static final long serialVersionUID = 6775968129767296804L; + + String areaCode; + String areaName; + String subLogisticsStatus; + long time; + String logisticsStatus; + String desc; + + public String getAreaCode() { + return areaCode; + } + + public void setAreaCode(String areaCode) { + this.areaCode = areaCode; + } + + public String getAreaName() { + return areaName; + } + + public void setAreaName(String areaName) { + this.areaName = areaName; + } + + public String getSubLogisticsStatus() { + return subLogisticsStatus; + } + + public void setSubLogisticsStatus(String subLogisticsStatus) { + this.subLogisticsStatus = subLogisticsStatus; + } + + public long getTime() { + return time; + } + + public void setTime(long time) { + this.time = time; + } + + public String getLogisticsStatus() { + return logisticsStatus; + } + + public void setLogisticsStatus(String logisticsStatus) { + this.logisticsStatus = logisticsStatus; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } +} diff --git a/app/src/main/java/com/uiuios/aios/bean/OrderIndexBean.java b/app/src/main/java/com/uiuios/aios/bean/OrderIndexBean.java index 1ba5b19..7f75e0a 100644 --- a/app/src/main/java/com/uiuios/aios/bean/OrderIndexBean.java +++ b/app/src/main/java/com/uiuios/aios/bean/OrderIndexBean.java @@ -5,7 +5,7 @@ import java.io.Serializable; public class OrderIndexBean implements Serializable { private static final long serialVersionUID = 4544929539747251262L; - int id; + String id; String order_sn; String sn_id; String sn; @@ -39,11 +39,11 @@ public class OrderIndexBean implements Serializable { AdminInfo admin;// 关联企业 - public int getId() { + public String getId() { return id; } - public void setId(int id) { + public void setId(String id) { this.id = id; } diff --git a/app/src/main/java/com/uiuios/aios/fragment/second/SecondFragment.java b/app/src/main/java/com/uiuios/aios/fragment/second/SecondFragment.java index 98b2e5e..3e390a6 100644 --- a/app/src/main/java/com/uiuios/aios/fragment/second/SecondFragment.java +++ b/app/src/main/java/com/uiuios/aios/fragment/second/SecondFragment.java @@ -235,7 +235,7 @@ public class SecondFragment extends BaseFragment implements SecondContact.View, if (mNewGoodsAdapter.getItemCount() == 0 || mGoodsScrolling) { return; } - Log.e(TAG, "run: " + mNewGoodsAdapter.getItemCount()); + Log.i(TAG, "run: " + mNewGoodsAdapter.getItemCount()); if (mNewGoodsAdapter.getItemCount() <= mCurrentGoodsIndex) { mCurrentGoodsIndex = 0; } else { diff --git a/app/src/main/java/com/uiuios/aios/network/NetInterfaceManager.java b/app/src/main/java/com/uiuios/aios/network/NetInterfaceManager.java index 196b20e..7849c8f 100644 --- a/app/src/main/java/com/uiuios/aios/network/NetInterfaceManager.java +++ b/app/src/main/java/com/uiuios/aios/network/NetInterfaceManager.java @@ -21,6 +21,7 @@ import com.uiuios.aios.bean.BaseResponse; import com.uiuios.aios.bean.CategoryBean; import com.uiuios.aios.bean.Contact; import com.uiuios.aios.bean.DemandBean; +import com.uiuios.aios.bean.ExpressData; import com.uiuios.aios.bean.GoodsList; import com.uiuios.aios.bean.GoodsType; import com.uiuios.aios.bean.HealthCode; @@ -79,6 +80,7 @@ import com.uiuios.aios.network.api.UpdateDesktopApi; import com.uiuios.aios.network.api.UserInfoControl; import com.uiuios.aios.network.api.amap.GeocodingApi; import com.uiuios.aios.network.api.order.AllOrderApi; +import com.uiuios.aios.network.api.order.OrderExpressApi; import com.uiuios.aios.network.api.order.OrderIndexApi; import com.uiuios.aios.network.interceptor.RepeatRequestInterceptor; @@ -485,6 +487,12 @@ public class NetInterfaceManager { .observeOn(AndroidSchedulers.mainThread()); } + public Observable> getOrderExpressObservable(String order_sn, String order_id) { + return mRetrofit.create(OrderExpressApi.class) + .getOrderExpress(RemoteManager.getInstance().getSerial(), order_sn,order_id) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()); + } public RegionListApi getRegionListApi() { return mRetrofit.create(RegionListApi.class); diff --git a/app/src/main/java/com/uiuios/aios/network/api/order/OrderExpressApi.java b/app/src/main/java/com/uiuios/aios/network/api/order/OrderExpressApi.java new file mode 100644 index 0000000..4f16e12 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/network/api/order/OrderExpressApi.java @@ -0,0 +1,18 @@ +package com.uiuios.aios.network.api.order; + +import com.uiuios.aios.bean.BaseResponse; +import com.uiuios.aios.bean.ExpressData; +import com.uiuios.aios.network.UrlAddress; + +import io.reactivex.rxjava3.core.Observable; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface OrderExpressApi { + @GET(UrlAddress.ORDER_EXPRESS) + Observable> getOrderExpress( + @Query("sn") String sn, + @Query("order_sn") String order_sn, + @Query("order_id") String order_id + ); +} diff --git a/app/src/main/java/com/uiuios/aios/utils/TimeUtils.java b/app/src/main/java/com/uiuios/aios/utils/TimeUtils.java index e0b58e7..b850326 100644 --- a/app/src/main/java/com/uiuios/aios/utils/TimeUtils.java +++ b/app/src/main/java/com/uiuios/aios/utils/TimeUtils.java @@ -33,6 +33,12 @@ public class TimeUtils { return sdf.format(date); } + public static String transferSecondgToHour(long second) { + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); + Date date = new Date(second * 1000); + return sdf.format(date); + } + public static String secToTime(int totalSecs) { int hours = totalSecs / 3600; int minutes = (totalSecs % 3600) / 60; diff --git a/app/src/main/java/com/uiuios/aios/view/TimelineLayout.java b/app/src/main/java/com/uiuios/aios/view/TimelineLayout.java new file mode 100644 index 0000000..d6d98d8 --- /dev/null +++ b/app/src/main/java/com/uiuios/aios/view/TimelineLayout.java @@ -0,0 +1,162 @@ +package com.uiuios.aios.view; + + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.drawable.BitmapDrawable; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; +import android.widget.LinearLayout; + +import androidx.annotation.Nullable; + +import com.uiuios.aios.R; + +/** + * Created by Jackie on 2017/3/8. + * 时间轴控件 + */ + +public class TimelineLayout extends LinearLayout { + private Context mContext; + + private int mLineMarginLeft; + private int mLineMarginTop; + private int mLineStrokeWidth; + private int mLineColor; + private int mPointSize; + private int mPointColor; + private Bitmap mIcon; + + private Paint mLinePaint; //线的画笔 + private Paint mPointPaint; //点的画笔 + + + //第一个点的位置 + private int mFirstX; + private int mFirstY; + //最后一个图标的位置 + private int mLastX; + private int mLastY; + + public TimelineLayout(Context context) { + this(context, null); + } + + public TimelineLayout(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public TimelineLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.TimelineLayout); + mLineMarginLeft = ta.getDimensionPixelOffset(R.styleable.TimelineLayout_line_margin_left, 10); + mLineMarginTop = ta.getDimensionPixelOffset(R.styleable.TimelineLayout_line_margin_top, 0); + mLineStrokeWidth = ta.getDimensionPixelOffset(R.styleable.TimelineLayout_line_stroke_width, 5); + mLineColor = ta.getColor(R.styleable.TimelineLayout_line_color, 0xff3dd1a5); + mPointSize = ta.getDimensionPixelSize(R.styleable.TimelineLayout_point_size, 8); + mPointColor = ta.getDimensionPixelOffset(R.styleable.TimelineLayout_point_color, 0xff3dd1a5); + + int iconRes = ta.getResourceId(R.styleable.TimelineLayout_icon_src, R.drawable.ic_ok); + BitmapDrawable drawable = (BitmapDrawable) context.getResources().getDrawable(iconRes); + if (drawable != null) { + mIcon = drawable.getBitmap(); + } + + ta.recycle(); + + setWillNotDraw(false); + initView(context); + } + + private void initView(Context context) { + this.mContext = context; + + mLinePaint = new Paint(); + mLinePaint.setAntiAlias(true); + mLinePaint.setDither(true); + mLinePaint.setColor(mLineColor); + mLinePaint.setStrokeWidth(mLineStrokeWidth); + mLinePaint.setStyle(Paint.Style.FILL_AND_STROKE); + + mPointPaint = new Paint(); + mPointPaint.setAntiAlias(true); + mPointPaint.setDither(true); + mPointPaint.setColor(mPointColor); + mPointPaint.setStyle(Paint.Style.FILL); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + drawTimeline(canvas); + Log.e("TimelineLayout", "onDraw: "); + } + + private void drawTimeline(Canvas canvas) { + Log.e("TimelineLayout", "drawTimeline: "); + int childCount = getChildCount(); + if (childCount > 0) { + if (childCount > 1) { + //大于1,证明至少有2个,也就是第一个和第二个之间连成线,第一个和最后一个分别有点和icon + drawFirstPoint(canvas); + drawLastIcon(canvas); + drawBetweenLine(canvas); + } else if (childCount == 1) { + drawFirstPoint(canvas); + } + } + } + + private void drawFirstPoint(Canvas canvas) { + View child = getChildAt(0); + if (child != null) { + int top = child.getTop(); + mFirstX = mLineMarginLeft; + mFirstY = top + child.getPaddingTop() + mLineMarginTop; + //画圆 + canvas.drawCircle(mFirstX, mFirstY, mPointSize, mPointPaint); + } + } + + private void drawLastIcon(Canvas canvas) { + View child = getChildAt(getChildCount() - 1); + if (child != null) { + int top = child.getTop(); + mLastX = mLineMarginLeft; + mLastY = top + child.getPaddingTop() + mLineMarginTop; + //画图 + canvas.drawBitmap(mIcon, mLastX - (mIcon.getWidth() >> 1), mLastY, null); + } + } + + private void drawBetweenLine(Canvas canvas) { + Log.e("TimelineLayout", "drawBetweenLine: " + getChildCount()); + //从开始的点到最后的图标之间,画一条线 + canvas.drawLine(mFirstX, mFirstY, mLastX, mLastY, mLinePaint); + Log.e("TimelineLayout", "drawBetweenLine: mFirstX = " + mFirstX); + Log.e("TimelineLayout", "drawBetweenLine: mFirstY = " + mFirstY); + Log.e("TimelineLayout", "drawBetweenLine: mLastX = " + mLastX); + Log.e("TimelineLayout", "drawBetweenLine: mLastY = " + mLastY); + for (int i = 0; i < getChildCount() - 1; i++) { + //画圆 + int top = getChildAt(i).getTop(); + int y = top + getChildAt(i).getPaddingTop() + mLineMarginTop; + canvas.drawCircle(mFirstX, y, mPointSize, mPointPaint); + Log.e("TimelineLayout", "drawBetweenLine: y = " + y); + } + } + + public int getLineMarginLeft() { + return mLineMarginLeft; + } + + public void setLineMarginLeft(int lineMarginLeft) { + this.mLineMarginLeft = lineMarginLeft; + invalidate(); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/goods_placeholder.png b/app/src/main/res/drawable-hdpi/goods_placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..b0735c111e9b36396c391b0da7f1cf71641eea8b GIT binary patch literal 5916 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 W@j1VP)qr+4$Uw(fyI9lu`Tqbcr+ftf literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/ic_ok.png b/app/src/main/res/drawable-hdpi/ic_ok.png new file mode 100644 index 0000000000000000000000000000000000000000..de6b916ce7e92411ab2a7ffe594ba8a1e9abff68 GIT binary patch literal 1853 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/express_background.xml b/app/src/main/res/drawable/express_background.xml new file mode 100644 index 0000000..0a3a68f --- /dev/null +++ b/app/src/main/res/drawable/express_background.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/search_bg.xml b/app/src/main/res/drawable/search_bg.xml index bd38047..5ea99f6 100644 --- a/app/src/main/res/drawable/search_bg.xml +++ b/app/src/main/res/drawable/search_bg.xml @@ -3,6 +3,6 @@ + android:color="@color/action_bar_red" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_express.xml b/app/src/main/res/layout/activity_express.xml new file mode 100644 index 0000000..ed62eb1 --- /dev/null +++ b/app/src/main/res/layout/activity_express.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_goods.xml b/app/src/main/res/layout/activity_goods.xml index 7e02541..4e1d5ce 100644 --- a/app/src/main/res/layout/activity_goods.xml +++ b/app/src/main/res/layout/activity_goods.xml @@ -78,10 +78,12 @@ android:id="@+id/tabLayout" android:layout_width="match_parent" android:layout_height="wrap_content" + app:layout_constraintTop_toBottomOf="@+id/constraintLayout" + app:tabIndicatorColor="@color/action_bar_red" + app:tabIndicatorFullWidth="false" + app:tabSelectedTextColor="@color/action_bar_red" app:tabTextAppearance="@style/TabLayoutTextStyle" - app:tabTextColor="@color/black" - app:tabSelectedTextColor="@color/red" - app:layout_constraintTop_toBottomOf="@+id/constraintLayout" /> + app:tabTextColor="@color/black" /> @@ -109,6 +111,7 @@ android:layout_marginTop="@dimen/dp_8" android:maxLines="1" android:text="没有数据" + android:textSize="@dimen/sp_12" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/iv1" /> diff --git a/app/src/main/res/layout/activity_information.xml b/app/src/main/res/layout/activity_information.xml index 571974d..c823f82 100644 --- a/app/src/main/res/layout/activity_information.xml +++ b/app/src/main/res/layout/activity_information.xml @@ -14,23 +14,34 @@ android:layout_height="match_parent" android:background="@color/gray"> - + android:background="@color/action_bar_red" + android:layout_height="wrap_content"> + + + + + app:layout_constraintTop_toBottomOf="@+id/cl_bar" /> + app:layout_constraintTop_toBottomOf="@+id/cl_bar"> diff --git a/app/src/main/res/layout/activity_order.xml b/app/src/main/res/layout/activity_order.xml index c5f49d3..ce8679f 100644 --- a/app/src/main/res/layout/activity_order.xml +++ b/app/src/main/res/layout/activity_order.xml @@ -117,7 +117,7 @@ android:layout_marginTop="@dimen/dp_8" android:layout_marginBottom="@dimen/dp_8" android:adjustViewBounds="true" - app:error="@{@drawable/he999}" + app:error="@{@drawable/goods_placeholder}" app:imageUrl="@{goodsInfo.img}" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/activity_order_list.xml b/app/src/main/res/layout/activity_order_list.xml index 68aae14..cbb63eb 100644 --- a/app/src/main/res/layout/activity_order_list.xml +++ b/app/src/main/res/layout/activity_order_list.xml @@ -23,6 +23,7 @@ app:layout_constraintTop_toTopOf="parent"> @@ -94,8 +97,46 @@ android:id="@+id/rv_order" android:layout_width="match_parent" android:layout_height="0dp" + android:background="@color/gray" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintTop_toBottomOf="@+id/tabLayout" /> + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_pay.xml b/app/src/main/res/layout/activity_pay.xml index 12e3099..67e35a3 100644 --- a/app/src/main/res/layout/activity_pay.xml +++ b/app/src/main/res/layout/activity_pay.xml @@ -58,7 +58,7 @@ android:layout_marginTop="@dimen/dp_16" android:adjustViewBounds="true" android:scaleType="centerCrop" - app:error="@{@drawable/he999}" + app:error="@{@drawable/goods_placeholder}" app:imageUrl="@{wxpayBean.goods_img}" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" @@ -94,7 +94,7 @@ android:id="@+id/tv_price" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginTop="@dimen/dp_32" + android:layout_marginTop="@dimen/dp_16" android:text="@{wxpayBean.price}" android:textColor="@color/red" android:textSize="@dimen/sp_18" @@ -103,7 +103,6 @@ app:layout_constraintTop_toBottomOf="@+id/textView13" tools:text="100.00" /> - + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_order.xml b/app/src/main/res/layout/item_order.xml index 8f5e09c..e0606dc 100644 --- a/app/src/main/res/layout/item_order.xml +++ b/app/src/main/res/layout/item_order.xml @@ -11,6 +11,8 @@ android:background="@color/white" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" + app:layout_constraintBottom_toBottomOf="parent" + android:layout_marginBottom="@dimen/dp_4" app:layout_constraintTop_toTopOf="parent"> + + + + + + + app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintTop_toBottomOf="@+id/view2" /> + \ No newline at end of file diff --git a/app/src/main/res/layout/item_timeline.xml b/app/src/main/res/layout/item_timeline.xml new file mode 100644 index 0000000..05df2b3 --- /dev/null +++ b/app/src/main/res/layout/item_timeline.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 0a3c5fe..e00addf 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -50,4 +50,21 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file