点击右侧文字传送:基于 Android Studio 实现的简易 音乐播放器App_android studio音乐播放器-CSDN博客
这段代码是一个启动页 `StartActivity` 的实现,具体功能和流程如下:
1. **布局与初始化**: - `StartActivity` 继承自 `AppCompatActivity`,在 `onCreate` 方法中设置了布局文件 `activity_start`,并进行了界面的初始化操作。
2. **延迟跳转**: - 使用 `Handler` 的 `postDelayed` 方法,在启动后延迟3秒执行 `runnable` 对象中的 `toMainActive()` 方法。
3. **计时器功能**: - `TimeCount` 类继承自 `CountDownTimer`,在 `onFinish()` 方法中移除了 `Handler` 中的 `runnable`,确保在4秒钟后确保跳转逻辑生效。
4. **跳转到登录页面**: - `toMainActive()` 方法启动 `LoginActivity` 并且在跳转完成后结束当前 `StartActivity`。
5. **界面元素**: - 代码中还包括了 `ImageView` 和 `Button` 元素,尽管它们在代码中没有具体的操作,它们可以在布局文件中进一步定义。
这段代码的主要功能是实现一个启动页,在应用启动后延迟3秒后自动跳转到登录页面,并且在启动过程中显示倒计时效果。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f9d7e7"
tools:context=".Start.StartActivity">
<ImageView
android:id="@+id/imageView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/logo" />
</androidx.constraintlayout.widget.ConstraintLayout>
这段代码实现了一个简单的用户登录功能的 `LoginActivity`。以下是代码的主要功能和流程总结:
1. **布局与初始化**: - `LoginActivity` 继承自 `AppCompatActivity`,在 `onCreate` 方法中设置了布局文件 `activity_login`,并初始化了界面上的 `TextView`、`EditText` 和 `Button` 控件以及一个 `DatabaseHelper` 对象用于数据库操作。
2. **注册跳转**: - `loginRegister` 是一个 `TextView` 控件,点击它可以跳转到注册页面 `RegisterActivity`,通过监听器实现了这一功能。
3. **登录逻辑**: - `mLoginButton` 是一个 `Button` 控件,点击它触发登录操作。 - 获取用户输入的用户名和密码,进行非空验证。 - 调用 `mDatabaseHelper` 的 `checkUser` 方法验证用户名和密码是否匹配数据库中的记录。 - 如果验证通过,显示登录成功的 Toast 提示,并跳转到主页面 `MainActivity`。 - 如果验证失败,显示账号或密码错误的 Toast 提示。
4. **Toast 提示**: - 使用 `Toast.makeText()` 方法显示短暂的提示信息,提示用户输入账号或密码,或者登录成功或失败的信息。
5. **数据库操作**: - `DatabaseHelper` 类的 `checkUser` 方法用于查询数据库,验证用户输入的账号和密码是否匹配数据库中的记录。
6. **界面元素与交互**: - 通过监听器实现了注册页面跳转和登录按钮的点击事件处理,确保用户可以通过界面完成登录操作并获取相应的反馈。
总体而言,这段代码实现了基本的用户登录功能,包括输入验证、数据库查询、界面跳转和提示信息的显示,是一个典型的 Android 应用程序中常见的登录功能实现。
package com.example.music.Login;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.music.MainActivity;
import com.example.music.R;
import com.example.music.Register.RegisterActivity;
import com.example.music.Data.DatabaseHelper;
public class LoginActivity extends AppCompatActivity {
private TextView loginRegister;
private EditText user;
private EditText pass;
private Button mLoginButton;
private DatabaseHelper mDatabaseHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
user = findViewById(R.id.user);
pass = findViewById(R.id.pass);
mLoginButton = findViewById(R.id.login_button);
loginRegister = findViewById(R.id.login_register);
mDatabaseHelper = new DatabaseHelper(this);
loginRegister.setOnClickListener(v -> {
Intent intent = new Intent(LoginActivity.this, RegisterActivity.class);
startActivity(intent);
});
mLoginButton.setOnClickListener(v -> {
String username = user.getText().toString().trim();
String password = pass.getText().toString().trim();
if (username.isEmpty() || password.isEmpty()) {
Toast.makeText(getApplicationContext(), "请输入账号或密码", Toast.LENGTH_SHORT).show();
return;
}
boolean result = mDatabaseHelper.checkUser(username, password);
if (result) {
Toast.makeText(getApplicationContext(), "登陆成功", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
} else {
Toast.makeText(getApplicationContext(), "账号或密码错误", Toast.LENGTH_SHORT).show();
}
});
}
}
这段代码实现了用户注册功能的 `RegisterActivity`。以下是代码的主要功能和流程总结:
1. **布局与初始化**: - `RegisterActivity` 继承自 `AppCompatActivity`,在 `onCreate` 方法中设置了布局文件 `activity_register`,并初始化了界面上的 `EditText` 和 `Button` 控件以及一个 `DatabaseHelper` 对象用于数据库操作。
2. **注册逻辑**: - `registerButton` 是一个 `Button` 控件,点击它触发注册操作。 - 获取用户输入的用户名和密码,进行非空验证。 - 调用 `mDatabaseHelper` 的 `insertData` 方法将用户名和密码插入到数据库中。 - 如果注册成功,显示注册成功的 Toast 提示,并跳转到登录页面 `LoginActivity`。 - 如果注册失败,显示注册失败的 Toast 提示。
3. **Toast 提示**: - 使用 `Toast.makeText()` 方法显示短暂的提示信息,提示用户输入账号或密码,或者注册成功或失败的信息。
4. **数据库操作**: - `DatabaseHelper` 类的 `insertData` 方法用于向数据库中插入新的用户名和密码记录。
5. **界面元素与交互**: - 通过监听器实现了注册按钮的点击事件处理,确保用户可以通过界面完成注册操作并获取相应的反馈。
总体而言,这段代码实现了基本的用户注册功能,包括输入验证、数据库插入操作、界面跳转和提示信息的显示,是一个典型的 Android 应用程序中常见的注册功能实现。
package com.example.music.Register;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.example.music.Login.LoginActivity;
import com.example.music.R;
import com.example.music.Data.DatabaseHelper;
public class RegisterActivity extends AppCompatActivity {
private EditText mUserNameEditText;
private EditText mPasswordEditText;
private Button registerButton;
private DatabaseHelper mDatabaseHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
mUserNameEditText = findViewById(R.id.username_edittext);
mPasswordEditText = findViewById(R.id.password_edittext);
registerButton = findViewById(R.id.register_button);
mDatabaseHelper = new DatabaseHelper(this);
registerButton.setOnClickListener(v -> {
String username = mUserNameEditText.getText().toString().trim();
String password = mPasswordEditText.getText().toString().trim();
if (username.isEmpty() || password.isEmpty()) {
Toast.makeText(getApplicationContext(), "请输入账号或密码", Toast.LENGTH_SHORT).show();
return;
}
boolean result = mDatabaseHelper.insertData(username, password);
if (result) {
Toast.makeText(getApplicationContext(), "注册成功", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
startActivity(intent);
finish();
} else {
Toast.makeText(getApplicationContext(), "注册失败", Toast.LENGTH_SHORT).show();
}
});
}
}
这段代码实现了一个简单的 `MainActivity`,用于显示应用的主界面,并加载默认的音乐列表页面 `SongPage`。
以下是代码的主要功能和流程总结:
1. **布局与初始化**: - `MainActivity` 继承自 `AppCompatActivity`,在 `onCreate` 方法中通过 `setContentView()` 方法设置布局文件 `activity_main`。
2. **Fragment 管理**: - 使用 `FragmentManager` 和 `FragmentTransaction` 进行 Fragment 的管理和事务操作。 - 获取 `FragmentManager` 实例 `fm`,并开始一个新的事务 `ft`。 - 使用 `ft.replace()` 方法将 `R.id.content` 容器中的内容替换为新的 `SongPage` Fragment 实例。 - 最后调用 `ft.commit()` 提交事务,完成 Fragment 的显示和替换操作。
3. **默认显示页面**: - 通过 `ft.replace()` 将 `SongPage` Fragment 设置为默认显示的页面,即应用启动后默认展示音乐列表界面。
4. **Fragment 的实现**: - 假设 `SongPage` 是一个继承自 `Fragment` 的类,负责显示音乐列表和相关操作。
5. **注意事项**: - 代码中没有涉及其他交互逻辑或后续页面的处理,仅仅展示了如何通过 Fragment 在 `MainActivity` 中管理和显示内容。
总体而言,这段代码实现了一个简单的主界面管理,使用了 Fragment 技术来管理不同的界面内容,这是在 Android 应用开发中常见的做法,能够帮助实现界面的模块化和复用。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f9d7e7"
tools:context=".MainActivity">
<FrameLayout
android:id="@+id/content"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginTop="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.466"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView2"
app:layout_constraintVertical_bias="1.0">
</FrameLayout>
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="歌曲列表"
android:textColor="#454545"
android:textSize="24sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
这段代码实现了一个音乐播放器的功能,以下是主要功能和流程的总结:
1. **界面布局与初始化**: - `MusicActivity` 继承自 `AppCompatActivity`,在 `onCreate` 方法中设置了布局文件 `activity_music`,并隐藏了标题栏。 - 初始化了界面上的各种控件,包括 `TextView`、`SeekBar`、`ImageView` 等,用于显示歌曲信息、控制播放、暂停、切换歌曲等操作。
2. **音乐播放控制**: - 使用 `MusicService` 类进行音乐播放的控制,通过 `bindService()` 方法绑定服务,并通过 `MyServiceConn` 类实现服务连接。 - 实现了播放、暂停、继续播放、上一首、下一首等按钮的点击事件处理,根据点击事件调用 `musicControl` 的相应方法实现音乐播放控制。 - 使用 `ObjectAnimator` 实现了音乐图标的旋转效果,并在播放、暂停时控制动画的启动和暂停。
3. **进度条与播放时间显示**: - 使用 `SeekBar` 显示音乐播放进度,并通过 `Handler` 更新播放进度和歌曲总时长的显示。 - 当用户拖动进度条时,根据用户选择的进度调整音乐播放的位置。
4. **按钮点击事件处理**: - 播放按钮 (`btn_play`) 开始播放音乐,并开始旋转动画。 - 暂停按钮 (`btn_pause`) 暂停音乐播放,并暂停旋转动画。 - 继续播放按钮 (`btn_continue_play`) 继续音乐播放,并恢复旋转动画。 - 上一首 (`btn_pre`) 和下一首 (`btn_next`) 按钮实现切换歌曲功能,根据当前歌曲的下标切换到上一首或下一首歌曲。 - 退出按钮 (`btn_exit`) 解绑服务并关闭当前界面。
5. **服务生命周期管理**: - 在 `onDestroy` 方法中确保解绑了音乐播放服务,防止内存泄漏和资源浪费。
6. **额外说明**: - 代码中使用了 `Handler` 处理从音乐播放服务返回的消息,更新界面上的播放进度和歌曲总时长显示。 - 使用了 `ObjectAnimator` 实现了音乐图标的旋转动画效果,增强了用户体验。
总体而言,这段代码实现了一个简单的音乐播放器界面,通过服务绑定和控件监听实现了基本的音乐播放、暂停、切换和进度控制功能。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#f9d7e7"
android:orientation="vertical"
tools:context=".Music.MusicActivity">
<ImageView
android:id="@+id/btn_exit"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginStart="16dp"
android:layout_marginTop="24dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/back" />
<TextView
android:id="@+id/song_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="光年之外"
android:textColor="#000"
android:textSize="24sp"
app:layout_constraintBottom_toBottomOf="@+id/btn_exit"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/btn_exit" />
<ImageView
android:id="@+id/iv_music"
android:layout_width="250dp"
android:layout_height="250dp"
android:layout_marginTop="80dp"
android:src="@drawable/img_01"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/btn_exit" />
<SeekBar
android:id="@+id/sb"
android:layout_width="250dp"
android:layout_height="20dp"
android:layout_marginTop="80dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/iv_music" />
<TextView
android:id="@+id/tv_progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="5dp"
android:text="00:00"
app:layout_constraintBottom_toBottomOf="@+id/sb"
app:layout_constraintEnd_toStartOf="@+id/sb"
app:layout_constraintTop_toTopOf="@+id/sb" />
<TextView
android:id="@+id/tv_total"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:text="00:00"
app:layout_constraintBottom_toBottomOf="@+id/sb"
app:layout_constraintStart_toEndOf="@+id/sb"
app:layout_constraintTop_toTopOf="@+id/sb" />
<ImageView
android:id="@+id/btn_continue_play"
android:layout_width="60dp"
android:layout_height="60dp"
android:background="@drawable/play"
app:layout_constraintBottom_toBottomOf="@+id/btn_pre"
app:layout_constraintEnd_toStartOf="@+id/btn_next"
app:layout_constraintStart_toEndOf="@+id/btn_pre"
app:layout_constraintTop_toTopOf="@+id/btn_pre" />
<ImageView
android:id="@+id/btn_pause"
android:layout_width="60dp"
android:layout_height="60dp"
android:background="@drawable/pause"
app:layout_constraintBottom_toBottomOf="@+id/btn_next"
app:layout_constraintEnd_toStartOf="@+id/btn_next"
app:layout_constraintStart_toEndOf="@+id/btn_pre"
app:layout_constraintTop_toTopOf="@+id/btn_next" />
<ImageView
android:id="@+id/btn_pre"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginStart="24dp"
android:background="@drawable/pre"
app:layout_constraintBottom_toBottomOf="@+id/btn_next"
app:layout_constraintStart_toStartOf="@+id/tv_progress"
app:layout_constraintTop_toTopOf="@+id/btn_next" />
<ImageView
android:id="@+id/btn_next"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_marginTop="100dp"
android:layout_marginEnd="24dp"
android:background="@drawable/next"
app:layout_constraintEnd_toEndOf="@+id/tv_total"
app:layout_constraintTop_toBottomOf="@+id/tv_total" />
<ImageView
android:id="@+id/btn_play"
android:layout_width="60dp"
android:layout_height="60dp"
android:background="@drawable/play"
app:layout_constraintBottom_toBottomOf="@+id/btn_pre"
app:layout_constraintEnd_toStartOf="@+id/btn_next"
app:layout_constraintStart_toEndOf="@+id/btn_pre"
app:layout_constraintTop_toTopOf="@+id/btn_pre" />
</androidx.constraintlayout.widget.ConstraintLayout>
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。