Android翻转动画实现教程与实践

打印 上一主题 下一主题

主题 1023|帖子 1023|积分 3069

本文另有配套的佳构资源,点击获取  

  简介:在Android开发中,通过自定义动画实现独特的用户交互和视觉效果是提升应用体验的关键。'android-flip切换界面的翻转动画效果'项目演示了如何在界面间创建翻转动画,实现卡片翻转效果的平滑过渡。文章介绍了补间动画和帧动画的概念,并详细分析了如何使用  RotateAnimation  类来设置翻转角度和中心点,以实现视图的前后翻转。同时,文章也探讨了  ObjectAnimator  的使用以及如何处置惩罚结构和触摸变乱,终极给出源码分析以帮助开发者深入明确Android动画系统。
1. Android动画系统概述

  动画是Android应用中不可或缺的组成部分,它能提升用户体验,使界面更加生动和有趣。一个良好的动画设计不但能够引导用户操纵,还能在视觉上给予用户反馈。在Android平台上,动画系统履历了多个版本的迭代,渐渐演变为一个功能强大、灵活度高的动画框架。
  在本章中,我们将对Android动画系统进行总体的介绍。我们会讨论动画的基本概念,包括动画是如何在屏幕上渲染和播放的。别的,我们还会概述Android动画的种类,以及它们各自的工作方式和应用场景。通过这一章的学习,读者将能够对Android的动画系统有一个全面的明确,为深入学习后续章节的高级动画技能打下坚实的底子。
1.1 动画在Android开发中的重要性

  动画能够给静态的界面元素带来动态的效果,它在引导用户操纵、吸引用户注意力方面起到了关键作用。合理地使用动画可以让应用更加直观,用户体验更加流畅。在Android开发中,动画不但仅是视觉上的装饰,更是界面交互的补充。
1.2 Android动画系统的构成

  Android动画系统大致可以分为两类:传统动画(Property Animation)和视图动画(View Animation)。传统动画从Android 3.0版本开始引入,提供了更加丰富的属性动画支持。视图动画是Android早期版本中已存在的,它主要是对视图进行简单的变更。
  在接下来的章节中,我们将详细探讨这两种动画范例的区别与联系,并深入到详细的动画使用和优化技能中去。
2. 补间动画与帧动画的区别

2.1 动画的基本原理和范例

2.1.1 动画的定义和作用

  动画是一种视觉效果,通过快速一连地体现一系列静态图像,创造出动态的视觉错觉。在Android开发中,动画用于提升用户体验,可以使界面元素动起来,引导用户注意力,大概使应用看起来更加生动和有趣。
2.1.2 补间动画和帧动画的定义

  补间动画(Tween Animation)是通过指定两个关键帧,系统自动盘算出中间帧,从而实现动画效果。补间动画包括平移、旋转、缩放和透明度变化等。
  帧动画(Frame Animation)则是基于一系列预先定义好的图片序列,通过依次体现这些图片来模仿动画效果。每一帧体现一个静态图片,一连播放则产生动画效果。
2.2 补间动画与帧动画的工作机制

2.2.1 补间动画的工作机制

  补间动画通过在两个关键帧之间插入中间帧来实现平滑过渡。在Android中,使用XML文件定义补间动画,可以通过  AnimationUtils  类加载这些动画,并通过  ImageView  或  View  的  startAnimation()  方法应用到详细视图上。
  一个简单的补间动画示比方下:
  1. <!-- res/anim/fade_in.xml -->
  2. <alpha xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:fromAlpha="0.0"
  4.     android:toAlpha="1.0"
  5.     android:duration="300" />
复制代码
在代码中应用:
  1. ImageView imageView = findViewById(R.id.my_image);
  2. Animation fadeInAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_in);
  3. imageView.startAnimation(fadeInAnimation);
复制代码
2.2.2 帧动画的工作机制

  帧动画的工作方式是逐帧体现静态图像,这必要开发者预备一系列的图片文件,然后通过  AnimationDrawable  类来实现。在Android中,通常将这些图片资源存放在drawable文件夹中,并通过XML定义动画序列。
  一个简单的帧动画示比方下:
  1. <!-- res/drawable/frame_animation.xml -->
  2. <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:oneshot="false">
  4.     <item android:drawable="@drawable/image1" android:duration="100" />
  5.     <item android:drawable="@drawable/image2" android:duration="100" />
  6.     <!-- 其他图片帧... -->
  7. </animation-list>
复制代码
在代码中应用:
  1. ImageView imageView = findViewById(R.id.my_image);
  2. imageView.setBackgroundResource(R.drawable.frame_animation);
  3. AnimationDrawable frameAnimation = (AnimationDrawable) imageView.getBackground();
  4. frameAnimation.start();
复制代码
2.3 补间动画与帧动画的应用场景

2.3.1 补间动画的应用场景

  补间动画非常适合实现视图的位移、旋转、缩放等基本动画效果。因为补间动画使用较少的盘算资源,适合在应用中频繁使用,以提升用户体验而不对性能造成影响。
2.3.2 帧动画的应用场景

  帧动画更适合那些必要体现复杂动画效果的场合,比如加载指示器、动画心情等。帧动画由于每一帧都是一个独立的图片,因此它可能会斲丧更多的内存资源,特殊是在帧数较多大概图片分辨率较高的环境下。所以,帧动画的使用必要更加审慎,通常用于那些动画效果是应用焦点部分的场景。
3. 使用  RotateAnimation  实现翻转动画

3.1  RotateAnimation  的基本用法

3.1.1  RotateAnimation  的定义和属性

   RotateAnimation  是Android动画系统中用于实现视图旋转效果的一个动画类。其主要通过指定旋转的起始角度、竣事角度以及旋转的中心点来定义旋转动画。开发者可以使用  RotateAnimation  来实现简单的二维旋转效果,也可以通过组合多个  RotateAnimation  实例来实现复杂的三维翻转动画。
  该类的关键属性包括:


  •   fromDegrees  : 起始角度,定义旋转动画开始时的角度。
  •   toDegrees  : 竣事角度,定义旋转动画竣事时的角度。
  •   pivotX  : 旋转中心点的横坐标。
  •   pivotY  : 旋转中心点的纵坐标。
  •   duration  : 动画连续的时间。
  •   repeatCount  : 动画重复的次数。
  •   repeatMode  : 动画重复的模式,可以是  Animation.REVERSE  (反向)或  Animation.RESTART  (重新开始)。
3.1.2  RotateAnimation  的使用示例

  以下是一个简单的  RotateAnimation  使用示例,该示例实现了一个视图从0度旋转到360度的动画效果:
  1. RotateAnimation animation = new RotateAnimation(0, 360,
  2.         Animation.RELATIVE_TO_SELF, 0.5f,
  3.         Animation.RELATIVE_TO_SELF, 0.5f);
  4. animation.setDuration(1000); // 动画持续时间为1000毫秒
  5. animation.setFillAfter(true); // 动画结束后保留结束状态
  6. view.startAnimation(animation); // 开始动画
复制代码
在上述代码中,  Animation.RELATIVE_TO_SELF  指定了旋转中心点相对于视图自身的比例,此中0.5f代表视图中心点。  setFillAfter(true)  方法确保动画竣事后视图保持在竣事状态,而不是回到开始状态。
3.2 翻转动画的高级应用

3.2.1 翻转动画的参数设置

  要实现更加复杂的翻转动画,可以对  RotateAnimation  的属性进行更过细的设置。比方,可以在旋转动画的底子上参加  interpolator  来实现差异的速率变化效果,如加速、减速等。
  别的,通过修改  pivotX  和  pivotY  可以改变翻转的轴心点,从而实现差异的翻转效果:
  1. RotateAnimation animation = new RotateAnimation(fromDegrees, toDegrees,
  2.         Animation.RELATIVE_TO_SELF, 0.0f,
  3.         Animation.RELATIVE_TO_SELF, 1.0f);
复制代码
此代码示例创建了一个围绕视图左侧边缘旋转的翻转动画。
3.2.2 翻转动画与视图的结合应用

  结合视图的其他属性和动画可以实现更加丰富的交互效果。比方,可以将翻转动画与透明度动画  AlphaAnimation  结合使用,实现视图的淡入淡出效果。
  1. AnimationSet animationSet = new AnimationSet(true);
  2. animationSet.addAnimation(new RotateAnimation(0, 180, Animation.RELATIVE_TO_SELF, 0.5f,
  3.         Animation.RELATIVE_TO_SELF, 0.5f));
  4. AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0);
  5. alphaAnimation.setDuration(500);
  6. alphaAnimation.setFillAfter(true);
  7. animationSet.addAnimation(alphaAnimation);
  8. view.startAnimation(animationSet);
复制代码
在此示例中,  AnimationSet  用于组合多个动画。视图在翻转的同时淡出,创建出渐出的效果。
  在此底子上,我们可以通过调解旋转的起始和竣事角度、设置差异的插值器以及与其他动画的组合来实现更加多样和复杂的动画效果。在现实应用中,需注意动画性能的优化,以避免在低端设备上出现卡顿现象,影响用户体验。
4. 动画参数设置与视图应用

  在Android开发中,动画参数的设置与视图的结合应用是一个关键的技能点,这能够极大地提升用户界面的交互体验和视觉效果。本章节将深入探讨如何设置动画参数,并且如何将动画与视图进行有用结合,从而创建流畅且吸引人的用户界面动画。
4.1 动画参数的设置方法

  动画参数是控制动画举动和效果的关键,明确它们的定义、范例以及设置本事对于制作高质量动画至关重要。
4.1.1 动画参数的定义和范例

  在Android动画系统中,动画参数主要通过  Animation  类及其子类的属性进行控制。这些参数定义了动画的连续时间、重复次数、缓动效果等多种特性。常见的动画参数范例包括:


  •   duration  : 动画连续时间,以毫秒为单位。
  •   repeatCount  : 动画重复次数,可以是详细的数值大概  Animation.INFINITE  体现无穷重复。
  •   repeatMode  : 动画重复模式,有  Animation.REVERSE  (反向重复)和  Animation.RESTART  (重新开始)两种选择。
  •   interpolator  : 缓动函数,用于控制动画速率的变化,常见的有  AccelerateInterpolator  (加速减速)和  DecelerateInterpolator  (减速加速)等。
4.1.2 动画参数的设置本事

  为了实现更复杂和更符合需求的动画效果,我们必要把握一些参数设置的本事:

  •    动态设置参数 :在动画开始前,根据现实环境动态设置动画参数,以适应差异的运行环境或用户交互。  java Animation anim = new TranslateAnimation(0, 100, 0, 100); anim.setDuration(1000); anim.setRepeatCount(Animation.INFINITE); anim.setRepeatMode(Animation.REVERSE);  
  •    使用XML定义动画 :通过定义XML文件来管理动画,可以更好地维护动画资源,并在多处重用相同的动画效果。
  ```xml
  ```

  • 缓动函数的使用 :缓动函数能够决定动画在开始、中间和竣事阶段的速率变化,是创建自然流畅动画的关键。  java anim.setInterpolator(new AccelerateInterpolator());
4.2 动画与视图的结合应用

  动画与视图的结合应用涉及到动画的触发、运行以及视图的更新,本末节将介绍如何将动画与视图有用结合。
4.2.1 动画与视图的绑定方法

  为了使动画与视图进行有用绑定,开发者必要在动画资源文件或代码中明确指定作用的视图元素。以下是一些常用的绑定方法:


  • 在XML中指定视图ID :通过在动画定义的XML文件中指定目标视图的ID,可以在动画应用时直接关联到视图。
  ```xml
  ```


  • 代码中绑定视图 :通过编程方式在代码中将动画资源应用到特定视图上,这答应在运行时根据必要动态地绑定动画。
   java Animation fadeInAnimation = AnimationUtils.loadAnimation(this, R.anim.fade_in); View view = findViewById(R.id.my_view); view.startAnimation(fadeInAnimation);  
4.2.2 动画与视图的交互应用

  将动画与视图进行交互应用,不但可以加强视觉效果,还可以改善用户体验。本部分将讨论一些交互应用的本事:

  •    动画变乱监听 :使用动画变乱监听器来控制动画的开始、竣事和重复等举动,使得动画与用户的交互动态相应。 ```java fadeInAnimation.setAnimationListener(new Animation.AnimationListener() { @Override public void onAnimationStart(Animation animation) { // 动画开始时的操纵 }
      @Override public void onAnimationEnd(Animation animation) { // 动画竣事时的操纵 }
      @Override public void onAnimationRepeat(Animation animation) { // 动画重复时的操纵 } }); ```
  •    视图触发器 :通过视图的触摸变瞎搅触发动画,使得动画更加自然和人性化。  java view.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { fadeInAnimation.start(); } return true; } });  
  •    视图状态变化动画 :在视图状态发生变化时应用动画,比方在按钮按下和释放时添加相应的动画效果,加强视觉反馈。
  ```java Button myButton = findViewById(R.id.my_button); Animation buttonPressAnimation = AnimationUtils.loadAnimation(this, R.anim.button_press); Animation buttonReleaseAnimation = AnimationUtils.loadAnimation(this, R.anim.button_release);
  myButton.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { myButton.startAnimation(buttonPressAnimation); } else if (event.getAction() == MotionEvent.ACTION_UP) { myButton.startAnimation(buttonReleaseAnimation); } return true; } }); ```
  通过上述介绍,我们可以看到,合理地设置动画参数和将动画与视图结合,可以极大地提升动画效果和用户体验。下一章节将介绍  AnimationEnd  变乱监听与界面切换,进一步探讨动画与用户交互的高级技能。
5.  AnimationEnd  变乱监听与界面切换

5.1  AnimationEnd  变乱的监听方法

5.1.1  AnimationEnd  变乱的定义和作用

  在Android动画的处置惩罚中,  AnimationEnd  变乱是一个关键的回调,它标志着动画序列的竣事。在补间动画和属性动画中,我们可以通过设置监听器(Listener)来捕捉这个变乱。这种变乱对于实行动画竣事后的逻辑特殊重要,比方,隐藏或体现一个视图,大概在动画竣事后启动新的动画序列,大概进行资源的释放等。
  变乱监听器主要在动画竣事时进行一些操纵,可以有用地控制界面元素的举动和状态切换。  AnimationEnd  变乱在现实开发中可以用来实行一个动画完成后的动作,比方,当一个翻页动画竣事之后,可能必要切换到另一张图片大概进入一个新的界面。
5.1.2  AnimationEnd  变乱的监听本事

  为了有用地监听  AnimationEnd  变乱,可以使用  AnimationListener  接口,它定义了四个回调方法:  onAnimationStart()  ,  onAnimationEnd()  ,  onAnimationRepeat()  , 和  onAnimationCancel()  . 要捕捉动画竣事的变乱,我们只必要重写  onAnimationEnd()  方法。
  在代码中,创建一个  AnimationListener  实例并设置给你的动画对象,然后在  onAnimationEnd()  方法内实现你想要在动画竣事后实行的代码逻辑。
  1. Animation animation = AnimationUtils.loadAnimation(context, R.anim.my_animation);
  2. animation.setAnimationListener(new Animation.AnimationListener() {
  3.     @Override
  4.     public void onAnimationStart(Animation animation) {
  5.         // 动画开始时的操作
  6.     }
  7.     @Override
  8.     public void onAnimationEnd(Animation animation) {
  9.         // 动画结束时的操作,这里是关键
  10.         // 例如,根据业务逻辑显示或隐藏视图等
  11.     }
  12.     @Override
  13.     public void onAnimationRepeat(Animation animation) {
  14.         // 动画重复时的操作
  15.     }
  16. });
  17. view.startAnimation(animation);
复制代码
5.2 界面切换的实现方法

