From a020247a3b9f2f8f81c3875e06d5798f7f70a94a Mon Sep 17 00:00:00 2001 From: muqing <1966944300@qq.com> Date: Sun, 7 Jul 2024 00:04:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=9F=BA=E6=9C=AC=E6=A1=86?= =?UTF-8?q?=E6=9E=B6=E6=8F=90=E4=BE=9B=E4=BA=86=E4=B8=80=E4=B8=AA=E7=AE=80?= =?UTF-8?q?=E5=8D=95=E7=9A=84=E4=BE=8B=E5=AD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/dictionaries/19669.xml | 3 + app/build.gradle | 3 + .../androiddemo/ExampleInstrumentedTest.java | 26 ---- app/src/main/AndroidManifest.xml | 10 +- .../java/com/example/androiddemo/App.java | 15 +++ .../com/example/androiddemo/Function.java | 27 +++++ .../com/example/androiddemo/MainActivity.java | 53 +++++++- .../example/androiddemo/activity/Toast.java | 113 ++++++++++++++++++ app/src/main/res/layout/activity_main.xml | 27 +++-- app/src/main/res/layout/activity_toast.xml | 32 +++++ app/src/main/res/layout/item_main.xml | 16 +++ app/src/main/res/layout/view.xml | 6 + app/src/main/res/layout/view_toast.xml | 18 +++ .../example/androiddemo/ExampleUnitTest.java | 17 --- 14 files changed, 309 insertions(+), 57 deletions(-) create mode 100644 .idea/dictionaries/19669.xml delete mode 100644 app/src/androidTest/java/com/example/androiddemo/ExampleInstrumentedTest.java create mode 100644 app/src/main/java/com/example/androiddemo/App.java create mode 100644 app/src/main/java/com/example/androiddemo/Function.java create mode 100644 app/src/main/java/com/example/androiddemo/activity/Toast.java create mode 100644 app/src/main/res/layout/activity_toast.xml create mode 100644 app/src/main/res/layout/item_main.xml create mode 100644 app/src/main/res/layout/view.xml create mode 100644 app/src/main/res/layout/view_toast.xml delete mode 100644 app/src/test/java/com/example/androiddemo/ExampleUnitTest.java 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 @@ + + + +