GVKun编程网logo

[android] 界面切换的简单动画(安卓页面切换动画)

11

本篇文章给大家谈谈[android]界面切换的简单动画,以及安卓页面切换动画的知识点,同时本文还将给你拓展Activity取消界面切换的默认动画方法(推荐)、AndroidActivity界面切换添加

本篇文章给大家谈谈[android] 界面切换的简单动画,以及安卓页面切换动画的知识点,同时本文还将给你拓展Activity取消界面切换的默认动画方法(推荐)、Android Activity界面切换添加动画特效、Android Flutter实现页面切换转场动画效果、Android Path菜单的简单实现,android开发软件等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

[android] 界面切换的简单动画(安卓页面切换动画)

[android] 界面切换的简单动画(安卓页面切换动画)

1. 新建个位移动画的xml文件

Activity中开启动画

使用AnimationUtils类加载动画资源文件

left_to_right.xml

<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromXDelta="100%"
    android:toXDelta="0"
    android:duration="3000"
    >
</translate>
View child=new IndexView(this).getMemberView();
child.startAnimation(AnimationUtils.loadAnimation(this,R.anim.left_to_right));

 

 

2. 淡入淡出动画

当前淡出界面和执行时间

淡出过程中,淡入界面处于等待状态

第二个界面淡入和他的执行时间

第一个界面执行完成后,要删除掉

package com.tsh.lottery.utils;

import android.support.v4.view.ViewPager;
 android.view.View;
 android.view.ViewGroup;
 android.view.ViewParent;
 android.view.animation.AlphaAnimation;
 android.view.animation.Animation;
 android.view.animation.Animation.AnimationListener;

public class FadeUtil {
    /**
     * 淡出界面
     * @param view 界面
     *  duration 执行时间
     */
    static void fadeOut(final View view,long duration){
        AlphaAnimation alphaAnimation=new AlphaAnimation(1,0);
        alphaAnimation.setDuration(duration);
        view.startAnimation(alphaAnimation);
        //监听动画结束,删除View元素
        alphaAnimation.setAnimationListener(new AnimationListener() {
            
            @Override
            void onAnimationStart(Animation animation) {
            }
            
            @Override
             onAnimationRepeat(Animation animation) {
            }
            
            @Override
             onAnimationEnd(Animation animation) {
                ViewGroup vg=(ViewGroup) view.getParent();
                vg.removeView(view);
            }
        });
    }
    
     * 淡入界面
     *  delay 延迟时间
     * void fadeIn(View view,1)">long delay,1)">new AlphaAnimation(0,1);
        设置开始时间延迟
        alphaAnimation.setStartOffset(delay);
        alphaAnimation.setDuration(duration);
        view.startAnimation(alphaAnimation);
    }
}
FadeUtil.fadeOut(child,2000);
FadeUtil.fadeIn(child,2000,2000);

 

Activity取消界面切换的默认动画方法(推荐)

Activity取消界面切换的默认动画方法(推荐)

一般启动一个新的Activity都默认有切换的动画效果,比如界面从右至左的移动。

但是有些时候我们不需要这个动画,怎么办?

操作方法比较麻烦,这里我推荐其中一种。我这里是要做启动页splash到首页Home无缝展示,即启动页的图片背景和首页最上层的悬浮背景图是一模一样,用户会以为还在启动页,我这里会做些动画,然后进行开门效果。(首页会多出2个按钮,此时就不是启动页了)

主要实现思路:

1、需要设置无动画效果的主题,应用到对应的界面。

2、在启动页面界面结束时,需要增加一个方法 overridePendingTransition(0,0);

在SplashActivity.this.finish();之前。

3、gif中启动页面和首页都是同一个图片(首页布局上面悬浮了启动页的图片,利用window的decorview)

4、在style.xml里,需要加入下面主题,其中parent=”AppTheme”中的父主题是你应用自身的主题,name=”Theme”的theme是即将需要使用的。接下来在首页的Android:theme=”@style/Theme”设置到你的首页(即你启动页跳转的下一级页面)。

