diff --git a/base/build.gradle b/base/build.gradle index 2d49fa9..37933a5 100644 --- a/base/build.gradle +++ b/base/build.gradle @@ -105,6 +105,8 @@ dependencies { //刷新框架 api "com.scwang.smartrefresh:SmartRefreshLayout:${versions.smartRefreshLayout}" api "com.scwang.smartrefresh:SmartRefreshHeader:${versions.smartRefreshLayout}" + //lottie动画 + api "com.airbnb.android:lottie:${versions.lottie}" testImplementation 'junit:junit:4.12' androidTestImplementation 'androidx.test:runner:1.2.0' diff --git a/base/src/main/java/com/heyongrui/base/assist/ConfigConstants.java b/base/src/main/java/com/heyongrui/base/assist/ConfigConstants.java index 7c437d5..830fd5c 100644 --- a/base/src/main/java/com/heyongrui/base/assist/ConfigConstants.java +++ b/base/src/main/java/com/heyongrui/base/assist/ConfigConstants.java @@ -19,9 +19,11 @@ public class ConfigConstants { public static final String PATH_TARGET = "target_path"; //main模块路由路径 - public static final String PATH_MAIN = "/main/activity"; - public static final String PATH_PLANET_BALL = "/main/planetBall"; - public static final String PATH_HOME_PROVIDER = "/home/main/service"; + public static final String PATH_MAIN = "/home/main"; + public static final String PATH_PLANET_BALL = "/home/planetBall"; + public static final String PATH_MOB = "/home/mob"; + public static final String PATH_WEATHER = "/home/weather"; + public static final String PATH_HOME_PROVIDER = "/home/service"; //user模块路由路径 public static final String PATH_ENCOURAGE = "/user/encourage"; public static final String PATH_KOTLIN = "/user/kotlin"; diff --git a/config.gradle b/config.gradle index b9816f4..ff2496d 100644 --- a/config.gradle +++ b/config.gradle @@ -43,5 +43,6 @@ ext { jiaozivideoplayer : '7.0.4', ahbottomnavigation: '2.3.4', banner : '2.3.16', + lottie : '3.0.7', ] } \ No newline at end of file diff --git a/main/src/main/AndroidManifest.xml b/main/src/main/AndroidManifest.xml index 32ec01d..5ce988b 100644 --- a/main/src/main/AndroidManifest.xml +++ b/main/src/main/AndroidManifest.xml @@ -8,5 +8,11 @@ + + diff --git a/main/src/main/debug/AndroidManifest.xml b/main/src/main/debug/AndroidManifest.xml index 9b3f8b1..0b734ba 100644 --- a/main/src/main/debug/AndroidManifest.xml +++ b/main/src/main/debug/AndroidManifest.xml @@ -21,6 +21,12 @@ + + diff --git a/main/src/main/java/com/heyongrui/main/HomeFragment.java b/main/src/main/java/com/heyongrui/main/HomeFragment.java index e41b99e..eb65f49 100644 --- a/main/src/main/java/com/heyongrui/main/HomeFragment.java +++ b/main/src/main/java/com/heyongrui/main/HomeFragment.java @@ -89,7 +89,8 @@ protected void initData(Bundle savedInstanceState) { } private void initPlanetBallView(PlanetBallView planetBallView, List floatingDtoList) { - int dp70 = ConvertUtils.dp2px(70); + int dp80 = ConvertUtils.dp2px(80); + int dp30 = ConvertUtils.dp2px(30); planetBallView.setAdapter(new PlanetAdapter() { @Override public int getCount() { @@ -110,7 +111,7 @@ public View getView(Context context, int position, ViewGroup parent) { iconRes = ((FloatingDto) item).getIcon_res(); } MarqueeTextView marqueeTextView = new MarqueeTextView(context); - ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(dp70, dp70); + ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(dp80, dp80); marqueeTextView.setLayoutParams(layoutParams); marqueeTextView.setBackgroundResource(R.drawable.bg_circle_shadow); marqueeTextView.setGravity(Gravity.CENTER); @@ -121,7 +122,7 @@ public View getView(Context context, int position, ViewGroup parent) { marqueeTextView.setTextColor(Color.WHITE); marqueeTextView.setText(TextUtils.isEmpty(name) ? "" : name); Drawable drawable = ContextCompat.getDrawable(context, iconRes); - drawable.setBounds(0, 0, 80, 80 * drawable.getIntrinsicHeight() / drawable.getIntrinsicWidth()); + drawable.setBounds(0, 0, dp30, dp30 * drawable.getIntrinsicHeight() / drawable.getIntrinsicWidth()); marqueeTextView.setCompoundDrawables(null, drawable, null, null); marqueeTextView.setFocusable(true); marqueeTextView.post(() -> marqueeTextView.onWindowFocusChanged(true)); @@ -130,16 +131,22 @@ public View getView(Context context, int position, ViewGroup parent) { int type = ((FloatingDto) item).getType(); switch (type) { case 1://分词解析 + ARouter.getInstance().build(ConfigConstants.PATH_MOB).withInt("mobType", 1).navigation(); break; case 2://航班查询 + ARouter.getInstance().build(ConfigConstants.PATH_MOB).withInt("mobType", 2).navigation(); break; case 3://身份证查询 + ARouter.getInstance().build(ConfigConstants.PATH_MOB).withInt("mobType", 3).navigation(); break; case 4://天气预报 + ARouter.getInstance().build(ConfigConstants.PATH_WEATHER).navigation(); break; case 5://新华字典查询 + ARouter.getInstance().build(ConfigConstants.PATH_MOB).withInt("mobType", 5).navigation(); break; case 6://成语查询 + ARouter.getInstance().build(ConfigConstants.PATH_MOB).withInt("mobType", 6).navigation(); break; case 7://动作布局动画 ARouter.getInstance().build(ConfigConstants.PATH_KOTLIN).navigation(); diff --git a/main/src/main/java/com/heyongrui/main/adapter/DragAndSwipeAdapter.java b/main/src/main/java/com/heyongrui/main/adapter/DragAndSwipeAdapter.java new file mode 100644 index 0000000..9b2287a --- /dev/null +++ b/main/src/main/java/com/heyongrui/main/adapter/DragAndSwipeAdapter.java @@ -0,0 +1,31 @@ +package com.heyongrui.main.adapter; + +import com.chad.library.adapter.base.BaseItemDraggableAdapter; +import com.chad.library.adapter.base.BaseViewHolder; + +import java.util.List; + +/** + * Created by lambert on 2018/11/13. + * 拖拽、滑动适配器 + */ +public class DragAndSwipeAdapter extends BaseItemDraggableAdapter { + private int mItemType; + + public DragAndSwipeAdapter(List data, int itemType) { + super(data); + mItemType = itemType; + } + + public DragAndSwipeAdapter(int layoutResId, int itemType, List data) { + super(layoutResId, data); + mItemType = itemType; + } + + @Override + protected void convert(BaseViewHolder helper, Object item) { + switch (mItemType) { + + } + } +} diff --git a/main/src/main/java/com/heyongrui/main/adapter/ExpandableAdapter.java b/main/src/main/java/com/heyongrui/main/adapter/ExpandableAdapter.java new file mode 100644 index 0000000..0619f6e --- /dev/null +++ b/main/src/main/java/com/heyongrui/main/adapter/ExpandableAdapter.java @@ -0,0 +1,32 @@ +package com.heyongrui.main.adapter; + +import androidx.core.content.ContextCompat; + +import com.chad.library.adapter.base.BaseMultiItemQuickAdapter; +import com.chad.library.adapter.base.BaseViewHolder; +import com.chad.library.adapter.base.entity.MultiItemEntity; +import com.heyongrui.base.utils.UiUtil; +import com.heyongrui.main.R; + +import java.util.List; + +/** + * Created by lambert on 2018/8/29. + * 可折叠分组适配器 + */ +public class ExpandableAdapter extends BaseMultiItemQuickAdapter { + + public static final int HOTEL_ROOM_TYPE = 10004; + + public ExpandableAdapter(List data) { + super(data); +// addItemType(HOTEL_ROOM_TYPE, R.layout.adapter_item_hotel_room_type); + } + + @Override + protected void convert(BaseViewHolder helper, MultiItemEntity item) { + UiUtil.setOnclickFeedBack(mContext, ContextCompat.getColor(mContext, R.color.background), ContextCompat.getColor(mContext, R.color.gray), helper.itemView); + switch (helper.getItemViewType()) { + } + } +} diff --git a/main/src/main/java/com/heyongrui/main/adapter/HomeSectionAdapter.java b/main/src/main/java/com/heyongrui/main/adapter/HomeSectionAdapter.java new file mode 100644 index 0000000..c57d9b6 --- /dev/null +++ b/main/src/main/java/com/heyongrui/main/adapter/HomeSectionAdapter.java @@ -0,0 +1,89 @@ +package com.heyongrui.main.adapter; + +import android.text.TextUtils; + +import com.chad.library.adapter.base.BaseSectionMultiItemQuickAdapter; +import com.chad.library.adapter.base.BaseViewHolder; +import com.heyongrui.main.R; +import com.heyongrui.main.data.dto.FlightDto; + +import java.util.List; + + +/** + * lambert + * 2019/6/25 18:17 + */ +public class HomeSectionAdapter extends BaseSectionMultiItemQuickAdapter { + + public HomeSectionAdapter(List data) { + this(0, data); + } + + public HomeSectionAdapter(int sectionHeadResId, List data) { + super(sectionHeadResId, data); + addItemType(HomeSectionEntity.FLIGHT, R.layout.recycle_item_flight); + } + + @Override + protected void convertHead(BaseViewHolder helper, HomeSectionEntity item) { +// switch (item.getItemType()) { +// case HomeSectionEntity.FLIGHT: +// TextView tvHeadSection = helper.getView(android.R.id.text1); +// if (null != tvHeadSection) { +// tvHeadSection.setText(TextUtils.isEmpty(item.header) ? "" : item.header); +// } +// break; +// } + } + + @Override + protected void convert(BaseViewHolder helper, HomeSectionEntity item) { + switch (helper.getItemViewType()) { + case HomeSectionEntity.FLIGHT: { + String flightCompany = "", flightNumber = "", flightRate = "", flightTime = "", fromAirport = "", + fromAirportCode = "", fromCity = "", fromCityCode = "", fromTerminal = "", planTime = "", + planArriveTime = "", toAirport = "", toAirportCode = "", toCity = "", toCityCode = "", + toTerminal = "", flightCycle = ""; + FlightDto flightDto = item.getFlightDto(); + if (null != flightDto) { + flightCompany = flightDto.getAirLines(); + flightNumber = flightDto.getFlightNo(); + flightRate = flightDto.getFlightRate(); + flightTime = flightDto.getFlightTime(); + fromAirport = flightDto.getFrom(); + fromAirportCode = flightDto.getFromAirportCode(); + fromCity = flightDto.getFromCityName(); + fromCityCode = flightDto.getFromCityCode(); + fromTerminal = flightDto.getFromTerminal(); + planTime = flightDto.getPlanTime(); + planArriveTime = flightDto.getPlanArriveTime(); + toAirport = flightDto.getTo(); + toAirportCode = flightDto.getToAirportCode(); + toCity = flightDto.getToCityName(); + toCityCode = flightDto.getToCityCode(); + toTerminal = flightDto.getToTerminal(); + flightCycle = flightDto.getWeek(); + } + helper.setText(R.id.tv_company, TextUtils.isEmpty(flightCompany) ? "" : flightCompany); + helper.setText(R.id.tv_flight_number, TextUtils.isEmpty(flightNumber) ? "" : flightNumber); + helper.setText(R.id.tv_flight_rate, TextUtils.isEmpty(flightRate) ? "" : flightRate); + helper.setText(R.id.tv_flight_time, TextUtils.isEmpty(flightTime) ? "" : flightTime); + helper.setText(R.id.tv_from_airport, TextUtils.isEmpty(fromAirport) ? "" : fromAirport); + helper.setText(R.id.tv_from_airport_code, TextUtils.isEmpty(fromAirportCode) ? "" : fromAirportCode); + helper.setText(R.id.tv_from_city_name, TextUtils.isEmpty(fromCity) ? "" : fromCity); + helper.setText(R.id.tv_from_city_code, TextUtils.isEmpty(fromCityCode) ? "" : fromCityCode); + helper.setText(R.id.tv_from_terminal, TextUtils.isEmpty(fromTerminal) ? "" : fromTerminal); + helper.setText(R.id.tv_plan_time, TextUtils.isEmpty(planTime) ? "" : planTime); + helper.setText(R.id.tv_plan_arrive_time, TextUtils.isEmpty(planArriveTime) ? "" : planArriveTime); + helper.setText(R.id.tv_to_airport, TextUtils.isEmpty(toAirport) ? "" : toAirport); + helper.setText(R.id.tv_to_airport_code, TextUtils.isEmpty(toAirportCode) ? "" : toAirportCode); + helper.setText(R.id.tv_to_city_name, TextUtils.isEmpty(toCity) ? "" : toCity); + helper.setText(R.id.tv_to_city_code, TextUtils.isEmpty(toCityCode) ? "" : toCityCode); + helper.setText(R.id.tv_to_terminal, TextUtils.isEmpty(toTerminal) ? "" : toTerminal); + helper.setText(R.id.tv_flight_cycle, TextUtils.isEmpty(flightCycle) ? "" : flightCycle); + } + break; + } + } +} diff --git a/main/src/main/java/com/heyongrui/main/adapter/HomeSectionEntity.java b/main/src/main/java/com/heyongrui/main/adapter/HomeSectionEntity.java new file mode 100644 index 0000000..06beb91 --- /dev/null +++ b/main/src/main/java/com/heyongrui/main/adapter/HomeSectionEntity.java @@ -0,0 +1,80 @@ +package com.heyongrui.main.adapter; + +import com.chad.library.adapter.base.entity.MultiItemEntity; +import com.chad.library.adapter.base.entity.SectionMultiEntity; +import com.heyongrui.main.data.dto.FlightDto; + +import java.util.List; + +/** + * lambert + * 2019/6/25 18:13 + */ +public class HomeSectionEntity extends SectionMultiEntity implements MultiItemEntity { + + public static final int FLIGHT = 100; + + private int itemType; + private int spanSize; + + private Object object; + private FlightDto flightDto; + + public HomeSectionEntity(boolean isHeader, String header, boolean isShow) { + super(isHeader, header); + } + + public HomeSectionEntity(int itemType, Object object) { + this(itemType, 1, object); + } + + public HomeSectionEntity(int itemType, int spanSize, Object object) { + super(object); + this.itemType = itemType; + this.spanSize = spanSize; + this.object = object; + if (object != null) { + if (object instanceof List && ((List) object).size() > 0) { + Object o = ((List) object).get(0); +// if (o instanceof BannerDto) { +// this.bannerDtoList = (List) object; +// } + } else if (object instanceof FlightDto) { + this.flightDto = (FlightDto) object; + } + } + } + + @Override + public int getItemType() { + return itemType; + } + + public void setItemType(int itemType) { + this.itemType = itemType; + } + + public int getSpanSize() { + return spanSize; + } + + public void setSpanSize(int spanSize) { + this.spanSize = spanSize; + } + + public Object getObject() { + return object; + } + + public void setObject(Object object) { + this.object = object; + } + + public FlightDto getFlightDto() { + return flightDto; + } + + public void setFlightDto(FlightDto flightDto) { + this.flightDto = flightDto; + } +} diff --git a/main/src/main/java/com/heyongrui/main/dagger/ActivityContext.java b/main/src/main/java/com/heyongrui/main/dagger/ActivityContext.java new file mode 100644 index 0000000..4a37bf6 --- /dev/null +++ b/main/src/main/java/com/heyongrui/main/dagger/ActivityContext.java @@ -0,0 +1,12 @@ +package com.heyongrui.main.dagger; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +import javax.inject.Qualifier; + +@Qualifier +@Retention(RetentionPolicy.RUNTIME) +public @interface ActivityContext { + +} \ No newline at end of file diff --git a/main/src/main/java/com/heyongrui/main/dagger/HomeComponent.java b/main/src/main/java/com/heyongrui/main/dagger/HomeComponent.java new file mode 100644 index 0000000..07f40c2 --- /dev/null +++ b/main/src/main/java/com/heyongrui/main/dagger/HomeComponent.java @@ -0,0 +1,27 @@ +package com.heyongrui.main.dagger; + +import android.app.Activity; + +import androidx.fragment.app.Fragment; + +import com.heyongrui.base.dagger.AppComponent; +import com.heyongrui.base.dagger.PerActivity; +import com.heyongrui.main.mob.presenter.MobPresenter; + +import dagger.Component; + +/** + * 2019/8/26 + * lambert + * 此Component依赖AppComponent,由于AppComponent使用了@Singleton,此处只能使用自定义@Scope(@PerActivity) + */ + +@PerActivity +@Component(dependencies = AppComponent.class, modules = {HomeModule.class}) +public interface HomeComponent { + Activity getActivity(); + + Fragment getFragment(); + + void inject(MobPresenter mobPresenter); +} diff --git a/main/src/main/java/com/heyongrui/main/dagger/HomeModule.java b/main/src/main/java/com/heyongrui/main/dagger/HomeModule.java new file mode 100644 index 0000000..e5ad892 --- /dev/null +++ b/main/src/main/java/com/heyongrui/main/dagger/HomeModule.java @@ -0,0 +1,62 @@ +package com.heyongrui.main.dagger; + + +import android.app.Activity; +import android.content.Context; + +import androidx.fragment.app.Fragment; + +import com.heyongrui.base.dagger.PerActivity; +import com.heyongrui.main.data.service.MobService; + +import dagger.Module; +import dagger.Provides; + +@Module +public class HomeModule { + + private Activity mActivity; + private Fragment mFragment; + + public HomeModule() { + } + + public HomeModule(Activity activity) { + mActivity = activity; + } + + public HomeModule(Fragment fragment) { + this.mFragment = fragment; + } + + @Provides + Activity provideActivity() { + return mActivity; + } + + @Provides + Fragment provideFragment() { + return mFragment; + } + + /* + * @ActivityContext别名,通过在@Inject时加入这个自定义注解达到返回相同provider类型但是数据不同(eg:User() User(int age)) + */ + @Provides + @ActivityContext + Context providesContext() { + Context context = null; + if (null != mActivity) { + context = mActivity; + } else if (null != mFragment) { + context = mFragment.getContext(); + } + return context; + } + + @Provides + @PerActivity + MobService provideMobService() { + return new MobService(); + } +} diff --git a/main/src/main/java/com/heyongrui/main/data/api/MobApi.java b/main/src/main/java/com/heyongrui/main/data/api/MobApi.java new file mode 100644 index 0000000..aff503c --- /dev/null +++ b/main/src/main/java/com/heyongrui/main/data/api/MobApi.java @@ -0,0 +1,76 @@ +package com.heyongrui.main.data.api; + +import com.heyongrui.main.data.dto.DictionaryDto; +import com.heyongrui.main.data.dto.FlightDto; +import com.heyongrui.main.data.dto.IDCardDto; +import com.heyongrui.main.data.dto.IdiomDto; +import com.heyongrui.main.data.dto.MobResponse; +import com.heyongrui.main.data.dto.WeatherDto; + +import java.util.List; + +import io.reactivex.Observable; +import retrofit2.http.GET; +import retrofit2.http.Query; + +public interface MobApi { + + /** + * 分词解析 + */ + @GET("word/analyzer") + Observable>> participleParse(@Query("key") String key, + @Query("duid") String duid, + @Query("type") String type, + @Query("text") String base64Str); + + /** + * 成语查询 + */ + @GET("appstore/idiom/query") + Observable> idiomQuery(@Query("key") String key, + @Query("duid") String duid, + @Query("name") String idiomStr); + + /** + * 新华字典查询 + */ + @GET("appstore/dictionary/query") + Observable> dictionaryQuery(@Query("key") String key, + @Query("duid") String duid, + @Query("name") String word); + + /** + * 身份证信息查询 + */ + @GET("idcard/query") + Observable> idCardQuery(@Query("key") String key, + @Query("duid") String duid, + @Query("cardno") String cardNo); + + /** + * 根据起落城市名或者机场代码查询航班信息(start=北京/BJS) + */ + @GET("flight/line/query") + Observable>> flightQuery(@Query("key") String key, + @Query("duid") String duid, + @Query("start") String start, + @Query("end") String end); + + /** + * 根据航班号查询航班信息(name=CZ9902) + */ + @GET("flight/no/query") + Observable>> flightNoQuery(@Query("key") String key, + @Query("duid") String duid, + @Query("name") String flightNo); + + /** + * 根据ip地址查询天气 + */ + @GET("v1/weather/ip") + Observable>> weatherQueryByIp(@Query("key") String key, + @Query("duid") String duid, + @Query("ip") String ip); + +} diff --git a/main/src/main/java/com/heyongrui/main/data/dto/DictionaryDto.java b/main/src/main/java/com/heyongrui/main/data/dto/DictionaryDto.java new file mode 100644 index 0000000..749edd9 --- /dev/null +++ b/main/src/main/java/com/heyongrui/main/data/dto/DictionaryDto.java @@ -0,0 +1,87 @@ +package com.heyongrui.main.data.dto; + +public class DictionaryDto { + /** + * bihua : 30 + * bihuaWithBushou : 26 + * brief : 爨;cuàn;烧火做饭:分居各爨。;灶:“客传萧寒爨不烟。”
{ + private int retCode;//200 + private String msg;//success + private T result; + + public int getRetCode() { + return retCode; + } + + public void setRetCode(int retCode) { + this.retCode = retCode; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public T getResult() { + return result; + } + + public void setResult(T result) { + this.result = result; + } +} diff --git a/main/src/main/java/com/heyongrui/main/data/dto/WeatherDto.java b/main/src/main/java/com/heyongrui/main/data/dto/WeatherDto.java new file mode 100644 index 0000000..cb7dafe --- /dev/null +++ b/main/src/main/java/com/heyongrui/main/data/dto/WeatherDto.java @@ -0,0 +1,473 @@ +package com.heyongrui.main.data.dto; + +import java.util.List; + +public class WeatherDto { + /** + * airCondition : 优 + * airQuality : {"aqi":31,"city":"珠海","district":"珠海","fetureData":[{"aqi":50,"date":"2019-09-12","quality":"优"},{"aqi":49,"date":"2019-09-13","quality":"优"},{"aqi":49,"date":"2019-09-14","quality":"优"},{"aqi":51,"date":"2019-09-15","quality":"良"},{"aqi":49,"date":"2019-09-16","quality":"优"},{"aqi":52,"date":"2019-09-17","quality":"良"}],"hourData":[{"aqi":31,"dateTime":"2019-09-11 15:00:00"},{"aqi":30,"dateTime":"2019-09-11 14:00:00"},{"aqi":27,"dateTime":"2019-09-11 13:00:00"},{"aqi":22,"dateTime":"2019-09-11 12:00:00"},{"aqi":18,"dateTime":"2019-09-11 11:00:00"},{"aqi":16,"dateTime":"2019-09-11 10:00:00"},{"aqi":15,"dateTime":"2019-09-11 09:00:00"},{"aqi":15,"dateTime":"2019-09-11 08:00:00"},{"aqi":15,"dateTime":"2019-09-11 07:00:00"},{"aqi":14,"dateTime":"2019-09-11 06:00:00"},{"aqi":14,"dateTime":"2019-09-11 05:00:00"},{"aqi":17,"dateTime":"2019-09-11 04:00:00"},{"aqi":17,"dateTime":"2019-09-11 03:00:00"},{"aqi":17,"dateTime":"2019-09-11 02:00:00"},{"aqi":19,"dateTime":"2019-09-11 01:00:00"},{"aqi":21,"dateTime":"2019-09-11 00:00:00"},{"aqi":18,"dateTime":"2019-09-10 23:00:00"},{"aqi":17,"dateTime":"2019-09-10 22:00:00"},{"aqi":17,"dateTime":"2019-09-10 21:00:00"},{"aqi":17,"dateTime":"2019-09-10 20:00:00"},{"aqi":19,"dateTime":"2019-09-10 19:00:00"},{"aqi":20,"dateTime":"2019-09-10 18:00:00"},{"aqi":24,"dateTime":"2019-09-10 17:00:00"}],"no2":8,"pm10":20,"pm25":13,"province":"广东","quality":"优","so2":2,"updateTime":"2019-09-11 15:00:00"} + * city : 珠海 + * coldIndex : + * date : 2019-09-11 + * distrct : 珠海 + * dressingIndex : + * exerciseIndex : + * future : [{"date":"2019-09-11","dayTime":"少云","night":"雷雨","temperature":"30°C / 27°C","week":"今天","wind":"东风 3级"},{"date":"2019-09-12","dayTime":"局部多云","night":"零散雷雨","temperature":"31°C / 28°C","week":"星期四","wind":"东北偏东风 2级"},{"date":"2019-09-13","dayTime":"零散雷雨","night":"雷雨","temperature":"31°C / 27°C","week":"星期五","wind":"东风 2级"},{"date":"2019-09-14","dayTime":"局部雷雨","night":"雷雨","temperature":"31°C / 27°C","week":"星期六","wind":"东北偏东风 2级"},{"date":"2019-09-15","dayTime":"零散雷雨","night":"零散雷雨","temperature":"30°C / 27°C","week":"星期日","wind":"东风 2级"},{"date":"2019-09-16","dayTime":"零散雷雨","night":"零散雷雨","temperature":"30°C / 27°C","week":"星期一","wind":"东北偏东风 2级"},{"date":"2019-09-17","dayTime":"局部多云","night":"零散雷雨","temperature":"31°C / 27°C","week":"星期二","wind":"东北风 3级"},{"date":"2019-09-18","dayTime":"零散雷雨","night":"雷雨","temperature":"30°C / 27°C","week":"星期三","wind":"东北风 3级"},{"date":"2019-09-19","dayTime":"雷雨","night":"雷雨","temperature":"29°C / 26°C","week":"星期四","wind":"东北偏东风 3级"}] + * humidity : 湿度:67% + * pollutionIndex : 31 + * province : 广东 + * sunrise : 06:11 + * sunset : 18:33 + * temperature : 31℃ + * time : 15:53 + * updateTime : 20190911161345 + * washIndex : + * weather : 多云 + * week : 周三 + * wind : 东南风2级 + */ + + private String airCondition; + private AirQualityBean airQuality; + private String city; + private String coldIndex; + private String date; + private String distrct; + private String dressingIndex; + private String exerciseIndex; + private String humidity; + private String pollutionIndex; + private String province; + private String sunrise; + private String sunset; + private String temperature; + private String time; + private String updateTime; + private String washIndex; + private String weather; + private String week; + private String wind; + private List future; + + public String getAirCondition() { + return airCondition; + } + + public void setAirCondition(String airCondition) { + this.airCondition = airCondition; + } + + public AirQualityBean getAirQuality() { + return airQuality; + } + + public void setAirQuality(AirQualityBean airQuality) { + this.airQuality = airQuality; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getColdIndex() { + return coldIndex; + } + + public void setColdIndex(String coldIndex) { + this.coldIndex = coldIndex; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public String getDistrct() { + return distrct; + } + + public void setDistrct(String distrct) { + this.distrct = distrct; + } + + public String getDressingIndex() { + return dressingIndex; + } + + public void setDressingIndex(String dressingIndex) { + this.dressingIndex = dressingIndex; + } + + public String getExerciseIndex() { + return exerciseIndex; + } + + public void setExerciseIndex(String exerciseIndex) { + this.exerciseIndex = exerciseIndex; + } + + public String getHumidity() { + return humidity; + } + + public void setHumidity(String humidity) { + this.humidity = humidity; + } + + public String getPollutionIndex() { + return pollutionIndex; + } + + public void setPollutionIndex(String pollutionIndex) { + this.pollutionIndex = pollutionIndex; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getSunrise() { + return sunrise; + } + + public void setSunrise(String sunrise) { + this.sunrise = sunrise; + } + + public String getSunset() { + return sunset; + } + + public void setSunset(String sunset) { + this.sunset = sunset; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public String getWashIndex() { + return washIndex; + } + + public void setWashIndex(String washIndex) { + this.washIndex = washIndex; + } + + public String getWeather() { + return weather; + } + + public void setWeather(String weather) { + this.weather = weather; + } + + public String getWeek() { + return week; + } + + public void setWeek(String week) { + this.week = week; + } + + public String getWind() { + return wind; + } + + public void setWind(String wind) { + this.wind = wind; + } + + public List getFuture() { + return future; + } + + public void setFuture(List future) { + this.future = future; + } + + public static class AirQualityBean { + /** + * aqi : 31 + * city : 珠海 + * district : 珠海 + * fetureData : [{"aqi":50,"date":"2019-09-12","quality":"优"},{"aqi":49,"date":"2019-09-13","quality":"优"},{"aqi":49,"date":"2019-09-14","quality":"优"},{"aqi":51,"date":"2019-09-15","quality":"良"},{"aqi":49,"date":"2019-09-16","quality":"优"},{"aqi":52,"date":"2019-09-17","quality":"良"}] + * hourData : [{"aqi":31,"dateTime":"2019-09-11 15:00:00"},{"aqi":30,"dateTime":"2019-09-11 14:00:00"},{"aqi":27,"dateTime":"2019-09-11 13:00:00"},{"aqi":22,"dateTime":"2019-09-11 12:00:00"},{"aqi":18,"dateTime":"2019-09-11 11:00:00"},{"aqi":16,"dateTime":"2019-09-11 10:00:00"},{"aqi":15,"dateTime":"2019-09-11 09:00:00"},{"aqi":15,"dateTime":"2019-09-11 08:00:00"},{"aqi":15,"dateTime":"2019-09-11 07:00:00"},{"aqi":14,"dateTime":"2019-09-11 06:00:00"},{"aqi":14,"dateTime":"2019-09-11 05:00:00"},{"aqi":17,"dateTime":"2019-09-11 04:00:00"},{"aqi":17,"dateTime":"2019-09-11 03:00:00"},{"aqi":17,"dateTime":"2019-09-11 02:00:00"},{"aqi":19,"dateTime":"2019-09-11 01:00:00"},{"aqi":21,"dateTime":"2019-09-11 00:00:00"},{"aqi":18,"dateTime":"2019-09-10 23:00:00"},{"aqi":17,"dateTime":"2019-09-10 22:00:00"},{"aqi":17,"dateTime":"2019-09-10 21:00:00"},{"aqi":17,"dateTime":"2019-09-10 20:00:00"},{"aqi":19,"dateTime":"2019-09-10 19:00:00"},{"aqi":20,"dateTime":"2019-09-10 18:00:00"},{"aqi":24,"dateTime":"2019-09-10 17:00:00"}] + * no2 : 8 + * pm10 : 20 + * pm25 : 13 + * province : 广东 + * quality : 优 + * so2 : 2 + * updateTime : 2019-09-11 15:00:00 + */ + + private int aqi; + private String city; + private String district; + private int no2; + private int pm10; + private int pm25; + private String province; + private String quality; + private int so2; + private String updateTime; + private List fetureData; + private List hourData; + + public int getAqi() { + return aqi; + } + + public void setAqi(int aqi) { + this.aqi = aqi; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getDistrict() { + return district; + } + + public void setDistrict(String district) { + this.district = district; + } + + public int getNo2() { + return no2; + } + + public void setNo2(int no2) { + this.no2 = no2; + } + + public int getPm10() { + return pm10; + } + + public void setPm10(int pm10) { + this.pm10 = pm10; + } + + public int getPm25() { + return pm25; + } + + public void setPm25(int pm25) { + this.pm25 = pm25; + } + + public String getProvince() { + return province; + } + + public void setProvince(String province) { + this.province = province; + } + + public String getQuality() { + return quality; + } + + public void setQuality(String quality) { + this.quality = quality; + } + + public int getSo2() { + return so2; + } + + public void setSo2(int so2) { + this.so2 = so2; + } + + public String getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(String updateTime) { + this.updateTime = updateTime; + } + + public List getFetureData() { + return fetureData; + } + + public void setFetureData(List fetureData) { + this.fetureData = fetureData; + } + + public List getHourData() { + return hourData; + } + + public void setHourData(List hourData) { + this.hourData = hourData; + } + + public static class FetureDataBean { + /** + * aqi : 50 + * date : 2019-09-12 + * quality : 优 + */ + + private int aqi; + private String date; + private String quality; + + public int getAqi() { + return aqi; + } + + public void setAqi(int aqi) { + this.aqi = aqi; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public String getQuality() { + return quality; + } + + public void setQuality(String quality) { + this.quality = quality; + } + } + + public static class HourDataBean { + /** + * aqi : 31 + * dateTime : 2019-09-11 15:00:00 + */ + + private int aqi; + private String dateTime; + + public int getAqi() { + return aqi; + } + + public void setAqi(int aqi) { + this.aqi = aqi; + } + + public String getDateTime() { + return dateTime; + } + + public void setDateTime(String dateTime) { + this.dateTime = dateTime; + } + } + } + + public static class FutureBean { + /** + * date : 2019-09-11 + * dayTime : 少云 + * night : 雷雨 + * temperature : 30°C / 27°C + * week : 今天 + * wind : 东风 3级 + */ + + private String date; + private String dayTime; + private String night; + private String temperature; + private String week; + private String wind; + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public String getDayTime() { + return dayTime; + } + + public void setDayTime(String dayTime) { + this.dayTime = dayTime; + } + + public String getNight() { + return night; + } + + public void setNight(String night) { + this.night = night; + } + + public String getTemperature() { + return temperature; + } + + public void setTemperature(String temperature) { + this.temperature = temperature; + } + + public String getWeek() { + return week; + } + + public void setWeek(String week) { + this.week = week; + } + + public String getWind() { + return wind; + } + + public void setWind(String wind) { + this.wind = wind; + } + } +} diff --git a/main/src/main/java/com/heyongrui/main/data/service/MobService.java b/main/src/main/java/com/heyongrui/main/data/service/MobService.java new file mode 100644 index 0000000..c20f688 --- /dev/null +++ b/main/src/main/java/com/heyongrui/main/data/service/MobService.java @@ -0,0 +1,93 @@ +package com.heyongrui.main.data.service; + +import android.util.Base64; + +import com.heyongrui.main.data.api.MobApi; +import com.heyongrui.main.data.dto.DictionaryDto; +import com.heyongrui.main.data.dto.FlightDto; +import com.heyongrui.main.data.dto.IDCardDto; +import com.heyongrui.main.data.dto.IdiomDto; +import com.heyongrui.main.data.dto.MobResponse; +import com.heyongrui.main.data.dto.WeatherDto; +import com.heyongrui.network.configure.RxHelper; +import com.heyongrui.network.service.ApiService; + +import java.io.UnsupportedEncodingException; +import java.util.List; + +import io.reactivex.Observable; + +public class MobService { + + /** + * 分词解析 + */ + public Observable>> participleParse(String originStr) { + String base64Str; + try { + byte[] contentByte = originStr.getBytes("UTF-8"); + base64Str = Base64.encodeToString(contentByte, Base64.DEFAULT); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + base64Str = ""; + } + return ApiService.createApi(MobApi.class, "http://apicloud.mob.com/") + .participleParse("moba6b6c6d6", "43275ff45b034bffaf6b9941a216fe6dbae31dc9", "common", base64Str) + .compose(RxHelper.rxSchedulerHelper()); + } + + /** + * 成语查询 + */ + public Observable> idiomQuery(String idiomStr) { + return ApiService.createApi(MobApi.class, "http://apicloud.mob.com/") + .idiomQuery("moba6b6c6d6", "43275ff45b034bffaf6b9941a216fe6dbae31dc9", idiomStr) + .compose(RxHelper.rxSchedulerHelper()); + } + + /** + * 新华字典查询 + */ + public Observable> dictionaryQuery(String word) { + return ApiService.createApi(MobApi.class, "http://apicloud.mob.com/") + .dictionaryQuery("moba6b6c6d6", "43275ff45b034bffaf6b9941a216fe6dbae31dc9", word) + .compose(RxHelper.rxSchedulerHelper()); + } + + /** + * 身份证信息查询 + */ + public Observable> idCardQuery(String word) { + return ApiService.createApi(MobApi.class, "http://apicloud.mob.com/") + .idCardQuery("moba6b6c6d6", "43275ff45b034bffaf6b9941a216fe6dbae31dc9", word) + .compose(RxHelper.rxSchedulerHelper()); + } + + /** + * 根据起落城市名或者机场代码查询航班信息(start=北京/BJS) + */ + public Observable>> flightQuery(String start, String end) { + return ApiService.createApi(MobApi.class, "http://apicloud.mob.com/") + .flightQuery("moba6b6c6d6", "43275ff45b034bffaf6b9941a216fe6dbae31dc9", start, end) + .compose(RxHelper.rxSchedulerHelper()); + } + + /** + * 根据航班号查询航班信息(name=CZ9902) + */ + public Observable>> flightNoQuery(String flightNo) { + return ApiService.createApi(MobApi.class, "http://apicloud.mob.com/") + .flightNoQuery("moba6b6c6d6", "43275ff45b034bffaf6b9941a216fe6dbae31dc9", flightNo) + .compose(RxHelper.rxSchedulerHelper()); + } + + /** + * 根据ip地址查询天气 + */ + public Observable>> weatherQueryByIp(String ip) { + return ApiService.createApi(MobApi.class, "http://apicloud.mob.com/") + .weatherQueryByIp("moba6b6c6d6", "43275ff45b034bffaf6b9941a216fe6dbae31dc9", ip) + .compose(RxHelper.rxSchedulerHelper()); + } + +} diff --git a/main/src/main/java/com/heyongrui/main/mob/contract/MobContract.java b/main/src/main/java/com/heyongrui/main/mob/contract/MobContract.java new file mode 100644 index 0000000..719575d --- /dev/null +++ b/main/src/main/java/com/heyongrui/main/mob/contract/MobContract.java @@ -0,0 +1,47 @@ +package com.heyongrui.main.mob.contract; + +import androidx.recyclerview.widget.RecyclerView; + +import com.chad.library.adapter.base.BaseQuickAdapter; +import com.heyongrui.base.base.BasePresenter; +import com.heyongrui.base.base.BaseView; +import com.heyongrui.main.adapter.HomeSectionAdapter; +import com.heyongrui.main.data.dto.DictionaryDto; +import com.heyongrui.main.data.dto.FlightDto; +import com.heyongrui.main.data.dto.IDCardDto; +import com.heyongrui.main.data.dto.IdiomDto; + +import java.util.List; + +public interface MobContract { + + interface View extends BaseView { + void flightInfoQuerySuccess(List flightDtoList); + + void idCardQuerySuccess(IDCardDto idCardDto); + + void dictionaryQuerySuccess(DictionaryDto dictionaryDto); + + void idiomQuerySuccess(IdiomDto idiomDto); + + void participleParseSuccess(List stringList); + } + + abstract class Presenter extends BasePresenter { + + public abstract void setBorderBg(android.view.View... views); + + public abstract HomeSectionAdapter initRecyclerView(RecyclerView recyclerView, BaseQuickAdapter.OnItemClickListener listener); + + public abstract void flightInfoQuery(String start, String end, String flightNo); + + public abstract void idCardQuery(String word); + + public abstract void dictionaryQuery(String word); + + public abstract void idiomQuery(String idiomStr); + + public abstract void participleParse(String originStr); + + } +} diff --git a/main/src/main/java/com/heyongrui/main/mob/presenter/MobPresenter.java b/main/src/main/java/com/heyongrui/main/mob/presenter/MobPresenter.java new file mode 100644 index 0000000..f2bbf4b --- /dev/null +++ b/main/src/main/java/com/heyongrui/main/mob/presenter/MobPresenter.java @@ -0,0 +1,227 @@ +package com.heyongrui.main.mob.presenter; + +import android.graphics.drawable.ShapeDrawable; +import android.text.TextUtils; +import android.view.View; + +import androidx.core.content.ContextCompat; +import androidx.core.view.ViewCompat; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; + +import com.blankj.utilcode.util.ToastUtils; +import com.chad.library.adapter.base.BaseQuickAdapter; +import com.heyongrui.base.app.BaseApplication; +import com.heyongrui.base.utils.DrawableUtil; +import com.heyongrui.main.R; +import com.heyongrui.main.adapter.HomeSectionAdapter; +import com.heyongrui.main.adapter.HomeSectionEntity; +import com.heyongrui.main.dagger.DaggerHomeComponent; +import com.heyongrui.main.dagger.HomeModule; +import com.heyongrui.main.data.dto.DictionaryDto; +import com.heyongrui.main.data.dto.FlightDto; +import com.heyongrui.main.data.dto.IDCardDto; +import com.heyongrui.main.data.dto.IdiomDto; +import com.heyongrui.main.data.dto.MobResponse; +import com.heyongrui.main.data.service.MobService; +import com.heyongrui.main.mob.contract.MobContract; +import com.heyongrui.network.configure.ResponseDisposable; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +public class MobPresenter extends MobContract.Presenter { + + @Inject + MobService mMobService; + + public MobPresenter() { + DaggerHomeComponent.builder() + .appComponent(BaseApplication.getAppComponent()) + .homeModule(new HomeModule()) + .build().inject(this); + } + + + @Override + public void setBorderBg(View... views) { + for (View view : views) { + ShapeDrawable borderEnableBg = new DrawableUtil.DrawableBuilder(mContext).setRingOutRadius(10) + .setRingInnerRadius(8).setRingSpaceOutAndInner(2) + .setColor(ContextCompat.getColor(mContext, R.color.colorPrimaryDark)).createRingDrawable(); + ViewCompat.setBackground(view, borderEnableBg); + } + } + + @Override + public HomeSectionAdapter initRecyclerView(RecyclerView recyclerView, BaseQuickAdapter.OnItemClickListener listener) { + List data = new ArrayList<>(); + HomeSectionAdapter moduleSectionAdapter = new HomeSectionAdapter(data); + recyclerView.setLayoutManager(new LinearLayoutManager(mContext)); + moduleSectionAdapter.bindToRecyclerView(recyclerView); +// int dp10 = ConvertUtils.dp2px(10); +// recyclerView.addItemDecoration(new RecycleViewItemDecoration(mContext)); +// moduleSectionAdapter.setSpanSizeLookup((gridLayoutManager, position) -> data.get(position).getSpanSize()); + if (null != listener) { + moduleSectionAdapter.setOnItemClickListener(listener); + } + return moduleSectionAdapter; + } + + @Override + public void flightInfoQuery(String start, String end, String flightNo) { + if (TextUtils.isEmpty(flightNo)) {//如果航班号为空,执行根据起落城市名或者机场代码查询航班信息 + mRxManager.add(mMobService.flightQuery(start, end) + .subscribeWith(new ResponseDisposable>>(mContext, true) { + @Override + protected void onSuccess(MobResponse> mobResponse) { + if (null != mView) { + List flightDtoList = null; + if (null != mobResponse) { + if (mobResponse.getRetCode() == 200) { + flightDtoList = mobResponse.getResult(); + } else { + ToastUtils.showShort(mobResponse.getMsg()); + } + } + mView.flightInfoQuerySuccess(flightDtoList); + } + } + + @Override + protected void onFailure(int errorCode, String errorMsg) { + ToastUtils.showShort(errorMsg); + } + })); + } else {//如果航班号不为空,执行根据航班号查询航班信息 + mRxManager.add(mMobService.flightNoQuery(flightNo) + .subscribeWith(new ResponseDisposable>>(mContext, true) { + @Override + protected void onSuccess(MobResponse> mobResponse) { + if (null != mView) { + List flightDtoList = null; + if (null != mobResponse) { + if (mobResponse.getRetCode() == 200) { + flightDtoList = mobResponse.getResult(); + } else { + ToastUtils.showShort(mobResponse.getMsg()); + } + } + mView.flightInfoQuerySuccess(flightDtoList); + } + } + + @Override + protected void onFailure(int errorCode, String errorMsg) { + ToastUtils.showShort(errorMsg); + } + })); + } + } + + @Override + public void idCardQuery(String word) { + mRxManager.add(mMobService.idCardQuery(word) + .subscribeWith(new ResponseDisposable>(mContext, true) { + @Override + protected void onSuccess(MobResponse idCardDtoMobResponse) { + if (null != mView) { + IDCardDto idCardDto = null; + if (null != idCardDtoMobResponse) { + if (idCardDtoMobResponse.getRetCode() == 200) { + idCardDto = idCardDtoMobResponse.getResult(); + } else { + ToastUtils.showShort(idCardDtoMobResponse.getMsg()); + } + } + mView.idCardQuerySuccess(idCardDto); + } + } + + @Override + protected void onFailure(int errorCode, String errorMsg) { + ToastUtils.showShort(errorMsg); + } + })); + } + + @Override + public void dictionaryQuery(String word) { + mRxManager.add(mMobService.dictionaryQuery(word) + .subscribeWith(new ResponseDisposable>(mContext, true) { + @Override + protected void onSuccess(MobResponse dictionaryDtoMobResponse) { + if (null != mView) { + DictionaryDto dictionaryDto = null; + if (null != dictionaryDtoMobResponse) { + if (dictionaryDtoMobResponse.getRetCode() == 200) { + dictionaryDto = dictionaryDtoMobResponse.getResult(); + } else { + ToastUtils.showShort(dictionaryDtoMobResponse.getMsg()); + } + } + mView.dictionaryQuerySuccess(dictionaryDto); + } + } + + @Override + protected void onFailure(int errorCode, String errorMsg) { + ToastUtils.showShort(errorMsg); + } + })); + } + + @Override + public void idiomQuery(String idiomStr) { + mRxManager.add(mMobService.idiomQuery(idiomStr) + .subscribeWith(new ResponseDisposable>(mContext, true) { + @Override + protected void onSuccess(MobResponse idiomDtoMobResponse) { + if (null != mView) { + IdiomDto idiomDto = null; + if (null != idiomDtoMobResponse) { + if (idiomDtoMobResponse.getRetCode() == 200) { + idiomDto = idiomDtoMobResponse.getResult(); + } else { + ToastUtils.showShort(idiomDtoMobResponse.getMsg()); + } + } + mView.idiomQuerySuccess(idiomDto); + } + } + + @Override + protected void onFailure(int errorCode, String errorMsg) { + ToastUtils.showShort(errorMsg); + } + })); + } + + @Override + public void participleParse(String originStr) { + mRxManager.add(mMobService.participleParse(originStr) + .subscribeWith(new ResponseDisposable>>(mContext, true) { + @Override + protected void onSuccess(MobResponse> listMobResponse) { + if (null != mView) { + List stringList = null; + if (null != listMobResponse) { + if (listMobResponse.getRetCode() == 200) { + stringList = listMobResponse.getResult(); + } else { + ToastUtils.showShort(listMobResponse.getMsg()); + } + } + mView.participleParseSuccess(stringList); + } + } + + @Override + protected void onFailure(int errorCode, String errorMsg) { + ToastUtils.showShort(errorMsg); + } + })); + } +} diff --git a/main/src/main/java/com/heyongrui/main/mob/view/BezierEvaluator.java b/main/src/main/java/com/heyongrui/main/mob/view/BezierEvaluator.java new file mode 100644 index 0000000..cad9b07 --- /dev/null +++ b/main/src/main/java/com/heyongrui/main/mob/view/BezierEvaluator.java @@ -0,0 +1,50 @@ +package com.heyongrui.main.mob.view; + +import android.animation.TypeEvaluator; +import android.graphics.PointF; + +public class BezierEvaluator implements TypeEvaluator { + + //贝塞尔的两个控制点 + private PointF controlF1; + private PointF controlF2; + + public BezierEvaluator(PointF controlF1, PointF controlF2) { + this.controlF1 = controlF1; + this.controlF2 = controlF2; + } + + public BezierEvaluator(PointF controlF1) { + this.controlF1 = controlF1; + } + + @Override + public PointF evaluate(float time, PointF startValue, PointF endValue) { + float currentX, currentY; + if (controlF2 == null) { + //二阶贝塞尔曲线方程(一个控制点) + currentX = arithmeticProduct(1 - time, 2) * startValue.x + + 2 * time * (1 - time) * controlF1.x + + arithmeticProduct(time, 2) * endValue.x; + currentY = arithmeticProduct(1 - time, 2) * startValue.y + + 2 * time * (1 - time) * controlF1.y + + arithmeticProduct(time, 2) * endValue.y; + } else {//三阶贝塞尔曲线方程(两个控制点) + currentX = arithmeticProduct(1 - time, 3) * (startValue.x) + + 3 * arithmeticProduct(1 - time, 2) * time * (controlF1.x) + + 3 * (1 - time) * arithmeticProduct(time, 2) * (controlF2.x) + + arithmeticProduct(time, 3) * (endValue.x); + currentY = arithmeticProduct(1 - time, 3) * (startValue.y) + + 3 * arithmeticProduct(1 - time, 2) * time * (controlF1.y) + + 3 * (1 - time) * arithmeticProduct(time, 2) * (controlF2.y) + + arithmeticProduct(time, 3) * (endValue.y); + } + PointF currentP = new PointF(currentX, currentY); + return currentP; + } + + private float arithmeticProduct(float value, float square) {//返回浮点数的开方值 + double pow = Math.pow(value, square); + return (float) pow; + } +} \ No newline at end of file diff --git a/main/src/main/java/com/heyongrui/main/mob/view/MobActivity.java b/main/src/main/java/com/heyongrui/main/mob/view/MobActivity.java new file mode 100644 index 0000000..e953ba7 --- /dev/null +++ b/main/src/main/java/com/heyongrui/main/mob/view/MobActivity.java @@ -0,0 +1,264 @@ +package com.heyongrui.main.mob.view; + +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.text.SpannableStringBuilder; +import android.text.TextUtils; +import android.text.method.ScrollingMovementMethod; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.core.content.ContextCompat; +import androidx.recyclerview.widget.RecyclerView; + +import com.alibaba.android.arouter.facade.annotation.Autowired; +import com.alibaba.android.arouter.facade.annotation.Route; +import com.blankj.utilcode.util.ClickUtils; +import com.blankj.utilcode.util.SpanUtils; +import com.chad.library.adapter.base.BaseQuickAdapter; +import com.heyongrui.base.assist.ConfigConstants; +import com.heyongrui.base.base.BaseActivity; +import com.heyongrui.base.utils.DrawableUtil; +import com.heyongrui.main.R; +import com.heyongrui.main.adapter.HomeSectionAdapter; +import com.heyongrui.main.adapter.HomeSectionEntity; +import com.heyongrui.main.data.dto.DictionaryDto; +import com.heyongrui.main.data.dto.FlightDto; +import com.heyongrui.main.data.dto.IDCardDto; +import com.heyongrui.main.data.dto.IdiomDto; +import com.heyongrui.main.mob.contract.MobContract; +import com.heyongrui.main.mob.presenter.MobPresenter; + +import java.util.ArrayList; +import java.util.List; + +@Route(path = ConfigConstants.PATH_MOB) +public class MobActivity extends BaseActivity implements MobContract.View + , BaseQuickAdapter.OnItemClickListener, View.OnClickListener { + + private TextView tvTitle; + private EditText etStart; + private ImageView ivSwitch; + private EditText etEnd; + private EditText etInput; + private TextView tvContent; + private RecyclerView rlvMob; + + @Autowired(name = "mobType") + int mMobType; + + private HomeSectionAdapter mMobAdapter; + + @Override + protected int getLayoutId() { + return R.layout.activity_mob; + } + + @Override + public void onClick(View view) { + int id = view.getId(); + if (id == R.id.iv_back) { + finish(); + } else if (id == R.id.iv_switch) { + String startStr = etStart.getText().toString(); + String endStr = etEnd.getText().toString(); + etStart.setText(endStr); + etEnd.setText(startStr); + } else if (id == R.id.btn_query) { + query(); + } + } + + @Override + protected MobContract.Presenter setPresenter() { + return new MobPresenter(); + } + + @Override + protected void init(Bundle savedInstanceState) { + //初始化View + ImageView ivBack = findViewById(R.id.iv_back); + tvTitle = findViewById(R.id.tv_title); + etStart = findViewById(R.id.et_start); + ivSwitch = findViewById(R.id.iv_switch); + etEnd = findViewById(R.id.et_end); + etInput = findViewById(R.id.et_input); + Button btnQuery = findViewById(R.id.btn_query); + ClickUtils.applyScale(btnQuery); + tvContent = findViewById(R.id.tv_content); + tvContent.setMovementMethod(ScrollingMovementMethod.getInstance()); + rlvMob = findViewById(R.id.rlv_mob); + + //图标着色 + Drawable drawable = DrawableUtil.tintDrawable(this, + R.drawable.ic_back, ContextCompat.getColor(this, R.color.background)); + ivBack.setImageDrawable(drawable); + + ivSwitch.setImageDrawable(DrawableUtil.tintDrawable(ivSwitch.getDrawable(), + ContextCompat.getColor(this, R.color.colorPrimaryDark))); + + mPresenter.setBorderBg(etStart, etEnd, etInput); + + //设置点击监听器 + addOnClickListeners(this, ivBack, ivSwitch, btnQuery); + + initViewStatus(); + + //初始化适配器 + mMobAdapter = mPresenter.initRecyclerView(rlvMob, this); + } + + private void initViewStatus() { + //初始化标题 + String titleStr = "", startTip = "", endTip = "", inputTip = ""; + if (mMobType == 1) {//分词解析 + titleStr = getString(R.string.participle_parse); + inputTip = getString(R.string.participle_parse_input_tip); + etStart.setVisibility(View.GONE); + ivSwitch.setVisibility(View.GONE); + etEnd.setVisibility(View.GONE); + etInput.setVisibility(View.VISIBLE); + tvContent.setVisibility(View.VISIBLE); + rlvMob.setVisibility(View.GONE); + } else if (mMobType == 2) {//航班查询 + titleStr = getString(R.string.flight_query); + startTip = getString(R.string.flight_start_input_tip); + endTip = getString(R.string.flight_end_input_tip); + inputTip = getString(R.string.flight_number_input_tip); + etStart.setVisibility(View.VISIBLE); + ivSwitch.setVisibility(View.VISIBLE); + etEnd.setVisibility(View.VISIBLE); + etInput.setVisibility(View.VISIBLE); + tvContent.setVisibility(View.GONE); + rlvMob.setVisibility(View.VISIBLE); + } else if (mMobType == 3) {//身份证查询 + titleStr = getString(R.string.id_card_query); + inputTip = getString(R.string.id_card_input_tip); + etStart.setVisibility(View.GONE); + ivSwitch.setVisibility(View.GONE); + etEnd.setVisibility(View.GONE); + etInput.setVisibility(View.VISIBLE); + tvContent.setVisibility(View.VISIBLE); + rlvMob.setVisibility(View.GONE); + } else if (mMobType == 5) {//新华字典查询 + titleStr = getString(R.string.dictionary_query); + inputTip = getString(R.string.dictionary_input_tip); + etStart.setVisibility(View.GONE); + ivSwitch.setVisibility(View.GONE); + etEnd.setVisibility(View.GONE); + etInput.setVisibility(View.VISIBLE); + tvContent.setVisibility(View.VISIBLE); + rlvMob.setVisibility(View.GONE); + } else if (mMobType == 6) {//成语查询 + titleStr = getString(R.string.idiom_query); + inputTip = getString(R.string.idiom_input_tip); + etStart.setVisibility(View.GONE); + ivSwitch.setVisibility(View.GONE); + etEnd.setVisibility(View.GONE); + etInput.setVisibility(View.VISIBLE); + tvContent.setVisibility(View.VISIBLE); + rlvMob.setVisibility(View.GONE); + } + tvTitle.setText(TextUtils.isEmpty(titleStr) ? "" : titleStr); + etStart.setHint(startTip); + etEnd.setHint(endTip); + etInput.setHint(inputTip); + } + + private void query() { + tvContent.setText(""); + mMobAdapter.replaceData(new ArrayList<>()); + if (null == mPresenter) return; + if (mMobType == 1) {//分词解析 + String originStr = etInput.getText().toString(); + mPresenter.participleParse(originStr); + } else if (mMobType == 2) {//航班查询 + String flightStart = etStart.getText().toString(); + String flightEnd = etEnd.getText().toString(); + String flightNumber = etInput.getText().toString(); + mPresenter.flightInfoQuery(flightStart, flightEnd, flightNumber); + } else if (mMobType == 3) {//身份证查询 + String idCardStr = etInput.getText().toString(); + mPresenter.idCardQuery(idCardStr); + } else if (mMobType == 5) {//新华字典查询 + String word = etInput.getText().toString(); + mPresenter.dictionaryQuery(word); + } else if (mMobType == 6) {//成语查询 + String idiom = etInput.getText().toString(); + mPresenter.idiomQuery(idiom); + } + } + + @Override + public void onItemClick(BaseQuickAdapter adapter, View view, int position) { + } + + @Override + public void flightInfoQuerySuccess(List flightDtoList) { + List newDataList = new ArrayList<>(); + if (null != flightDtoList) { + for (FlightDto flightDto : flightDtoList) { + newDataList.add(new HomeSectionEntity(HomeSectionEntity.FLIGHT, flightDto)); + } + } + mMobAdapter.replaceData(newDataList); + } + + @Override + public void idCardQuerySuccess(IDCardDto idCardDto) { + SpanUtils spanUtils = new SpanUtils(); + if (null != idCardDto) { + spanUtils.append(getString(R.string.idcard_address, idCardDto.getArea() + "\n\n")); + spanUtils.append(getString(R.string.idcard_birthday, idCardDto.getBirthday() + "\n\n")); + spanUtils.append(getString(R.string.idcard_sex, idCardDto.getSex())); + } + SpannableStringBuilder spannableStringBuilder = spanUtils.create(); + tvContent.setText(TextUtils.isEmpty(spannableStringBuilder) ? "" : spannableStringBuilder); + } + + @Override + public void dictionaryQuerySuccess(DictionaryDto dictionaryDto) { + SpanUtils spanUtils = new SpanUtils(); + if (null != dictionaryDto) { + spanUtils.append(getString(R.string.dictionary_word, dictionaryDto.getName() + "\n\n")); + spanUtils.append(getString(R.string.dictionary_wubi, dictionaryDto.getWubi() + "\n\n")); + spanUtils.append(getString(R.string.dictionary_bushou, dictionaryDto.getBushou() + "\n\n")); + spanUtils.append(getString(R.string.dictionary_bihua_without_bushou, dictionaryDto.getBihuaWithBushou() + "\n\n")); + spanUtils.append(getString(R.string.pinyin, dictionaryDto.getPinyin() + "\n\n")); + spanUtils.append(getString(R.string.dictionary_desc, dictionaryDto.getBrief() + "\n\n")); + spanUtils.append(getString(R.string.dictionary_detail, dictionaryDto.getDetail())); + } + SpannableStringBuilder spannableStringBuilder = spanUtils.create(); + tvContent.setText(TextUtils.isEmpty(spannableStringBuilder) ? "" : spannableStringBuilder); + } + + @Override + public void idiomQuerySuccess(IdiomDto idiomDto) { + SpanUtils spanUtils = new SpanUtils(); + if (null != idiomDto) { + spanUtils.append(getString(R.string.idiom_name, idiomDto.getName() + "\n\n")); + spanUtils.append(getString(R.string.pinyin, idiomDto.getPinyin() + "\n\n")); + spanUtils.append(getString(R.string.idiom_pretation, idiomDto.getPretation() + "\n\n")); + spanUtils.append(getString(R.string.idiom_from, idiomDto.getSource() + "\n\n")); + spanUtils.append(getString(R.string.idiom_sample, idiomDto.getSample() + "\n\n")); + spanUtils.append(getString(R.string.idiom_sample_from, idiomDto.getSampleFrom())); + } + SpannableStringBuilder spannableStringBuilder = spanUtils.create(); + tvContent.setText(TextUtils.isEmpty(spannableStringBuilder) ? "" : spannableStringBuilder); + } + + @Override + public void participleParseSuccess(List stringList) { + SpanUtils spanUtils = new SpanUtils(); + if (null != stringList) { + for (String participle : stringList) { + spanUtils.append(participle + "\t\t"); + } + } + SpannableStringBuilder spannableStringBuilder = spanUtils.create(); + tvContent.setText(TextUtils.isEmpty(spannableStringBuilder) ? "" : spannableStringBuilder); + } +} diff --git a/main/src/main/java/com/heyongrui/main/mob/view/MobWeatherActivity.java b/main/src/main/java/com/heyongrui/main/mob/view/MobWeatherActivity.java new file mode 100644 index 0000000..28ae78f --- /dev/null +++ b/main/src/main/java/com/heyongrui/main/mob/view/MobWeatherActivity.java @@ -0,0 +1,135 @@ +package com.heyongrui.main.mob.view; + +import android.animation.ValueAnimator; +import android.graphics.PointF; +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.core.content.ContextCompat; + +import com.alibaba.android.arouter.facade.annotation.Route; +import com.blankj.utilcode.util.ScreenUtils; +import com.gyf.immersionbar.BarHide; +import com.gyf.immersionbar.ImmersionBar; +import com.heyongrui.base.assist.ConfigConstants; +import com.heyongrui.base.base.BaseActivity; +import com.heyongrui.base.utils.DrawableUtil; +import com.heyongrui.main.R; + +@Route(path = ConfigConstants.PATH_WEATHER) +public class MobWeatherActivity extends BaseActivity implements View.OnClickListener { + + private ImageView ivSun; + private ImageView ivMask; + + @Override + protected void initImmersionBar() { + ImmersionBar.with(this).fullScreen(true).hideBar(BarHide.FLAG_SHOW_BAR).init(); + } + + @Override + protected int getLayoutId() { + return R.layout.activity_mob_weather; + } + + @Override + public void onClick(View view) { + int id = view.getId(); + if (id == R.id.iv_back) { + finish(); + } + } + + @Override + protected void init(Bundle savedInstanceState) { + //初始化View + ImageView ivBack = findViewById(R.id.iv_back); + ivSun = findViewById(R.id.iv_sun); + ivMask = findViewById(R.id.iv_mask); + ivMask.getBackground().mutate().setAlpha(0); + + int statusBarHeight = ImmersionBar.getStatusBarHeight(this); + ViewGroup.LayoutParams layoutParams = ivBack.getLayoutParams(); + if (layoutParams instanceof ConstraintLayout.MarginLayoutParams) { + ((ViewGroup.MarginLayoutParams) layoutParams).topMargin = statusBarHeight; + ivBack.setLayoutParams(layoutParams); + } + + //图标着色 + Drawable drawable = DrawableUtil.tintDrawable(this, + R.drawable.ic_back, ContextCompat.getColor(this, R.color.background)); + ivBack.setImageDrawable(drawable); + + //设置点击监听器 + addOnClickListeners(this, ivBack); + } + + private void playSunAnim(float stopPercent) { + float startX = 0; + float startY = ivSun.getY(); + + float endX = ScreenUtils.getScreenWidth(); + float endY = startY; + + float controlY = 0; + float controlX = ScreenUtils.getScreenWidth() / 2; + //贝塞尔二阶曲线控制点 + PointF controlP = new PointF(controlX, controlY); + //构造贝塞尔估值器 + BezierEvaluator evaluator = new BezierEvaluator(controlP); + //贝塞尔动画 + ValueAnimator animator = ValueAnimator.ofObject(evaluator, new PointF(startX, startY), new PointF(endX, endY)); +// animator.setInterpolator(new AnticipateInterpolator()); + animator.addUpdateListener(valueAnimator -> { + PointF pointF = (PointF) valueAnimator.getAnimatedValue(); + //设置目标位置 + if (ivSun.getVisibility() != View.VISIBLE) { + ivSun.setVisibility(View.VISIBLE); + } + ivSun.setX(pointF.x); + ivSun.setY(pointF.y); + //设置透明度 + float percent = valueAnimator.getAnimatedFraction();//动画进度百分比 + //需要在哪里停止动画 + if (percent > (stopPercent - 0.1) && percent < (stopPercent + 0.1)) { + animator.cancel(); + } + ivMask.getBackground().mutate().setAlpha((int) (255 * percent)); + if (percent <= 0.5f) {//代表早晨到中午时间段,太阳慢慢升起,渐显渐大 + if (ivSun.getDrawable().getCurrent().getConstantState() != getResources().getDrawable(R.drawable.ic_sun).getConstantState()) { + ivSun.setImageResource(R.drawable.ic_sun); + } + float alpha = (float) (percent / 0.5); + alpha = alpha <= 0.3 ? (float) 0.3 : alpha; + ivSun.setAlpha(alpha); + ivSun.setScaleX((float) (0.3 + alpha)); + ivSun.setScaleY((float) (0.3 + alpha)); + } else if (percent <= 0.7f) {//代表中午到下午时间段,太阳慢慢降落,渐隐渐小 + if (ivSun.getDrawable().getCurrent().getConstantState() != getResources().getDrawable(R.drawable.ic_sun).getConstantState()) { + ivSun.setImageResource(R.drawable.ic_sun); + } + float alpha = (float) (1 - ((percent - 0.5) / 0.2)); + alpha = alpha <= 0.3 ? (float) 0.3 : alpha; + ivSun.setAlpha(alpha); + ivSun.setScaleX((float) (0.3 + alpha)); + ivSun.setScaleY((float) (0.3 + alpha)); + } else {//代表下午到晚上时间段,太阳消失,月亮慢慢出现,渐显渐大 + if (ivSun.getDrawable().getCurrent().getConstantState() != getResources().getDrawable(R.drawable.ic_moon).getConstantState()) { + ivSun.setImageResource(R.drawable.ic_moon); + } + float alpha = (float) ((percent - 0.7) / 0.3); + alpha = alpha <= 0.3 ? (float) 0.3 : alpha; + ivSun.setAlpha(alpha); + ivSun.setScaleX((float) (0.3 + alpha)); + ivSun.setScaleY((float) (0.3 + alpha)); + } + }); + animator.setTarget(ivSun); + animator.setDuration(4000); + animator.start(); + } +} diff --git a/main/src/main/res/drawable-xhdpi/bg_weather_one.jpg b/main/src/main/res/drawable-xhdpi/bg_weather_one.jpg new file mode 100644 index 0000000..2efd231 Binary files /dev/null and b/main/src/main/res/drawable-xhdpi/bg_weather_one.jpg differ diff --git a/main/src/main/res/drawable-xhdpi/bg_weather_three.jpg b/main/src/main/res/drawable-xhdpi/bg_weather_three.jpg new file mode 100644 index 0000000..b32f2e9 Binary files /dev/null and b/main/src/main/res/drawable-xhdpi/bg_weather_three.jpg differ diff --git a/main/src/main/res/drawable-xhdpi/bg_weather_two.jpg b/main/src/main/res/drawable-xhdpi/bg_weather_two.jpg new file mode 100644 index 0000000..987b333 Binary files /dev/null and b/main/src/main/res/drawable-xhdpi/bg_weather_two.jpg differ diff --git a/main/src/main/res/drawable-xhdpi/ic_moon.png b/main/src/main/res/drawable-xhdpi/ic_moon.png new file mode 100644 index 0000000..02d3f84 Binary files /dev/null and b/main/src/main/res/drawable-xhdpi/ic_moon.png differ diff --git a/main/src/main/res/drawable-xhdpi/ic_sun.png b/main/src/main/res/drawable-xhdpi/ic_sun.png new file mode 100644 index 0000000..1132e06 Binary files /dev/null and b/main/src/main/res/drawable-xhdpi/ic_sun.png differ diff --git a/main/src/main/res/drawable-xhdpi/ic_switch.png b/main/src/main/res/drawable-xhdpi/ic_switch.png new file mode 100644 index 0000000..1ef5fe6 Binary files /dev/null and b/main/src/main/res/drawable-xhdpi/ic_switch.png differ diff --git a/main/src/main/res/layout/activity_mob.xml b/main/src/main/res/layout/activity_mob.xml new file mode 100644 index 0000000..329ef8c --- /dev/null +++ b/main/src/main/res/layout/activity_mob.xml @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + +