diff --git a/.idea/dictionaries/19669.xml b/.idea/dictionaries/19669.xml
new file mode 100644
index 0000000..6dac566
--- /dev/null
+++ b/.idea/dictionaries/19669.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index f128095..9287ed9 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -26,6 +26,9 @@ android {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
+ buildFeatures {
+ viewBinding true
+ }
}
dependencies {
diff --git a/app/src/androidTest/java/com/example/androiddemo/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/androiddemo/ExampleInstrumentedTest.java
deleted file mode 100644
index a8a6d3b..0000000
--- a/app/src/androidTest/java/com/example/androiddemo/ExampleInstrumentedTest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.example.androiddemo;
-
-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.androiddemo", appContext.getPackageName());
- }
-}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 9b75184..cbd2187 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,8 +1,9 @@
+ xmlns:tools="http://schemas.android.com/tools" >
+ tools:targetApi="31" >
+
+ android:exported="true" >
diff --git a/app/src/main/java/com/example/androiddemo/App.java b/app/src/main/java/com/example/androiddemo/App.java
new file mode 100644
index 0000000..2606449
--- /dev/null
+++ b/app/src/main/java/com/example/androiddemo/App.java
@@ -0,0 +1,15 @@
+package com.example.androiddemo;
+
+import android.app.Application;
+
+/**
+ * 启动入口
+ * 不可改写!!!
+ */
+public class App extends Application {
+ public static App instance;
+ public App() {
+ instance = this;
+ Function.init();
+ }
+}
diff --git a/app/src/main/java/com/example/androiddemo/Function.java b/app/src/main/java/com/example/androiddemo/Function.java
new file mode 100644
index 0000000..c4e1d81
--- /dev/null
+++ b/app/src/main/java/com/example/androiddemo/Function.java
@@ -0,0 +1,27 @@
+package com.example.androiddemo;
+
+import com.example.androiddemo.activity.Toast;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 添加功能的地方
+ **/
+public class Function {
+ //功能名称
+ public String name;
+ //界面的指向 类
+ public Class> Class;
+ public static List list = new ArrayList<>();
+ public Function(String name, Class> Class) {
+ this.name = name;
+ this.Class = Class;
+ }
+
+ public static void init() {
+ list.add(new Function("多样化提示", Toast.class));
+ }
+
+
+}
diff --git a/app/src/main/java/com/example/androiddemo/MainActivity.java b/app/src/main/java/com/example/androiddemo/MainActivity.java
index 4bc8698..94f331b 100644
--- a/app/src/main/java/com/example/androiddemo/MainActivity.java
+++ b/app/src/main/java/com/example/androiddemo/MainActivity.java
@@ -1,24 +1,75 @@
package com.example.androiddemo;
+import android.content.Intent;
import android.os.Bundle;
+import android.view.View;
+import android.view.ViewGroup;
import androidx.activity.EdgeToEdge;
+import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import com.example.androiddemo.databinding.ActivityMainBinding;
+import com.example.androiddemo.databinding.ItemMainBinding;
+
+/**
+ * 界面入口
+ * 功能选择入口
+ * 不建议改写,除了UI布局
+ */
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
- setContentView(R.layout.activity_main);
+ ActivityMainBinding binding = ActivityMainBinding.inflate(getLayoutInflater());
+ setContentView(binding.getRoot());
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});
+ setSupportActionBar(binding.toolbar);
+
+ binding.recycler.setLayoutManager(new LinearLayoutManager(this));
+ binding.recycler.setAdapter(new MyAdapter());
+ }
+
+ private class MyAdapter extends RecyclerView.Adapter {
+ @NonNull
+ @Override
+ public VH onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+ return new VH(getLayoutInflater().inflate(R.layout.item_main, parent, false));
+ }
+
+ @Override
+ public void onBindViewHolder(@NonNull VH holder, int position) {
+ holder.binding.button.setText(Function.list.get(position).name);
+ holder.binding.button.setOnClickListener(v -> {
+ Function function = Function.list.get(holder.getAdapterPosition());
+ Intent intent = new Intent(MainActivity.this, function.Class);
+ startActivity(intent);
+ });
+
+ }
+
+ @Override
+ public int getItemCount() {
+ return Function.list.size();
+ }
+ }
+ private static class VH extends RecyclerView.ViewHolder {
+ public ItemMainBinding binding;
+
+ public VH(@NonNull View itemView) {
+ super(itemView);
+ binding = ItemMainBinding.bind(itemView);
+ }
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/example/androiddemo/activity/Toast.java b/app/src/main/java/com/example/androiddemo/activity/Toast.java
new file mode 100644
index 0000000..12405e1
--- /dev/null
+++ b/app/src/main/java/com/example/androiddemo/activity/Toast.java
@@ -0,0 +1,113 @@
+package com.example.androiddemo.activity;
+
+import android.animation.Animator;
+import android.animation.AnimatorSet;
+import android.animation.ObjectAnimator;
+import android.os.Bundle;
+import android.view.Gravity;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.LinearLayout;
+
+import androidx.activity.EdgeToEdge;
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.graphics.Insets;
+import androidx.core.view.ViewCompat;
+import androidx.core.view.WindowInsetsCompat;
+
+import com.example.androiddemo.R;
+import com.example.androiddemo.databinding.ViewToastBinding;
+import com.google.android.material.card.MaterialCardView;
+
+/**
+ * 多样化提示界面
+ */
+public class Toast extends AppCompatActivity {
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ EdgeToEdge.enable(this);
+ setContentView(R.layout.activity_toast);
+ ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
+ Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
+ v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
+ return insets;
+ });
+ View viewById = findViewById(R.id.TopToast);
+ LinearLayout linearLayout = findViewById(R.id.line1);
+
+// 屏幕的宽度/2
+ int width = getResources().getDisplayMetrics().widthPixels / 2;
+ LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(width, ViewGroup.LayoutParams.WRAP_CONTENT);
+ layoutParams.setMargins(0, 50, 0, 50);
+ layoutParams.gravity = Gravity.CENTER_HORIZONTAL;
+ viewById.setOnClickListener(v -> linearLayout.addView(NewToast("测试"), 0, layoutParams));
+
+ }
+
+ private View NewToast(String string) {
+ // 获取当前主题中的样式
+ ViewToastBinding binding = ViewToastBinding.inflate(getLayoutInflater());
+ binding.textView.setText(string);
+ MaterialCardView materialCardView = binding.getRoot();
+
+
+ ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(materialCardView, "scaleY", 0.5f, 1f);
+ scaleYAnimator.setDuration(300); // 动画持续时间1秒
+
+ // 创建透明度渐变动画
+ ObjectAnimator fadeInAnimator = ObjectAnimator.ofFloat(materialCardView, "alpha", 0f, 1f);
+ fadeInAnimator.setDuration(300); // 动画持续时间1秒
+
+ // 同时播放两个动画
+ AnimatorSet set = new AnimatorSet();
+ set.playTogether(scaleYAnimator, fadeInAnimator);
+ set.start();
+
+ // 设置动画结束后的回调
+ set.addListener(new Animator.AnimatorListener() {
+ @Override
+ public void onAnimationStart(@NonNull Animator animation) {}
+
+ @Override
+ public void onAnimationEnd(@NonNull Animator animation) {
+ // 缩小和淡出动画
+ // 创建透明度淡出动画
+ ObjectAnimator fadeOutAnimator = ObjectAnimator.ofFloat(materialCardView, "alpha", 1f, 0f);
+ fadeOutAnimator.setDuration(3000); // 动画持续时间1秒
+ fadeOutAnimator.start();
+ fadeOutAnimator.addListener(new Animator.AnimatorListener() {
+
+ @Override
+ public void onAnimationStart(@NonNull Animator animation) {
+
+ }
+
+ @Override
+ public void onAnimationEnd(@NonNull Animator animation) {
+ ((LinearLayout) findViewById(R.id.line1)).removeView(materialCardView);
+ }
+
+ @Override
+ public void onAnimationCancel(@NonNull Animator animation) {
+
+ }
+
+ @Override
+ public void onAnimationRepeat(@NonNull Animator animation) {
+
+ }
+ });
+ }
+
+ @Override
+ public void onAnimationCancel(@NonNull Animator animation) {}
+
+ @Override
+ public void onAnimationRepeat(@NonNull Animator animation) {}
+ });
+ return materialCardView;
+ }
+}
\ 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
index 86a5d97..93ecbce 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -1,19 +1,26 @@
-
+
-
+
+
-
\ No newline at end of file
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_toast.xml b/app/src/main/res/layout/activity_toast.xml
new file mode 100644
index 0000000..4461032
--- /dev/null
+++ b/app/src/main/res/layout/activity_toast.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_main.xml b/app/src/main/res/layout/item_main.xml
new file mode 100644
index 0000000..364e443
--- /dev/null
+++ b/app/src/main/res/layout/item_main.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/view.xml b/app/src/main/res/layout/view.xml
new file mode 100644
index 0000000..77d9ef6
--- /dev/null
+++ b/app/src/main/res/layout/view.xml
@@ -0,0 +1,6 @@
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/view_toast.xml b/app/src/main/res/layout/view_toast.xml
new file mode 100644
index 0000000..752b2dd
--- /dev/null
+++ b/app/src/main/res/layout/view_toast.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/test/java/com/example/androiddemo/ExampleUnitTest.java b/app/src/test/java/com/example/androiddemo/ExampleUnitTest.java
deleted file mode 100644
index 58927b7..0000000
--- a/app/src/test/java/com/example/androiddemo/ExampleUnitTest.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.example.androiddemo;
-
-import org.junit.Test;
-
-import static org.junit.Assert.*;
-
-/**
- * Example local unit test, which will execute on the development machine (host).
- *
- * @see Testing documentation
- */
-public class ExampleUnitTest {
- @Test
- public void addition_isCorrect() {
- assertEquals(4, 2 + 2);
- }
-}
\ No newline at end of file