<!-- 取消界面转场动画使用-->
  <style name="Theme" parent="AppTheme">
    <item name="android:windowAnimationStyle">@style/Animation</item>
  </style>
  <style name="Animation">
    <item name="android:activityOpenEnteranimation">@null</item>
    <item name="android:activityOpenExitAnimation">@null</item>
    <item name="android:activityCloseEnteranimation">@null</item>
    <item name="android:activityCloseExitAnimation">@null</item>
    <item name="android:taskOpenEnteranimation">@null</item>
    <item name="android:taskOpenExitAnimation">@null</item>
    <item name="android:taskCloseEnteranimation">@null</item>
    <item name="android:taskCloseExitAnimation">@null</item>
    <item name="android:taskToFrontEnteranimation">@null</item>
    <item name="android:taskToFrontExitAnimation">@null</item>
    <item name="android:taskToBackEnteranimation">@null</item>
    <item name="android:taskToBackExitAnimation">@null</item>
  </style>

5、如果需要实现gif中效果,防止启动页的图片可能延伸到状态栏,我这边加了占位布局(高度为动态获取的系统状态栏高度,代码是在启动页获取高度)。

@Override
  public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    int statusBarHeight = getStatusBarHeight();
    PreferencesUtil.putInt(this,PreferenceKey.SETTING,PreferenceKey.STATUS_BAR_HEIGHT,statusBarHeight);
    LogUtil.e(statusBarHeight + "");
  }

  public int getStatusBarHeight() {
    int result = 0;
    int resourceId = getResources().getIdentifier("status_bar_height","dimen","android");
    if (resourceId > 0) {
      result = getResources().getDimensionPixelSize(resourceId);
    }
    return result;
  }

以上就是小编为大家带来的Activity取消界面切换的默认动画方法(推荐)全部内容了,希望大家多多支持编程小技巧~

Android Activity界面切换添加动画特效

Android Activity界面切换添加动画特效

Android 2.0之后有了overridePendingTransition() ,其中里面两个参数,一个是前一个activity的退出两一个activity的进入。

  Java代码

  1. @Override

  2. public void onCreate(Bundle savedInstanceState) {

  3. super.onCreate(savedInstanceState);

  4.

  5. setContentView(R.layout.SplashScreen);

  6.

  7. new Handler().postDelayed(new Runnable() {

  8. @Override

  9. public void run() {

  10. Intent mainIntent = new Intent(SplashScreen.this, AndroidNews.class);

  11. SplashScreen.this.startActivity(mainIntent);

  12. SplashScreen.this.finish();

  13.

  14. overridePendingTransition(R.anim.mainfadein,

  15. R.anim.splashfadeout);

  16. }

  17. }, 3000);

  18. }

  @Override

  public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.SplashScreen);

  new Handler().postDelayed(new Runnable() {

  @Override

  public void run() {

  Intent mainIntent = new Intent(SplashScreen.this, AndroidNews.class);

  SplashScreen.this.startActivity(mainIntent);

  SplashScreen.this.finish();

  overridePendingTransition(R.anim.mainfadein,

  R.anim.splashfadeout);

  }

  }, 3000);

  }

  上面的代码只是闪屏的一部分。

  Java代码

  1. getWindow ().setWindowAnimations ( int );

  getWindow ().setWindowAnimations ( int );

  这可没有上个好但是也可以 。

  实现淡入淡出的效果

  Java代码

  1. overridePendingTransition(Android.R.anim.fade_in,android.R.anim.fade_out);

  overridePendingTransition(Android.R.anim.fade_in,android.R.anim.fade_out);

  由左向右滑入的效果

  Java代码

  1. overridePendingTransition(Android.R.anim.slide_in_left,android.R.anim.slide_out_right);

overridePendingTransition(Android.R.anim.slide_in_left,android.R.anim.slide_out_right);

  实现zoominzoomout,即类似iPhone的进入和退出时的效果

  Java代码

  1. overridePendingTransition(R.anim.zoomin, R.anim.zoomout);

  overridePendingTransition(R.anim.zoomin, R.anim.zoomout);

  新建animzoomin.xml文件

  Xml代码

  1. < ?xml version="1.0" encoding="utf-8"?>

  2. < set xmlns:Android="http://schemas.android.com/apk/res/android"

  3. Android:interpolator="@android :anim/decelerate_interpolator">

  4. < scale Android:fromXScale="2.0" android:toXScale="1.0"

  5. Android:fromYScale="2.0" android:toYScale="1.0"

  6. Android:pivotX="50%p" android:pivotY="50%p"

  7. Android:duration="@android :integer/config_mediumAnimTime" />

  8. < /set>

  < ?xml version="1.0" encoding="utf-8"?>

  < set xmlns:Android="http://schemas.android.com/apk/res/android"

  Android:interpolator="@android :anim/decelerate_interpolator">

  < scale Android:fromXScale="2.0" android:toXScale="1.0"

  Android:fromYScale="2.0" android:toYScale="1.0"

  Android:pivotX="50%p" android:pivotY="50%p"

  Android:duration="@android :integer/config_mediumAnimTime" />

  < /set>

  新建animzoomout.xml文件

  Xml代码

  1. < ?xml version="1.0" encoding="utf-8"?>

  2. < set xmlns:Android="http://schemas.android.com/apk/res/android"

  3. Android:interpolator="@android :anim/decelerate_interpolator"

  4. Android:zAdjustment="top">

  5. < scale Android:fromXScale="1.0" android:toXScale=".5"

  6. Android:fromYScale="1.0" android:toYScale=".5"

  7. Android:pivotX="50%p" android:pivotY="50%p"

  8. Android:duration="@android :integer/config_mediumAnimTime" />

  9. < alpha Android:fromAlpha="1.0" android:toAlpha="0"

  10. Android:duration="@android :integer/config_mediumAnimTime"/>

  11. < /set>

Android Flutter实现页面切换转场动画效果

Android Flutter实现页面切换转场动画效果

前言

写了一篇基础的性能优化的内容,继续我们的动画相关的介绍。今天的主角是英雄 —— Hero 组件。Hero 组件非常适合从列表、概览页切换到详情页转场动画场合。因为可以将两个页面的组件串起来动画,体验上会觉得整个操作的连贯性非常好。下面是我们这篇要做的一个效果。

屏幕录制2021-11-09 下午9.39.49.gif

Hero 动画过程

Hero 本质是是在不同的路由页面做了一个中转层,然后通过动画完成过渡,下面用4张图是官方演示的过程。

动画开始前,会准备一个空的遮罩层(Overlay)。此时目标路由页面还没生成。

转场前

t = 0.0,即动画开始时,源页面已经从屏幕消失,遮罩层出现在屏幕上,此时目标路由页面已经构建好,并且在遮罩层下方不可见。但此时 Flutter 渲染引擎已经计算出从遮罩层到目标路由页面的动画路径。

起始阶段

动画过程中,英雄飞起来,逐步飞到目标页面。使用的是Tween<Rect>方式更改外形和位置,默认是使用 MaterialRectArcTween 对象完成动画。

飞行过程

动画结束:遮罩层消失,只剩下目标路由页面。而源页面恢复到它对应的路由状态(以便返回时使用逆向的动画)。

动画结束

Hero 基础示例

下面来看我们本篇动画效果的实现。对于 Hero 最简单的应用,就是前后两个路由页面的 Hero 组件使用相同的 tag 标识,然后所有动画都交给 Hero 来完成了 —— 果然是超级英雄,啥都不用我们管!当然,为了用户体验,前后两个页面的组件最好是具有相同的内容(比如图片),然后如果组件树结构是一致的话效果更好。

我们这个示例的第一个页面就是两张小尺寸的图片,这里的关键是 Hero 组件的 tag 标签,两张图片使用了不同的 tag这是因为同一个页面的多个 Hero 不能共用 tag 。

Widget build(BuildContext context) {
  return Scaffold(
    appBar: AppBar(
      title: Text(''Hero 基础动画''),
      brightness: Brightness.dark,
    ),
    body: Center(
      child: Row(
        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
        crossAxisAlignment: CrossAxisAlignment.center,
        children: [
          Hero(
            tag: ''beauty1'',
            child: RoundImage(
              onTap: () {
                Navigator.of(context).push(
                  MaterialPageRoute(
                    builder: (context) => HeroDetail(
                      tag: ''beauty1'',
                      assetImageName: ''images/beauty.jpeg'',
                    ),
                  ),
                );
              },
              assetImageName: ''images/beauty.jpeg'',
              imageSize: 80.0,
            ),
          ),
          // 省略图片2
        ],
      ),
    ),
  );
}

详情页面只有一个居中的图片,也是用的 Hero 组件。只是为了和源页面一致,这里的 tag,图片资源都是由源页面传递进来。

class HeroDetail extends StatelessWidget {
  final String tag;
  final String assetImageName;
  const HeroDetail({Key? key, required this.tag, required this.assetImageName})
      : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(''Hero 基础动画详情''),
        brightness: Brightness.dark,
      ),
      body: Center(
        child: SizedBox(
          width: 200,
          height: 200,
          child: Hero(
            tag: this.tag,
            child: RoundImage(
              onTap: () {
                Navigator.of(context).pop();
              },
              assetImageName: this.assetImageName,
              imageSize: 200.0,
            ),
          ),
        ),
      ),
    );
  }
}

这样就完成了我们前面的转场动画效果,源码已上传至:动画相关源码。怎么样?有了 Hero之后,是不是感觉英雄救场一样,让你的转场轻松多了!

总结

本篇介绍了 Hero 动画的基本过程和基础示例。借助 Hero,对于我们很多场景可以让转场效果更好,比如说从商品列表切换到商品详情,从资讯列表到资讯详情。都可以给用户带来更好的体验。

以上就是Android Flutter实现页面切换转场动画效果的详细内容,更多关于Android Flutter页面切换转场动画的资料请关注其它相关文章!

您可能感兴趣的文章:
  • Android实现Reveal圆形Activity转场动画的完整步骤
  • Android工具栏顶出转场动画的实现方法实例
  • Android5.0之Activity的转场动画的示例
  • 详解Android(共享元素)转场动画开发实践
  • Android中转场动画的实现与兼容性处理
  • Android转场动画深入分析探究

Android Path菜单的简单实现,android开发软件

