diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index a33dc8d..f8fe189 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,10 +19,16 @@ android:name=".ui.activity.PlayActivity" android:exported="false" /> + + diff --git a/app/src/main/java/com/hi/music/player/adapter/AHomeViewPagerAdapter.java b/app/src/main/java/com/hi/music/player/adapter/AHomeViewPagerAdapter.java new file mode 100644 index 0000000..545473c --- /dev/null +++ b/app/src/main/java/com/hi/music/player/adapter/AHomeViewPagerAdapter.java @@ -0,0 +1,33 @@ +package com.hi.music.player.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.viewpager2.adapter.FragmentStateAdapter; + +import com.hi.music.player.ui.fragmnt.AHomeFragment; +import com.hi.music.player.ui.fragmnt.AImportFragment; + +import java.util.ArrayList; +import java.util.List; + +public class AHomeViewPagerAdapter extends FragmentStateAdapter { + + private final List fragments = new ArrayList<>(); + public AHomeViewPagerAdapter(@NonNull FragmentActivity fragmentActivity) { + super(fragmentActivity); + fragments.add(new AHomeFragment()); + fragments.add(new AImportFragment()); + } + + @NonNull + @Override + public Fragment createFragment(int position) { + return fragments.get(position); + } + + @Override + public int getItemCount() { + return fragments.size(); + } +} diff --git a/app/src/main/java/com/hi/music/player/helper/CircularProgressBar.java b/app/src/main/java/com/hi/music/player/helper/CircularProgressBar.java new file mode 100644 index 0000000..e824383 --- /dev/null +++ b/app/src/main/java/com/hi/music/player/helper/CircularProgressBar.java @@ -0,0 +1,102 @@ +package com.hi.music.player.helper; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.util.AttributeSet; +import android.view.View; + +public class CircularProgressBar extends View { + private Paint progressPaint; + private Paint backgroundPaint; + private float progress = 0; + private float maxProgress = 100; + + private int fixedSize = 47; // 固定圆环的直径(dp) + private int progressWidth = 5; // 固定进度条宽度(dp) + + public CircularProgressBar(Context context) { + super(context); + init(); + } + + public CircularProgressBar(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + public CircularProgressBar(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(); + } + + private void init() { + // 初始化用于绘制进度条的画笔 + progressPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + progressPaint.setStyle(Paint.Style.STROKE); + progressPaint.setStrokeWidth(dpToPx(progressWidth)); // 设置进度条宽度(10dp) + progressPaint.setColor(Color.WHITE); // 设置进度条颜色为白色 + + // 初始化用于绘制背景环的画笔 + backgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + backgroundPaint.setStyle(Paint.Style.STROKE); + backgroundPaint.setStrokeWidth(dpToPx(progressWidth)); + backgroundPaint.setColor(Color.GRAY); // 设置背景环颜色为灰色 + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + // Convert dp to pixels + int diameterPx = dpToPx(fixedSize); + int size = diameterPx + dpToPx(progressWidth) * 2; + setMeasuredDimension(size, size); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + + // 获取视图中心坐标 + float centerX = getWidth() / 2f; + float centerY = getHeight() / 2f; + + // 固定圆环的半径 + float radius = (Math.min(getWidth(), getHeight()) - dpToPx(progressWidth)) / 2f; + + // 绘制背景环 + canvas.drawCircle(centerX, centerY, radius, backgroundPaint); + + // 计算进度条的起始角度和扫过的角度 + float startAngle = -90f; // 从顶部开始 + float sweepAngle = 360f * progress / maxProgress; // 根据进度计算扫过的角度 + // 绘制进度条 + canvas.drawArc( + centerX - radius, // 左上角 X 坐标 + centerY - radius, // 左上角 Y 坐标 + centerX + radius, // 右下角 X 坐标 + centerY + radius, // 右下角 Y 坐标 + startAngle, // 起始角度 + sweepAngle, // 扫过的角度 + false, // 是否使用扇形 + progressPaint // 使用的画笔 + ); + } + + public void setProgress(float progress) { + this.progress = Math.max(0, Math.min(progress, maxProgress)); // 限制进度值在 0 到 maxProgress 之间 + invalidate(); // 请求重新绘制视图 + } + + public void setMaxProgress(float maxProgress) { + this.maxProgress = maxProgress; + this.progress = Math.max(0, Math.min(this.progress, maxProgress)); // 调整当前进度值以适应新的最大值 + invalidate(); // 请求重新绘制视图 + } + + // 将 dp 转换为 px + private int dpToPx(int dp) { + float density = getResources().getDisplayMetrics().density; + return Math.round(dp * density); // 将 dp 值乘以屏幕密度转换为 px + } +} diff --git a/app/src/main/java/com/hi/music/player/ui/activity/AHomeActivity.java b/app/src/main/java/com/hi/music/player/ui/activity/AHomeActivity.java new file mode 100644 index 0000000..375bedc --- /dev/null +++ b/app/src/main/java/com/hi/music/player/ui/activity/AHomeActivity.java @@ -0,0 +1,99 @@ +package com.hi.music.player.ui.activity; + +import android.os.Bundle; +import android.view.LayoutInflater; + +import com.google.android.material.tabs.TabLayout; +import com.google.android.material.tabs.TabLayoutMediator; +import com.hi.music.player.R; +import com.hi.music.player.adapter.AHomeViewPagerAdapter; +import com.hi.music.player.databinding.ActivityAhomeBinding; +import com.hi.music.player.databinding.HomeTabCustomBinding; + +public class AHomeActivity extends BaseActivity { + + // 图标数组定义为类成员,避免重复 + private final int[] defaultIcons = { + R.drawable.home_unselect, + R.drawable.import_unselect, + }; + + private final int[] selectedIcons = { + R.drawable.home_select, + R.drawable.import_select, + }; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + } + + @Override + protected ActivityAhomeBinding getViewBinding() { + return ActivityAhomeBinding.inflate(getLayoutInflater()); + } + + @Override + protected void onCreateInit() { + + initData(); + + } + + @Override + public boolean isFullScreen() { + return true; + } + + @Override + public boolean statusBarLight() { + return false; + } + + public void initData(){ + + AHomeViewPagerAdapter adapter = new AHomeViewPagerAdapter(this); + vb.homeViewpager.setAdapter(adapter); + + // 设置TabLayout的图标 + new TabLayoutMediator(vb.homeTabLayout, vb.homeViewpager, (tab, position) -> { + HomeTabCustomBinding tabBinding = HomeTabCustomBinding.inflate(LayoutInflater.from(this)); + tab.setCustomView(tabBinding.getRoot()); + tabBinding.homeIcon.setImageResource(defaultIcons[position]); // 默认图标 + }).attach(); + + // 添加Tab选中与未选中事件监听器 + vb.homeTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { + @Override + public void onTabSelected(TabLayout.Tab tab) { + updateTabIcon(tab, true); // 更新选中的图标 + } + + @Override + public void onTabUnselected(TabLayout.Tab tab) { + updateTabIcon(tab, false); // 恢复未选中图标 + } + + @Override + public void onTabReselected(TabLayout.Tab tab) { + // 可选:重复选择Tab时的操作 + } + }); + + // 设置默认选中第一个 + TabLayout.Tab firstTab = vb.homeTabLayout.getTabAt(0); + if (firstTab != null) { + firstTab.select(); + updateTabIcon(firstTab, true); // 设置选中的图标 + } + } + + private void updateTabIcon(TabLayout.Tab tab, boolean isSelected) { + HomeTabCustomBinding tabBinding = HomeTabCustomBinding.bind(tab.getCustomView()); + int position = tab.getPosition(); + tabBinding.homeIcon.setImageResource(isSelected ? selectedIcons[position] : defaultIcons[position]); + } + + } + diff --git a/app/src/main/java/com/hi/music/player/ui/activity/AsplashActivity.java b/app/src/main/java/com/hi/music/player/ui/activity/AsplashActivity.java new file mode 100644 index 0000000..0b975e5 --- /dev/null +++ b/app/src/main/java/com/hi/music/player/ui/activity/AsplashActivity.java @@ -0,0 +1,60 @@ +package com.hi.music.player.ui.activity; + +import android.content.Intent; +import android.os.CountDownTimer; + +import com.hi.music.player.databinding.ActivityAsplashBinding; + +public class ASplashActivity extends BaseActivity { + + private static final int SPLASH_TIME_OUT = 1500; + private CountDownTimer countDownTimer; + + @Override + protected ActivityAsplashBinding getViewBinding() { + return ActivityAsplashBinding.inflate(getLayoutInflater()); + } + + @Override + protected void onCreateInit() { + + intData(); + + } + + @Override + public boolean isFullScreen() { + return true; + } + + @Override + public boolean statusBarLight() { + return false; + } + + public void intData(){ + + countDownTimer = new CountDownTimer(SPLASH_TIME_OUT, 100) { + + @Override + public void onTick(long millisUntilFinished) { + + float v = 100 - (float) millisUntilFinished / SPLASH_TIME_OUT * 100; + int v1 = (int) v; + vb.progressBar.setProgress(v1); + + } + + @Override + public void onFinish() { + vb.progressBar.setProgress(100); + Intent intent = new Intent(ASplashActivity.this, AHomeActivity.class); + startActivity(intent); + finish(); + } + }; + + countDownTimer.start(); + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hi/music/player/ui/fragmnt/AHomeFragment.java b/app/src/main/java/com/hi/music/player/ui/fragmnt/AHomeFragment.java new file mode 100644 index 0000000..e0e502a --- /dev/null +++ b/app/src/main/java/com/hi/music/player/ui/fragmnt/AHomeFragment.java @@ -0,0 +1,24 @@ +package com.hi.music.player.ui.fragmnt; + +import android.os.Bundle; + +import androidx.fragment.app.Fragment; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.hi.music.player.R; + + +public class AHomeFragment extends Fragment { + + + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_a_home, container, false); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/hi/music/player/ui/fragmnt/AImportFragment.java b/app/src/main/java/com/hi/music/player/ui/fragmnt/AImportFragment.java new file mode 100644 index 0000000..a89cb02 --- /dev/null +++ b/app/src/main/java/com/hi/music/player/ui/fragmnt/AImportFragment.java @@ -0,0 +1,66 @@ +package com.hi.music.player.ui.fragmnt; + +import android.os.Bundle; + +import androidx.fragment.app.Fragment; + +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.hi.music.player.R; + +/** + * A simple {@link Fragment} subclass. + * Use the {@link AImportFragment#newInstance} factory method to + * create an instance of this fragment. + */ +public class AImportFragment extends Fragment { + + // TODO: Rename parameter arguments, choose names that match + // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER + private static final String ARG_PARAM1 = "param1"; + private static final String ARG_PARAM2 = "param2"; + + // TODO: Rename and change types of parameters + private String mParam1; + private String mParam2; + + public AImportFragment() { + // Required empty public constructor + } + + /** + * Use this factory method to create a new instance of + * this fragment using the provided parameters. + * + * @param param1 Parameter 1. + * @param param2 Parameter 2. + * @return A new instance of fragment AImportFragment. + */ + // TODO: Rename and change types and number of parameters + public static AImportFragment newInstance(String param1, String param2) { + AImportFragment fragment = new AImportFragment(); + Bundle args = new Bundle(); + args.putString(ARG_PARAM1, param1); + args.putString(ARG_PARAM2, param2); + fragment.setArguments(args); + return fragment; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + if (getArguments() != null) { + mParam1 = getArguments().getString(ARG_PARAM1); + mParam2 = getArguments().getString(ARG_PARAM2); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, + Bundle savedInstanceState) { + // Inflate the layout for this fragment + return inflater.inflate(R.layout.fragment_a_import, container, false); + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/a_rounded_rectangle_tab_layout.xml b/app/src/main/res/drawable/a_rounded_rectangle_tab_layout.xml new file mode 100644 index 0000000..dcc6e4f --- /dev/null +++ b/app/src/main/res/drawable/a_rounded_rectangle_tab_layout.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/circular_progress_drawable.xml b/app/src/main/res/drawable/circular_progress_drawable.xml new file mode 100644 index 0000000..7ae0e50 --- /dev/null +++ b/app/src/main/res/drawable/circular_progress_drawable.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/clock.xml b/app/src/main/res/drawable/clock.xml new file mode 100644 index 0000000..324cc10 --- /dev/null +++ b/app/src/main/res/drawable/clock.xml @@ -0,0 +1,33 @@ + + + + + + diff --git a/app/src/main/res/drawable/import_select.xml b/app/src/main/res/drawable/import_select.xml new file mode 100644 index 0000000..b546665 --- /dev/null +++ b/app/src/main/res/drawable/import_select.xml @@ -0,0 +1,15 @@ + + + + diff --git a/app/src/main/res/drawable/import_unselect.xml b/app/src/main/res/drawable/import_unselect.xml new file mode 100644 index 0000000..656e4e1 --- /dev/null +++ b/app/src/main/res/drawable/import_unselect.xml @@ -0,0 +1,15 @@ + + + + diff --git a/app/src/main/res/drawable/pause.xml b/app/src/main/res/drawable/pause.xml new file mode 100644 index 0000000..6ece7e6 --- /dev/null +++ b/app/src/main/res/drawable/pause.xml @@ -0,0 +1,18 @@ + + + + diff --git a/app/src/main/res/drawable/seek_bar_color.xml b/app/src/main/res/drawable/seek_bar_color.xml new file mode 100644 index 0000000..5af9536 --- /dev/null +++ b/app/src/main/res/drawable/seek_bar_color.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_ahome.xml b/app/src/main/res/layout/activity_ahome.xml new file mode 100644 index 0000000..4f9ca99 --- /dev/null +++ b/app/src/main/res/layout/activity_ahome.xml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_asplash.xml b/app/src/main/res/layout/activity_asplash.xml new file mode 100644 index 0000000..8649154 --- /dev/null +++ b/app/src/main/res/layout/activity_asplash.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_a_home.xml b/app/src/main/res/layout/fragment_a_home.xml new file mode 100644 index 0000000..bf668f8 --- /dev/null +++ b/app/src/main/res/layout/fragment_a_home.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_a_import.xml b/app/src/main/res/layout/fragment_a_import.xml new file mode 100644 index 0000000..c6ef680 --- /dev/null +++ b/app/src/main/res/layout/fragment_a_import.xml @@ -0,0 +1,14 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-xxxhdpi/cover.png b/app/src/main/res/mipmap-xxxhdpi/cover.png new file mode 100644 index 0000000..a8fb290 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/cover.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/launch_icon.png b/app/src/main/res/mipmap-xxxhdpi/launch_icon.png new file mode 100644 index 0000000..425ae9e Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/launch_icon.png differ diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 35c0625..453dbaa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -9,4 +9,6 @@ New Releases Musicoo Profile + Listen Music Anytime + Resource Loading... \ No newline at end of file