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 bfb060a..7c437d5 100644 --- a/base/src/main/java/com/heyongrui/base/assist/ConfigConstants.java +++ b/base/src/main/java/com/heyongrui/base/assist/ConfigConstants.java @@ -23,6 +23,7 @@ public class ConfigConstants { public static final String PATH_PLANET_BALL = "/main/planetBall"; public static final String PATH_HOME_PROVIDER = "/home/main/service"; //user模块路由路径 + public static final String PATH_ENCOURAGE = "/user/encourage"; public static final String PATH_KOTLIN = "/user/kotlin"; public static final String PATH_LOGIN = "/user/login"; public static final String PATH_USER = "/user/activity"; @@ -49,8 +50,6 @@ public class ConfigConstants { public static final String PATH_GANK = "/module2/gank"; public static final String PATH_LEISURE_READ = "/module2/leisureRead"; public static final String PATH_WELFARE = "/module2/welfare"; - public static final String PATH_ABOUT = "/module2/about"; - public static final String PATH_ENCOURAGE = "/module2/encourage"; public static final String PATH_TODAY_HISTORY = "/module2/todayHistory"; //科大讯飞Iflytek模块路径 public static final String PATH_VOICE_DICATION_PROVIDER = "/iflytek/service"; diff --git a/base/src/main/java/com/heyongrui/base/widget/MarqueeTextView.java b/base/src/main/java/com/heyongrui/base/widget/MarqueeTextView.java new file mode 100644 index 0000000..2d1adfd --- /dev/null +++ b/base/src/main/java/com/heyongrui/base/widget/MarqueeTextView.java @@ -0,0 +1,29 @@ +package com.heyongrui.base.widget; + +import android.content.Context; +import android.util.AttributeSet; + +import androidx.appcompat.widget.AppCompatTextView; + +/** + * 自定义跑马灯TextView,不随焦点改变 + */ +public class MarqueeTextView extends AppCompatTextView { + + public MarqueeTextView(Context context) { + this(context, null); + } + + public MarqueeTextView(Context context, AttributeSet attrs) { + this(context, attrs, 0); + } + + public MarqueeTextView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + public boolean isFocused() { + return true; + } +} \ No newline at end of file diff --git a/base/src/main/res/drawable/bg_circle_shadow.xml b/base/src/main/res/drawable/bg_circle_shadow.xml new file mode 100644 index 0000000..3bfda15 --- /dev/null +++ b/base/src/main/res/drawable/bg_circle_shadow.xml @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/main/src/main/java/com/heyongrui/main/HomeFragment.java b/main/src/main/java/com/heyongrui/main/HomeFragment.java index 563193d..e41b99e 100644 --- a/main/src/main/java/com/heyongrui/main/HomeFragment.java +++ b/main/src/main/java/com/heyongrui/main/HomeFragment.java @@ -1,16 +1,32 @@ package com.heyongrui.main; +import android.content.Context; +import android.graphics.Color; +import android.graphics.drawable.Drawable; import android.os.Bundle; +import android.text.TextUtils; +import android.util.TypedValue; +import android.view.Gravity; import android.view.View; -import android.widget.Button; +import android.view.ViewGroup; + +import androidx.annotation.DrawableRes; +import androidx.core.content.ContextCompat; import com.alibaba.android.arouter.launcher.ARouter; +import com.blankj.utilcode.util.ConvertUtils; import com.heyongrui.base.assist.ConfigConstants; import com.heyongrui.base.base.BaseFragment; +import com.heyongrui.base.widget.MarqueeTextView; import com.heyongrui.base.widget.numberruntextview.NumberRunningTextView; +import com.heyongrui.base.widget.planetball.adapter.PlanetAdapter; +import com.heyongrui.base.widget.planetball.view.PlanetBallView; import com.heyongrui.base.widget.tickerview.TickerUtils; import com.heyongrui.base.widget.tickerview.TickerView; +import com.heyongrui.main.data.dto.FloatingDto; +import java.util.ArrayList; +import java.util.List; import java.util.Random; public class HomeFragment extends BaseFragment implements View.OnClickListener { @@ -24,8 +40,8 @@ public class HomeFragment extends BaseFragment implements View.OnClickListener { public static HomeFragment getInstance() { HomeFragment fragment = new HomeFragment(); Bundle bundle = new Bundle(); - bundle.putInt("tabIconId", R.drawable.icon_mono); - bundle.putInt("tabTitleId", R.string.app_name); + bundle.putInt("tabIconId", R.drawable.ic_tool); + bundle.putInt("tabTitleId", R.string.tool); fragment.setArguments(bundle); return fragment; } @@ -38,11 +54,7 @@ protected int getLayoutId() { @Override public void onClick(View v) { int id = v.getId(); - if (id == R.id.btn_motion) { - ARouter.getInstance().build(ConfigConstants.PATH_KOTLIN).navigation(); - } else if (id == R.id.btn_planet_ball) { - ARouter.getInstance().build(ConfigConstants.PATH_PLANET_BALL).navigation(); - } else if (id == R.id.ticker_view) { + if (id == R.id.ticker_view) { if (tickerCount < 5) { tickerView.setCharacterLists(TickerUtils.provideNumberList()); tickerView.setText("¥" + new Random().nextInt(500) + "." + new Random().nextInt(100)); @@ -63,12 +75,12 @@ public void onClick(View v) { @Override protected void initView(Bundle savedInstanceState) { + PlanetBallView planetBall = mView.findViewById(R.id.planet_ball); + initPlanetBallView(planetBall, getFloatListData()); + tickerView = mView.findViewById(R.id.ticker_view); numberRunTv = mView.findViewById(R.id.number_run_tv); - Button btnMotion = mView.findViewById(R.id.btn_motion); - Button btnPlanetBall = mView.findViewById(R.id.btn_planet_ball); - - addOnClickListeners(this, tickerView, numberRunTv, btnMotion, btnPlanetBall); + addOnClickListeners(this, tickerView, numberRunTv); } @Override @@ -76,6 +88,125 @@ protected void initData(Bundle savedInstanceState) { } + private void initPlanetBallView(PlanetBallView planetBallView, List floatingDtoList) { + int dp70 = ConvertUtils.dp2px(70); + planetBallView.setAdapter(new PlanetAdapter() { + @Override + public int getCount() { + if (null == floatingDtoList || floatingDtoList.isEmpty()) { + return 0; + } else { + return floatingDtoList.size(); + } + } + + @Override + public View getView(Context context, int position, ViewGroup parent) { + String name = ""; + int iconRes = R.drawable.ic_launcher; + Object item = getItem(position); + if (null != item && item instanceof FloatingDto) { + name = ((FloatingDto) item).getName(); + iconRes = ((FloatingDto) item).getIcon_res(); + } + MarqueeTextView marqueeTextView = new MarqueeTextView(context); + ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(dp70, dp70); + marqueeTextView.setLayoutParams(layoutParams); + marqueeTextView.setBackgroundResource(R.drawable.bg_circle_shadow); + marqueeTextView.setGravity(Gravity.CENTER); + marqueeTextView.setEllipsize(TextUtils.TruncateAt.MARQUEE); + marqueeTextView.setMarqueeRepeatLimit(-1); + marqueeTextView.setSingleLine(true); + marqueeTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10); + 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()); + marqueeTextView.setCompoundDrawables(null, drawable, null, null); + marqueeTextView.setFocusable(true); + marqueeTextView.post(() -> marqueeTextView.onWindowFocusChanged(true)); + marqueeTextView.setOnClickListener(view -> { + if (null != item && item instanceof FloatingDto) { + int type = ((FloatingDto) item).getType(); + switch (type) { + case 1://分词解析 + break; + case 2://航班查询 + break; + case 3://身份证查询 + break; + case 4://天气预报 + break; + case 5://新华字典查询 + break; + case 6://成语查询 + break; + case 7://动作布局动画 + ARouter.getInstance().build(ConfigConstants.PATH_KOTLIN).navigation(); + break; + case 8://星球 + ARouter.getInstance().build(ConfigConstants.PATH_PLANET_BALL).navigation(); + break; + case 9://垃圾分类 + ARouter.getInstance().build(ConfigConstants.PATH_GARBAGE_CLASSIFY).navigation(); + break; + case 10://智能机器人对话 + ARouter.getInstance().build(ConfigConstants.PATH_SMART_ROBOT).navigation(); + break; + case 11://音乐搜索 + ARouter.getInstance().build(ConfigConstants.PATH_H5).withString("h5Url", "https://ys.juan8014.cn/yin/").navigation(); + break; + } + } + }); + return marqueeTextView; + } + + @Override + public Object getItem(int position) { + if (null == floatingDtoList || floatingDtoList.isEmpty()) { + return null; + } else { + return floatingDtoList.get(position); + } + } + + @Override + public int getPopularity(int position) { + return position % 10; + } + + @Override + public void onThemeColorChanged(View view, int themeColor) { + + } + }); + } + + private List getFloatListData() { + List floatingDtoList = new ArrayList<>(); + floatingDtoList.add(creatFloatingDto(getString(R.string.participle_parse), R.drawable.ic_participle, 1)); + floatingDtoList.add(creatFloatingDto(getString(R.string.flight_query), R.drawable.ic_flight, 2)); + floatingDtoList.add(creatFloatingDto(getString(R.string.id_card_query), R.drawable.ic_id_card, 3)); + floatingDtoList.add(creatFloatingDto(getString(R.string.weather_forecast), R.drawable.ic_weather, 4)); + floatingDtoList.add(creatFloatingDto(getString(R.string.dictionary_query), R.drawable.ic_dictionary, 5)); + floatingDtoList.add(creatFloatingDto(getString(R.string.idiom_query), R.drawable.ic_idiom, 6)); + floatingDtoList.add(creatFloatingDto(getString(R.string.motion_layout_anim), R.drawable.ic_anim, 7)); + floatingDtoList.add(creatFloatingDto(getString(R.string.planet), R.drawable.ic_planet, 8)); + floatingDtoList.add(creatFloatingDto(getString(R.string.garbage_classify_query), R.drawable.ic_ashcan, 9)); + floatingDtoList.add(creatFloatingDto(getString(R.string.artificial_intelligence), R.drawable.ic_robot, 10)); + floatingDtoList.add(creatFloatingDto(getString(R.string.music_search), R.drawable.ic_music_disc, 11)); + return floatingDtoList; + } + + private FloatingDto creatFloatingDto(String name, @DrawableRes int drawableRes, int type) { + FloatingDto floatingDto = new FloatingDto(); + floatingDto.setName(name); + floatingDto.setIcon_res(drawableRes); + floatingDto.setType(type); + return floatingDto; + } + private String generateChars(Random random, String list, int numDigits) { final char[] result = new char[numDigits]; for (int i = 0; i < numDigits; i++) { diff --git a/main/src/main/java/com/heyongrui/main/data/dto/FloatingDto.java b/main/src/main/java/com/heyongrui/main/data/dto/FloatingDto.java new file mode 100644 index 0000000..e1a850f --- /dev/null +++ b/main/src/main/java/com/heyongrui/main/data/dto/FloatingDto.java @@ -0,0 +1,77 @@ +package com.heyongrui.main.data.dto; + +import android.os.Parcel; +import android.os.Parcelable; + +/** + * Created by lambert on 2019/9/11. + */ + +public class FloatingDto implements Parcelable { + private String name; + private int icon_res; + private int type; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getIcon_res() { + return icon_res; + } + + public void setIcon_res(int icon_res) { + this.icon_res = icon_res; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public FloatingDto() { + } + + public FloatingDto(String name, int icon_res, int type) { + this.name = name; + this.icon_res = icon_res; + this.type = type; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(this.name); + dest.writeInt(this.icon_res); + dest.writeInt(this.type); + } + + protected FloatingDto(Parcel in) { + this.name = in.readString(); + this.icon_res = in.readInt(); + this.type = in.readInt(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public FloatingDto createFromParcel(Parcel source) { + return new FloatingDto(source); + } + + @Override + public FloatingDto[] newArray(int size) { + return new FloatingDto[size]; + } + }; +} diff --git a/main/src/main/res/drawable-xhdpi/ic_anim.png b/main/src/main/res/drawable-xhdpi/ic_anim.png new file mode 100644 index 0000000..4161a02 Binary files /dev/null and b/main/src/main/res/drawable-xhdpi/ic_anim.png differ diff --git a/module/src/main/res/drawable-xhdpi/ic_ashcan.png b/main/src/main/res/drawable-xhdpi/ic_ashcan.png similarity index 100% rename from module/src/main/res/drawable-xhdpi/ic_ashcan.png rename to main/src/main/res/drawable-xhdpi/ic_ashcan.png diff --git a/main/src/main/res/drawable-xhdpi/ic_dictionary.png b/main/src/main/res/drawable-xhdpi/ic_dictionary.png new file mode 100644 index 0000000..51cddf8 Binary files /dev/null and b/main/src/main/res/drawable-xhdpi/ic_dictionary.png differ diff --git a/main/src/main/res/drawable-xhdpi/ic_flight.png b/main/src/main/res/drawable-xhdpi/ic_flight.png new file mode 100644 index 0000000..298a43e Binary files /dev/null and b/main/src/main/res/drawable-xhdpi/ic_flight.png differ diff --git a/main/src/main/res/drawable-xhdpi/ic_id_card.png b/main/src/main/res/drawable-xhdpi/ic_id_card.png new file mode 100644 index 0000000..9d637a9 Binary files /dev/null and b/main/src/main/res/drawable-xhdpi/ic_id_card.png differ diff --git a/main/src/main/res/drawable-xhdpi/ic_idiom.png b/main/src/main/res/drawable-xhdpi/ic_idiom.png new file mode 100644 index 0000000..bc78c41 Binary files /dev/null and b/main/src/main/res/drawable-xhdpi/ic_idiom.png differ diff --git a/main/src/main/res/drawable-xhdpi/ic_music_disc.png b/main/src/main/res/drawable-xhdpi/ic_music_disc.png new file mode 100644 index 0000000..05b2858 Binary files /dev/null and b/main/src/main/res/drawable-xhdpi/ic_music_disc.png differ diff --git a/main/src/main/res/drawable-xhdpi/ic_participle.png b/main/src/main/res/drawable-xhdpi/ic_participle.png new file mode 100644 index 0000000..af29cc1 Binary files /dev/null and b/main/src/main/res/drawable-xhdpi/ic_participle.png differ diff --git a/main/src/main/res/drawable-xhdpi/ic_planet.png b/main/src/main/res/drawable-xhdpi/ic_planet.png new file mode 100644 index 0000000..b04194a Binary files /dev/null and b/main/src/main/res/drawable-xhdpi/ic_planet.png differ diff --git a/main/src/main/res/drawable-xhdpi/ic_robot.png b/main/src/main/res/drawable-xhdpi/ic_robot.png new file mode 100644 index 0000000..561f5c8 Binary files /dev/null and b/main/src/main/res/drawable-xhdpi/ic_robot.png differ diff --git a/main/src/main/res/drawable-xhdpi/ic_tool.png b/main/src/main/res/drawable-xhdpi/ic_tool.png new file mode 100644 index 0000000..977c17b Binary files /dev/null and b/main/src/main/res/drawable-xhdpi/ic_tool.png differ diff --git a/main/src/main/res/drawable-xhdpi/ic_weather.png b/main/src/main/res/drawable-xhdpi/ic_weather.png new file mode 100644 index 0000000..be29496 Binary files /dev/null and b/main/src/main/res/drawable-xhdpi/ic_weather.png differ diff --git a/main/src/main/res/layout/fragment_home.xml b/main/src/main/res/layout/fragment_home.xml index 562f7c6..27a7781 100644 --- a/main/src/main/res/layout/fragment_home.xml +++ b/main/src/main/res/layout/fragment_home.xml @@ -12,6 +12,7 @@ android:text="¥69.65" android:textColor="@color/colorPrimaryDark" android:textSize="@dimen/sp_30" + android:visibility="gone" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" @@ -26,45 +27,26 @@ android:text="58" android:textColor="@color/colorPrimaryDark" android:textSize="@dimen/sp_30" + android:visibility="gone" app:duration="1500" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/ticker_view" /> - - -