Android Path菜单的简单实现,android开发软件

  1. mHomeparams.width = LayoutParams.WRAP_CONTENT;

  2. mHomeparams.height = LayoutParams.WRAP_CONTENT;

  3. switch (position) {

  4. case LEFT_TOP:

  5. mHomeparams.gravity = Gravity.LEFT | Gravity.TOP;

  6. for (int i = 0; i < menuResIds.length; i++) {

  7. int width_padding = mWIDTH / ((menuResIds.length - 1) * 2);

  8. int height_padding = mHEIGHT / ((menuResIds.length - 1) * 2);

  9. ImageView imageView = new ImageView(mContext);

  10. imageView.setimageResource(menuResIds[i]);

  11. addView(imageView);

  12. LayoutParams params = (FrameLayout.LayoutParams) imageView

  13. .getLayoutParams();

  14. params.width = LayoutParams.WRAP_CONTENT;

  15. params.height = LayoutParams.WRAP_CONTENT;

  16. params.leftMargin = mWIDTH / 2

  17. - ((menuResIds.length - i - 1) * width_padding);

  18. params.topMargin = mHEIGHT / 2 - i * height_padding;

  19. params.gravity = Gravity.LEFT | Gravity.TOP;

  20. imageView.setLayoutParams(params);

  21. }

  22. break;

  23. case RIGHT_TOP:

  24. mHomeparams.gravity = Gravity.RIGHT | Gravity.TOP;

  25. for (int i = 0; i < menuResIds.length; i++) {

  26. int width_padding = mWIDTH / ((menuResIds.length - 1) * 2);

  27. int height_padding = mHEIGHT / ((menuResIds.length - 1) * 2);

  28. ImageView imageView = new ImageView(mContext);

  29. imageView.setimageResource(menuResIds[i]);

  30. addView(imageView);

  31. LayoutParams params = (FrameLayout.LayoutParams) imageView

  32. .getLayoutParams();

  33. params.width = LayoutParams.WRAP_CONTENT;

  34. params.height = LayoutParams.WRAP_CONTENT;

  35. params.rightMargin = mWIDTH / 2

  36. - ((menuResIds.length - i - 1) * width_padding);

  37. params.topMargin = mHEIGHT / 2 - i * height_padding;

  38. params.gravity = Gravity.RIGHT | Gravity.TOP;

  39. imageView.setLayoutParams(params);

  40. }

  41. break;

  42. case RIGHT_BottOM:

  43. mHomeparams.gravity = Gravity.RIGHT | Gravity.BottOM;

  44. for (int i = 0; i < menuResIds.length; i++) {

  45. int width_padding = mWIDTH / ((menuResIds.length - 1) * 2);

  46. int height_padding = mHEIGHT / ((menuResIds.length - 1) * 2);

  47. ImageView imageView = new ImageView(mContext);

  48. imageView.setimageResource(menuResIds[i]);

  49. addView(imageView);

  50. LayoutParams params = (FrameLayout.LayoutParams) imageView

  51. .getLayoutParams();

  52. params.width = LayoutParams.WRAP_CONTENT;

  53. params.height = LayoutParams.WRAP_CONTENT;

  54. params.rightMargin = mWIDTH / 2

  55. - ((menuResIds.length - i - 1) * width_padding);

  56. params.bottomMargin = mHEIGHT / 2 - i * height_padding;

  57. params.gravity = Gravity.RIGHT | Gravity.BottOM;

  58. imageView.setLayoutParams(params);

  59. }

  60. break;

  61. case LEFT_BottOM:

  62. mHomeparams.gravity = Gravity.LEFT | Gravity.BottOM;

  63. for(int i = 0; i < menuResIds.length; i++){

  64. int width_padding = mWIDTH / ((menuResIds.length - 1) * 2);

  65. int height_padding = mHEIGHT / ((menuResIds.length -1) * 2);

  66. ImageView imageView = new ImageView(mContext);

  67. imageView.setimageResource(menuResIds[i]);

  68. addView(imageView);

  69. LayoutParams params = (FrameLayout.LayoutParams)imageView.getLayoutParams();

  70. params.width = LayoutParams.WRAP_CONTENT;

  71. params.height = LayoutParams.WRAP_CONTENT;

  72. params.leftMargin = mWIDTH / 2 - ((menuResIds.length - i - 1) * width_padding);

  73. params.bottomMargin = mHEIGHT / 2 - i * height_padding;

  74. params.gravity = Gravity.LEFT | Gravity.BottOM;

  75. imageView.setLayoutParams(params);

  76. }

  77. break;

  78. default:

  79. break;

  80. }

  81. mHome.setLayoutParams(mHomeparams);

  82. }

  83. private OnClickListener listener = new OnClickListener() {

  84. public void onClick(View v) {

  85. if (!bMenuShow) {

  86. startAnimationIn(PathMenuView.this, 300);

  87. } else {

  88. startAnimationOut(PathMenuView.this, 300);

  89. }

  90. bMenuShow = !bMenuShow;

  91. }

  92. };

  93. /**

  94. * 菜单隐藏动画.

  95. *

  96. * @param group

  97. * @param duration

  98. */

  99. private void startAnimationIn(ViewGroup group, int duration) {

  100. for (int i = 1; i < group.getChildCount(); i++) {

  101. ImageView imageview = (ImageView) group.getChildAt(i);

  102. imageview.setVisibility(0);

  103. MarginLayoutParams mlp = (MarginLayoutParams) imageview

  104. .getLayoutParams();

  105. Animation animation = null;

  106. switch (position) {

  107. case LEFT_TOP:

  108. animation = new TranslateAnimation(0F,-mlp.leftMargin+xOffset,0F,-mlp.topMargin + yOffset);

  109. break;

  110. case RIGHT_TOP:

  111. animation = new TranslateAnimation(mlp.rightMargin - xOffset,0F,-mlp.topMargin + yOffset,0F);

  112. break;

  113. case LEFT_BottOM:

  114. animation = new TranslateAnimation(0F, -mlp.leftMargin+ xOffset, 0F, -yOffset + mlp.bottomMargin);

  115. break;

  116. case RIGHT_BottOM:

  117. animation = new TranslateAnimation(mlp.rightMargin-xOffset,0F,-yOffset + mlp.bottomMargin, 0F);

  118. break;

  119. default:

  120. break;

  121. }

  122. animation.setFillAfter(true);

  123. animation.setDuration(duration);

  124. animation.setStartOffset((i * 100) / (-1 + group.getChildCount()));

  125. animation.setInterpolator(new OvershootInterpolator(2F));

  126. imageview.startAnimation(animation);

  127. }

  128. }

  129. /**

  130. * 菜单显示动画.

  131. *

  132. * @param group

  133. * @param duration

  134. */

  135. private void startAnimationOut(ViewGroup group,int duration){

  136. for (int i = 1; i < group.getChildCount(); i++) {

  137. final ImageView imageview = (ImageView) group

  138. .getChildAt(i);

  139. MarginLayoutParams mlp = (MarginLayoutParams) imageview.getLayoutParams();

  140. Animation animation = null;

  141. switch (position) {

  142. case LEFT_TOP:

  143. animation = new TranslateAnimation(-mlp.leftMargin+xOffset,0F,-mlp.topMargin + yOffset,0F);

  144. break;

  145. case RIGHT_TOP:

  146. animation = new TranslateAnimation(0F,mlp.rightMargin - xOffset,0F,-mlp.topMargin + yOffset);

  147. break;

  148. case LEFT_BottOM:

  149. animation = new TranslateAnimation(-mlp.leftMargin+xOffset,0F, -yOffset + mlp.bottomMargin,0F);

  150. break;

  151. case RIGHT_BottOM:

  152. animation = new TranslateAnimation(0F,mlp.rightMargin-xOffset, 0F,-yOffset + mlp.bottomMargin);

  153. break;

  154. default:

  155. break;

  156. }

  157. animation.setFillAfter(true);animation.setDuration(duration);

  158. animation.setStartOffset(((group.getChildCount()-i) * 100)

  159. / (-1 + group.getChildCount()));

  160. animation.setInterpolator(new AnticipateInterpolator(2F));

  161. imageview.startAnimation(animation);

  162. }

  163. }

  164. }