5.2.1 界面切换的定义和范例

  界面切换是Android应用中常见的操纵之一,它涉及到视图之间的切换,使得应用的用户界面能够适应差异的操纵流程和任务。界面切换可以在用户与应用交互时自然发生,比方点击按钮进入新的页面大概在完成一个任务后返回上一个页面。界面切换可以根据实现的方式分成几种范例,包括Activity切换、Fragment切换以及View的体现与隐藏等。
  Activity切换是通过Intent来启动新的Activity,而Fragment切换则通过Fragment事务来实现,如  replace()  、  add()  、  remove()  等。View的体现与隐藏可以通过设置View的可见性属性  View.VISIBLE  、  View.INVISIBLE  和  View.GONE  来实现。
5.2.2 界面切换的实现本事

  实现Activity的界面切换,最常见的是启动一个新的Activity:
  1. Intent intent = new Intent(CurrentActivity.this, NextActivity.class);
  2. startActivity(intent);
复制代码
对于Fragment的切换,可以使用FragmentTransaction:
  1. FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
  2. transaction.replace(R.id.fragment_container, new MyFragment());
  3. transaction.commit();
复制代码
关于View的体现与隐藏,可以使用以下方法:
  1. View myView = findViewById(R.id.my_view);
  2. // 显示View
  3. myView.setVisibility(View.VISIBLE);
  4. // 隐藏View
  5. myView.setVisibility(View.GONE);
复制代码
当必要在动画竣事后进行界面切换时,可以在  AnimationEnd  监听器的  onAnimationEnd()  方法中实行界面切换的逻辑。比方,在一个视图的动画竣事后隐藏该视图并启动一个新的Activity:
  1. animation.setAnimationListener(new Animation.AnimationListener() {
  2.     @Override
  3.     public void onAnimationEnd(Animation animation) {
  4.         myView.setVisibility(View.GONE);
  5.         Intent intent = new Intent(CurrentActivity.this, NextActivity.class);
  6.         startActivity(intent);
  7.     }
  8.     // 其他方法可以保留空实现
  9.     @Override
  10.     public void onAnimationStart(Animation animation) {}
  11.     @Override
  12.     public void onAnimationRepeat(Animation animation) {}
  13. });
复制代码
这样,动画完成之后,视图会立刻隐藏,并且应用会跳转到下一个Activity,实现了一个流畅的用户体验。
6.  FrameLayout  与  ViewGroup  结构控制

  在Android开发中,结构是构造界面中各种视图组件的重要方式。  FrameLayout  和  ViewGroup  作为Android结构体系中的焦点组件,承担着视图容器的脚色。它们提供了丰富的结构属性,答应开发者实现复杂的结构控制和交互效果。本章将详细介绍  FrameLayout  与  ViewGroup  的基本用法和高级应用,以及如何将结构控制与动画效果结合起来,打造更加生动的用户体验。
6.1  FrameLayout  与  ViewGroup  的基本用法

6.1.1  FrameLayout  与  ViewGroup  的定义和属性

   FrameLayout  是一个简单的结构容器,其设计目标是在一个屏幕位置上体现单一视图。与之相比,  ViewGroup  是一个更通用的结构容器,它答应将多个子视图以条理结构的方式组合在一起。


  •   FrameLayout  的属性主要包括:
  •   android:id  :为结构容器设置唯一标识符。
  •   android:layout_width  和  android:layout_height  :设置结构的宽度和高度。
  •   android:padding  和  android:paddingLeft  等:设置结构内边距。
  •    android:background  :设置结构背景。
  •    ViewGroup  作为结构的父类,包罗以下主要属性:
  •   androidrientation  :设置子视图排列方向(水平或垂直)。
  •   android:layout_gravity  :确定子视图在其父容器中的位置。
  •   android:layout_weight  :在使用  LinearLayout  时,分配父容器剩余空间的权重。
6.1.2  FrameLayout  与  ViewGroup  的使用示例

  在现实应用中,开发者可以根据结构需求选择适当的  FrameLayout  或  ViewGroup  子类。


  • 示例1:使用  FrameLayout  作为容器放置图片和笔墨
  1. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.     android:layout_width="match_parent"
  3.     android:layout_height="match_parent">
  4.     <ImageView
  5.         android:layout_width="match_parent"
  6.         android:layout_height="match_parent"
  7.         android:src="@drawable/your_image" />
  8.     <TextView
  9.         android:layout_width="wrap_content"
  10.         android:layout_height="wrap_content"
  11.         android:text="Hello, World!"
  12.         android:layout_gravity="bottom|end"
  13.         android:padding="20dp" />
  14. </FrameLayout>
复制代码


  • 示例2:使用  LinearLayout  作为容器实现垂直排列
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.     android:layout_width="match_parent"
  3.     android:layout_height="match_parent"
  4.     android:orientation="vertical">
  5.     <Button
  6.         android:layout_width="match_parent"
  7.         android:layout_height="wrap_content"
  8.         android:text="Button 1" />
  9.     <Button
  10.         android:layout_width="match_parent"
  11.         android:layout_height="wrap_content"
  12.         android:text="Button 2" />
  13. </LinearLayout>
复制代码
6.2 结构控制的高级应用

6.2.1 结构控制的方法和本事

  结构控制不但仅局限于简单的视图排列,还可以通过以下方法实现更复杂的结构效果:


  • 使用  ConstraintLayout  进行灵活的视图定位,通过束缚关系来确定视图位置。
  • 使用  Margin  和  Padding  属性在视图间创建空间和边界。
  • 使用  ViewStub  实现按需加载视图,节省资源斲丧。
6.2.2 结构控制与动画的结合应用

  将结构控制与动画结合,可以实现视图的动态体现和隐藏,提升用户交互体验。


  • 示例:使用动画实现按钮点击后淡入淡出效果
  1. ImageView imageView = findViewById(R.id.my_image_view);
  2. imageView.setOnClickListener(new View.OnClickListener() {
  3.     @Override
  4.     public void onClick(View v) {
  5.         if (imageView.getVisibility() == View.VISIBLE) {
  6.             // 设置动画资源
  7.             Animation fadeOut = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.fade_out);
  8.             // 设置动画监听
  9.             fadeOut.setAnimationListener(new Animation.AnimationListener() {
  10.                 @Override
  11.                 public void onAnimationStart(Animation animation) {}
  12.                 @Override
  13.                 public void onAnimationEnd(Animation animation) {
  14.                     // 动画结束时,设置视图不可见
  15.                     imageView.setVisibility(View.GONE);
  16.                 }
  17.                 @Override
  18.                 public void onAnimationRepeat(Animation animation) {}
  19.             });
  20.             imageView.startAnimation(fadeOut);
  21.         } else {
  22.             // 设置动画资源
  23.             Animation fadeIn = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.fade_in);
  24.             imageView.setVisibility(View.VISIBLE);
  25.             imageView.startAnimation(fadeIn);
  26.         }
  27.     }
  28. });
复制代码
在上述代码中,我们起首定义了两个动画资源  fade_in  和  fade_out  ,它们分别控制视图的淡入和淡出效果。然后在点击变乱中根据视图当前的可见状态,动态地设置相应的动画。
  通过本章节的学习,我们已经了解到  FrameLayout  和  ViewGroup  在Android结构中的基本应用,以及如何使用动画效果提升界面的交互性。在下一章中,我们将探讨  ObjectAnimator  ,这是Android动画系统中用于实现复杂动画效果的一个关键类。
   本文另有配套的佳构资源,点击获取  

  简介:在Android开发中,通过自定义动画实现独特的用户交互和视觉效果是提升应用体验的关键。'android-flip切换界面的翻转动画效果'项目演示了如何在界面间创建翻转动画,实现卡片翻转效果的平滑过渡。文章介绍了补间动画和帧动画的概念,并详细分析了如何使用  RotateAnimation  类来设置翻转角度和中心点,以实现视图的前后翻转。同时,文章也探讨了  ObjectAnimator  的使用以及如何处置惩罚结构和触摸变乱,终极给出源码分析以帮助开发者深入明确Android动画系统。
   本文另有配套的佳构资源,点击获取  


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

尚未崩坏

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表