diff --git a/.gitignore b/.gitignore index a8b0d1d..aa724b7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,35 +1,15 @@ -# ---> Android -# Gradle files -.gradle/ -build/ - -# Local configuration file (sdk path, etc) -local.properties - -# Log/OS Files -*.log - -# Android Studio generated files and folders -captures/ -.externalNativeBuild/ -.cxx/ -*.apk -output.json - -# IntelliJ *.iml -.idea/ -misc.xml -deploymentTargetDropDown.xml -render.experimental.xml - -# Keystore files -*.jks -*.keystore - -# Google Services (e.g. APIs or Firebase) -google-services.json - -# Android Profiling -*.hprof - +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild +.cxx +local.properties diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b589d56 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..b268ef3 --- /dev/null +++ b/.idea/deploymentTargetSelector.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..0897082 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..8978d23 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/app/build.gradle.kts b/app/build.gradle.kts new file mode 100644 index 0000000..951d214 --- /dev/null +++ b/app/build.gradle.kts @@ -0,0 +1,41 @@ +plugins { + alias(libs.plugins.android.application) +} + +android { + namespace = "com.example.musicapp" + compileSdk = 34 + + defaultConfig { + applicationId = "com.example.musicapp" + minSdk = 31 + targetSdk = 34 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro" + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } +} + +dependencies { + + implementation(libs.appcompat) + implementation(libs.material) + testImplementation(libs.junit) + androidTestImplementation(libs.ext.junit) + androidTestImplementation(libs.espresso.core) +} \ No newline at end of file diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/app/src/androidTest/java/com/example/musicapp/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/musicapp/ExampleInstrumentedTest.java new file mode 100644 index 0000000..da4fb09 --- /dev/null +++ b/app/src/androidTest/java/com/example/musicapp/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.example.musicapp; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.example.musicapp", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..d39d973 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/com/example/musicapp/MainActivity.java b/app/src/main/java/com/example/musicapp/MainActivity.java new file mode 100644 index 0000000..5381b1b --- /dev/null +++ b/app/src/main/java/com/example/musicapp/MainActivity.java @@ -0,0 +1,420 @@ +package com.example.musicapp; + +import static java.lang.Math.abs; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.constraintlayout.widget.ConstraintLayout; +import androidx.core.view.GravityCompat; +import androidx.drawerlayout.widget.DrawerLayout; + +import android.annotation.SuppressLint; +import android.app.slice.SliceItem; +import android.content.res.Resources; +import android.media.MediaPlayer; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.util.Log; +import android.view.Gravity; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.view.animation.Animation; +import android.view.animation.AnimationUtils; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.EditText; +import android.widget.FrameLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.ListView; +import android.widget.RelativeLayout; +import android.widget.SeekBar; +import android.widget.TextView; + +import com.google.android.material.navigation.NavigationView; + +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + + +public class MainActivity extends AppCompatActivity { + static int conut; + int Ycha = 155; + int Xcha = 15; + + int local_start; + int local_end; + + static String name="点击了按钮"; + private LinearLayout llLoading; + + Thread thred; + + Button playBtton; + SeekBar start, end; + TextView startText, endText; + MediaPlayer song; + ImageView imageView; + Animation animation; + + ConstraintLayout menu_layout; + RelativeLayout myAbout_Layout; + TextView textView_s; + Button btn_s; + EditText edit_1; + ImageView about_menu; + TextView touch_text; + TextView local; + ConstraintLayout local_layout; + ConstraintLayout mlist_layout; + boolean mlist_layout_show = false; + ListView mlist; + DrawerLayout mainLayout; + TextView song_name; + boolean about_show = false; + + int SongTotalTime; + + @Override + protected void onCreate(Bundle savedInstanceState) { + + requestWindowFeature(Window.FEATURE_NO_TITLE); + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + super.onCreate(savedInstanceState); + + setContentView(R.layout.activity_main); + mainLayout = findViewById(R.id.drawerLayout); + + final View loadingView = View.inflate(this, R.layout.about_layout, null); + final View loadingView1 = View.inflate(this, R.layout.host, null); + final View loadingView2 = View.inflate(this, R.layout.list, null); + final FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); + params.gravity = Gravity.CENTER; + addContentView(loadingView, params);//核心方法 + addContentView(loadingView1, params); + addContentView(loadingView2, params); + + + local_layout = findViewById(R.id.host_layout); + local_layout.setVisibility(View.GONE); + mlist_layout = findViewById(R.id.list_layout); + mlist_layout.setVisibility(View.GONE); + +// final View loadingView1 = View.inflate(this, R.layout.host, null); +// final FrameLayout.LayoutParams params1 = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); +// params1.gravity = Gravity.CENTER; +// addContentView(loadingView1, params1);//核心方法 +// local = findViewById(R.id.hosts); +// local.setVisibility(View.GONE); + + myAbout_Layout = findViewById(R.id.my_about_layout); + myAbout_Layout.setVisibility(View.GONE); +// btn_s = findViewById(R.id.button2); + NavigationView navigationView = findViewById(R.id.navigationView); + View headerView = navigationView.getHeaderView(0); + btn_s = headerView.findViewById(R.id.button2); + about_menu = findViewById(R.id.about_menu); + touch_text = findViewById(R.id.touch); + + + mlist = findViewById(R.id.list); + Resources res = getResources(); + String[] songNames = res.getStringArray(R.array.song_names); + List dataList = new ArrayList<>(Arrays.asList(songNames)); + + ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, dataList); + ListView listView = findViewById(R.id.list); + listView.setAdapter(adapter); + + adapter.notifyDataSetChanged(); + + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + int resourceId = getResources().getIdentifier("song" + (position + 1), "raw", getPackageName()); + playSong(resourceId); + mlist_layout.setVisibility(View.GONE); + mainLayout.setVisibility(View.VISIBLE); + PlayButton(view); + String songName = ((TextView) view).getText().toString(); + song_name.setText(songName); + } + }); + + + about_menu.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (!about_show){ + myAbout_Layout.setVisibility(View.VISIBLE); + about_show = true; + }else { + myAbout_Layout.setVisibility(View.GONE); + about_show = false; + } + + } + }); + + +// btn_s.setVisibility(View.GONE); + textView_s = headerView.findViewById(R.id.textView5); +//// btn_s = findViewById(R.layout.button2); + edit_1 = headerView.findViewById(R.id.editTextText3); + +//// + btn_s.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { +// textView_s.setText( +// MainActivity.name.format("我点击了按钮(%s)", MainActivity.conut) +// ); + btn_s.setText(MainActivity.name.format("点击了按钮(%s)", MainActivity.conut)); + edit_1.setText(MainActivity.name.format("点击了按钮(%s)", MainActivity.conut)); + MainActivity.conut++; + } + }); + + + + final DrawerLayout drawerLayout = findViewById(R.id.drawerLayout); + + findViewById(R.id.imageMenu).setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + if (about_show){ + myAbout_Layout.setVisibility(View.GONE); + about_show = false; + } +// drawerLayout.openDrawer(GravityCompat.START); + if (mlist_layout_show){ + mlist_layout_show = false; + mainLayout.setVisibility(View.VISIBLE); + mlist_layout.setVisibility(View.GONE); + }else { + mlist_layout_show = true; + mainLayout.setVisibility(View.GONE); + mlist_layout.setVisibility(View.VISIBLE); + } + } + }); + + playBtton = findViewById(R.id.play); + startText = findViewById(R.id.TextStart); + endText = findViewById(R.id.TextEnd); + imageView = findViewById(R.id.img); + animation = AnimationUtils.loadAnimation(this, R.anim.rotation); + song_name = findViewById(R.id.TextTitle); + song_name.setText("未选择歌曲"); + } + + @SuppressLint("HandlerLeak") + private Handler handler = new Handler(){ + @SuppressLint("SetText18n") + @Override + public void handleMessage(Message message){ + int SeekBarPosition = message.what; + + start.setProgress(SeekBarPosition); + + String Time = createTimeText(SeekBarPosition); + startText.setText(Time); + + String remainingTime = createTimeText(SongTotalTime - SeekBarPosition); + endText.setText("-" + remainingTime); + } + + + }; + + public String createTimeText(int time){ + String timeText; + int min = time / 1000 /60; + int sec = time / 1000 % 60; + timeText = min + ":"; + if (sec < 10) timeText += "0"; + timeText += sec; + return timeText; + } + + public void PlayButton(View view){ + if (!song.isPlaying()){ + song.start(); + + imageView.startAnimation(animation); + playBtton.setBackgroundResource(R.drawable.baseline_pause_24); + }else { + + song.pause(); + imageView.clearAnimation(); + playBtton.setBackgroundResource(R.drawable.baseline_play_arrow_24); + + } + + + } + + public void showCenterLoading() { + if (myAbout_Layout != null) { + myAbout_Layout.setVisibility(View.VISIBLE); + } + } + + /** + * 隐藏Loading + */ + public void hideCenterLoading() { + if (myAbout_Layout != null) { + myAbout_Layout.setVisibility(View.GONE); + } + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + myAbout_Layout.setVisibility(View.VISIBLE); + return super.onTouchEvent(event); + } + + @Override + public boolean dispatchTouchEvent(MotionEvent event) { + int action = event.getActionMasked(); + float rawX = event.getRawX(); + float rawY = event.getRawY(); + float x = event.getX(); + float y = event.getY(); + touch_text.setText("触摸操作"+ String.format("\n(%s, %s, %s, %s)", (int)rawX, (int)rawY, (int)x, (int)y)); + switch (action) { + case MotionEvent.ACTION_DOWN: + // 用户按下屏幕时的操作 + Log.d("Touch", "Action Down"); + touch_text.setText(touch_text.getText() + "按下"); + local_layout.setX((int)x-Xcha); // 设置X坐标为100 + local_layout.setY((int)y-Ycha); // 设置Y坐标为200 + local_layout.setVisibility(View.VISIBLE); + local_start = (int)x; + break; + case MotionEvent.ACTION_MOVE: + // 用户在屏幕上移动时的操作 + Log.d("Touch", "Action Move"); + touch_text.setText(touch_text.getText() + "移动"); + local_layout.setX((int)x-Xcha); // 设置X坐标为100 + local_layout.setY((int)y-Ycha); // 设置Y坐标为200 + break; + case MotionEvent.ACTION_UP: + // 用户抬起手指时的操作 + Log.d("Touch", "Action Up"); + touch_text.setText(touch_text.getText() + "抬起"); + local_layout.setX((int)x-Xcha); // 设置X坐标为100 + local_layout.setY((int)y-Ycha); // 设置Y坐标为200 + local_layout.setVisibility(View.GONE); + local_end = (int)x; + break; + } + if (local_end-local_start > 500) { + mlist_layout.setVisibility(View.GONE); + mainLayout.setVisibility(View.VISIBLE); + local_start = 0; + local_end = 0; + + } + return super.dispatchTouchEvent(event); + } + /** + * 添加Loading布局 + */ +// private void addLoadingView() { +// if (myAbout_Layout == null) { +// final View loadingView = View.inflate(this, R.layout.layout_global_center_loading, null); +// final FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT); +// params.gravity = Gravity.CENTER; +// addContentView(loadingView, params);//核心方法 +// llLoading = findViewById(R.id.ll_global_center_loading); +// tvLoading = findViewById(R.id.tv_global_center_loading); +// } +// } + private int getResourceIdByName(String resourceName) { + try { + return getResources().getIdentifier(resourceName, "raw", getPackageName()); + } catch (Exception e) { + e.printStackTrace(); + return 0; + } + } + + private void playSong(int resourceId) { + if (song != null) { + song.release(); + } + song = MediaPlayer.create(this, resourceId); + song.setLooping(true); + song.seekTo(0); + song.setVolume(0.5f, 0.5f); + SongTotalTime = song.getDuration(); + + start = findViewById(R.id.PlayLine); + start.setMax(SongTotalTime); + start.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int i, boolean b) { + if (b){ + song.seekTo(i); + start.setProgress(i); + } + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + + } + }); + + end = findViewById(R.id.volume); + end.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int i, boolean b) { + float volume = i /100f; + song.setVolume(volume, volume); + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + + } + }); + + thred = new Thread(new Runnable() { + @Override + public void run() { + while (song != null){ + try { + Message message = new Message(); + message.what = song.getCurrentPosition(); + handler.sendMessage(message); + Thread.sleep(1000); + + }catch (InterruptedException ignored){ + break; + } + } + } + }); + thred.start(); + } + +} \ No newline at end of file diff --git a/app/src/main/res/anim/rotation.xml b/app/src/main/res/anim/rotation.xml new file mode 100644 index 0000000..ac31c55 --- /dev/null +++ b/app/src/main/res/anim/rotation.xml @@ -0,0 +1,14 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/baseline_error_outline_24.xml b/app/src/main/res/drawable/baseline_error_outline_24.xml new file mode 100644 index 0000000..97cb117 --- /dev/null +++ b/app/src/main/res/drawable/baseline_error_outline_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/baseline_favorite_border_24.xml b/app/src/main/res/drawable/baseline_favorite_border_24.xml new file mode 100644 index 0000000..ebef092 --- /dev/null +++ b/app/src/main/res/drawable/baseline_favorite_border_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/baseline_menu_24.xml b/app/src/main/res/drawable/baseline_menu_24.xml new file mode 100644 index 0000000..45ca7a9 --- /dev/null +++ b/app/src/main/res/drawable/baseline_menu_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/baseline_mode_standby_24.xml b/app/src/main/res/drawable/baseline_mode_standby_24.xml new file mode 100644 index 0000000..3224700 --- /dev/null +++ b/app/src/main/res/drawable/baseline_mode_standby_24.xml @@ -0,0 +1,12 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/baseline_pause_24.xml b/app/src/main/res/drawable/baseline_pause_24.xml new file mode 100644 index 0000000..7327f65 --- /dev/null +++ b/app/src/main/res/drawable/baseline_pause_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/baseline_play_arrow_24.xml b/app/src/main/res/drawable/baseline_play_arrow_24.xml new file mode 100644 index 0000000..b8e26d6 --- /dev/null +++ b/app/src/main/res/drawable/baseline_play_arrow_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/baseline_volume_up_24.xml b/app/src/main/res/drawable/baseline_volume_up_24.xml new file mode 100644 index 0000000..1e0f8f4 --- /dev/null +++ b/app/src/main/res/drawable/baseline_volume_up_24.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/local.png b/app/src/main/res/drawable/local.png new file mode 100644 index 0000000..eb4e02d Binary files /dev/null and b/app/src/main/res/drawable/local.png differ diff --git a/app/src/main/res/drawable/music.png b/app/src/main/res/drawable/music.png new file mode 100644 index 0000000..23084e0 Binary files /dev/null and b/app/src/main/res/drawable/music.png differ diff --git a/app/src/main/res/drawable/seekbar_thumb.xml b/app/src/main/res/drawable/seekbar_thumb.xml new file mode 100644 index 0000000..f822172 --- /dev/null +++ b/app/src/main/res/drawable/seekbar_thumb.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/about_layout.xml b/app/src/main/res/layout/about_layout.xml new file mode 100644 index 0000000..c978e56 --- /dev/null +++ b/app/src/main/res/layout/about_layout.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..93b9e02 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,155 @@ + + + + + + + + + + + + + + + + + + + + + + + + +