第四步:PathTestActivity.java以及用到的布局文件main.xml代码如下:

PathTestActivity.java(基本没修改代码)代码如下:

[java]  view plain copy

  1. package com.tutor.path;

  2. import android.app.Activity;

  3. import android.os.Bundle;

  4. public class PathTestActivity extends Activity {

  5. @Override

  6. public void onCreate(Bundle savedInstanceState) {

  7. super.onCreate(savedInstanceState);

  8. setContentView(R.layout.main);

  9. }

  10. }

main.xml代码如下:

[java]  view plain copy

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

  3. xmlns:tutor=“http://schemas.android.com/apk/res/com.tutor.path”

  4. android:layout_width=“fill_parent”

  5. android:layout_height=“fill_parent”

  6. android:orientation=“vertical” >

  7. <com.tutor.path.PathMenuView

  8. android:id="@+id/text"

  9. android:layout_width=“fill_parent”

  10. android:layout_height=“fill_parent”

  11. tutor:position=“right_bottom”

  12. />

  13.   

最后

下面是辛苦给大家整理的学习路线

  1. android:layout_height=“fill_parent”

  2. android:orientation=“vertical” >

  3. <com.tutor.path.PathMenuView

  4. android:id="@+id/text"

  5. android:layout_width=“fill_parent”

  6. android:layout_height=“fill_parent”

  7. tutor:position=“right_bottom”

  8. />

  9.   

最后

下面是辛苦给大家整理的学习路线

[外链图片转存中…(img-cse5ggaX-1643518121306)]

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

今天关于[android] 界面切换的简单动画安卓页面切换动画的分享就到这里,希望大家有所收获,若想了解更多关于Activity取消界面切换的默认动画方法(推荐)、Android Activity界面切换添加动画特效、Android Flutter实现页面切换转场动画效果、Android Path菜单的简单实现,android开发软件等相关知识,可以在本站进行查询。

本文标签: