本篇文章给大家谈谈[android]界面切换的简单动画,以及安卓页面切换动画的知识点,同时本文还将给你拓展Activity取消界面切换的默认动画方法(推荐)、AndroidActivity界面切换添加
本篇文章给大家谈谈[android] 界面切换的简单动画,以及安卓页面切换动画的知识点,同时本文还将给你拓展Activity取消界面切换的默认动画方法(推荐)、Android Activity界面切换添加动画特效、Android Flutter实现页面切换转场动画效果、Android Path菜单的简单实现,android开发软件等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:- [android] 界面切换的简单动画(安卓页面切换动画)
- Activity取消界面切换的默认动画方法(推荐)
- Android Activity界面切换添加动画特效
- Android Flutter实现页面切换转场动画效果
- Android Path菜单的简单实现,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都默认有切换的动画效果,比如界面从右至左的移动。
但是有些时候我们不需要这个动画,怎么办?
操作方法比较麻烦,这里我推荐其中一种。我这里是要做启动页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 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);
实现zoomin和zoomout,即类似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实现页面切换转场动画效果
前言
写了一篇基础的性能优化的内容,继续我们的动画相关的介绍。今天的主角是英雄 —— 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开发软件
-
mHomeparams.width = LayoutParams.WRAP_CONTENT;
-
mHomeparams.height = LayoutParams.WRAP_CONTENT;
-
switch (position) {
-
case LEFT_TOP:
-
mHomeparams.gravity = Gravity.LEFT | Gravity.TOP;
-
for (int i = 0; i < menuResIds.length; i++) {
-
int width_padding = mWIDTH / ((menuResIds.length - 1) * 2);
-
int height_padding = mHEIGHT / ((menuResIds.length - 1) * 2);
-
ImageView imageView = new ImageView(mContext);
-
imageView.setimageResource(menuResIds[i]);
-
addView(imageView);
-
LayoutParams params = (FrameLayout.LayoutParams) imageView
-
.getLayoutParams();
-
params.width = LayoutParams.WRAP_CONTENT;
-
params.height = LayoutParams.WRAP_CONTENT;
-
params.leftMargin = mWIDTH / 2
-
- ((menuResIds.length - i - 1) * width_padding);
-
params.topMargin = mHEIGHT / 2 - i * height_padding;
-
params.gravity = Gravity.LEFT | Gravity.TOP;
-
imageView.setLayoutParams(params);
-
}
-
break;
-
case RIGHT_TOP:
-
mHomeparams.gravity = Gravity.RIGHT | Gravity.TOP;
-
for (int i = 0; i < menuResIds.length; i++) {
-
int width_padding = mWIDTH / ((menuResIds.length - 1) * 2);
-
int height_padding = mHEIGHT / ((menuResIds.length - 1) * 2);
-
ImageView imageView = new ImageView(mContext);
-
imageView.setimageResource(menuResIds[i]);
-
addView(imageView);
-
LayoutParams params = (FrameLayout.LayoutParams) imageView
-
.getLayoutParams();
-
params.width = LayoutParams.WRAP_CONTENT;
-
params.height = LayoutParams.WRAP_CONTENT;
-
params.rightMargin = mWIDTH / 2
-
- ((menuResIds.length - i - 1) * width_padding);
-
params.topMargin = mHEIGHT / 2 - i * height_padding;
-
params.gravity = Gravity.RIGHT | Gravity.TOP;
-
imageView.setLayoutParams(params);
-
}
-
break;
-
case RIGHT_BottOM:
-
mHomeparams.gravity = Gravity.RIGHT | Gravity.BottOM;
-
for (int i = 0; i < menuResIds.length; i++) {
-
int width_padding = mWIDTH / ((menuResIds.length - 1) * 2);
-
int height_padding = mHEIGHT / ((menuResIds.length - 1) * 2);
-
ImageView imageView = new ImageView(mContext);
-
imageView.setimageResource(menuResIds[i]);
-
addView(imageView);
-
LayoutParams params = (FrameLayout.LayoutParams) imageView
-
.getLayoutParams();
-
params.width = LayoutParams.WRAP_CONTENT;
-
params.height = LayoutParams.WRAP_CONTENT;
-
params.rightMargin = mWIDTH / 2
-
- ((menuResIds.length - i - 1) * width_padding);
-
params.bottomMargin = mHEIGHT / 2 - i * height_padding;
-
params.gravity = Gravity.RIGHT | Gravity.BottOM;
-
imageView.setLayoutParams(params);
-
}
-
break;
-
case LEFT_BottOM:
-
mHomeparams.gravity = Gravity.LEFT | Gravity.BottOM;
-
for(int i = 0; i < menuResIds.length; i++){
-
int width_padding = mWIDTH / ((menuResIds.length - 1) * 2);
-
int height_padding = mHEIGHT / ((menuResIds.length -1) * 2);
-
ImageView imageView = new ImageView(mContext);
-
imageView.setimageResource(menuResIds[i]);
-
addView(imageView);
-
LayoutParams params = (FrameLayout.LayoutParams)imageView.getLayoutParams();
-
params.width = LayoutParams.WRAP_CONTENT;
-
params.height = LayoutParams.WRAP_CONTENT;
-
params.leftMargin = mWIDTH / 2 - ((menuResIds.length - i - 1) * width_padding);
-
params.bottomMargin = mHEIGHT / 2 - i * height_padding;
-
params.gravity = Gravity.LEFT | Gravity.BottOM;
-
imageView.setLayoutParams(params);
-
}
-
break;
-
default:
-
break;
-
}
-
mHome.setLayoutParams(mHomeparams);
-
}
-
private OnClickListener listener = new OnClickListener() {
-
public void onClick(View v) {
-
if (!bMenuShow) {
-
startAnimationIn(PathMenuView.this, 300);
-
} else {
-
startAnimationOut(PathMenuView.this, 300);
-
}
-
bMenuShow = !bMenuShow;
-
}
-
};
-
/**
-
* 菜单隐藏动画.
-
*
-
* @param group
-
* @param duration
-
*/
-
private void startAnimationIn(ViewGroup group, int duration) {
-
for (int i = 1; i < group.getChildCount(); i++) {
-
ImageView imageview = (ImageView) group.getChildAt(i);
-
imageview.setVisibility(0);
-
MarginLayoutParams mlp = (MarginLayoutParams) imageview
-
.getLayoutParams();
-
Animation animation = null;
-
switch (position) {
-
case LEFT_TOP:
-
animation = new TranslateAnimation(0F,-mlp.leftMargin+xOffset,0F,-mlp.topMargin + yOffset);
-
break;
-
case RIGHT_TOP:
-
animation = new TranslateAnimation(mlp.rightMargin - xOffset,0F,-mlp.topMargin + yOffset,0F);
-
break;
-
case LEFT_BottOM:
-
animation = new TranslateAnimation(0F, -mlp.leftMargin+ xOffset, 0F, -yOffset + mlp.bottomMargin);
-
break;
-
case RIGHT_BottOM:
-
animation = new TranslateAnimation(mlp.rightMargin-xOffset,0F,-yOffset + mlp.bottomMargin, 0F);
-
break;
-
default:
-
break;
-
}
-
animation.setFillAfter(true);
-
animation.setDuration(duration);
-
animation.setStartOffset((i * 100) / (-1 + group.getChildCount()));
-
animation.setInterpolator(new OvershootInterpolator(2F));
-
imageview.startAnimation(animation);
-
}
-
}
-
/**
-
* 菜单显示动画.
-
*
-
* @param group
-
* @param duration
-
*/
-
private void startAnimationOut(ViewGroup group,int duration){
-
for (int i = 1; i < group.getChildCount(); i++) {
-
final ImageView imageview = (ImageView) group
-
.getChildAt(i);
-
MarginLayoutParams mlp = (MarginLayoutParams) imageview.getLayoutParams();
-
Animation animation = null;
-
switch (position) {
-
case LEFT_TOP:
-
animation = new TranslateAnimation(-mlp.leftMargin+xOffset,0F,-mlp.topMargin + yOffset,0F);
-
break;
-
case RIGHT_TOP:
-
animation = new TranslateAnimation(0F,mlp.rightMargin - xOffset,0F,-mlp.topMargin + yOffset);
-
break;
-
case LEFT_BottOM:
-
animation = new TranslateAnimation(-mlp.leftMargin+xOffset,0F, -yOffset + mlp.bottomMargin,0F);
-
break;
-
case RIGHT_BottOM:
-
animation = new TranslateAnimation(0F,mlp.rightMargin-xOffset, 0F,-yOffset + mlp.bottomMargin);
-
break;
-
default:
-
break;
-
}
-
animation.setFillAfter(true);animation.setDuration(duration);
-
animation.setStartOffset(((group.getChildCount()-i) * 100)
-
/ (-1 + group.getChildCount()));
-
animation.setInterpolator(new AnticipateInterpolator(2F));
-
imageview.startAnimation(animation);
-
}
-
}
-
}
第四步:PathTestActivity.java以及用到的布局文件main.xml代码如下:
PathTestActivity.java(基本没修改代码)代码如下:
[java] view plain copy
-
package com.tutor.path;
-
import android.app.Activity;
-
import android.os.Bundle;
-
public class PathTestActivity extends Activity {
-
@Override
-
public void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.main);
-
}
-
}
main.xml代码如下:
[java] view plain copy
- <?xml version="1.0" encoding="utf-8"?>
-
<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
-
xmlns:tutor=“http://schemas.android.com/apk/res/com.tutor.path”
-
android:layout_width=“fill_parent”
-
android:layout_height=“fill_parent”
-
android:orientation=“vertical” >
-
<com.tutor.path.PathMenuView
-
android:id="@+id/text"
-
android:layout_width=“fill_parent”
-
android:layout_height=“fill_parent”
-
tutor:position=“right_bottom”
-
/>
最后
下面是辛苦给大家整理的学习路线
-
android:layout_height=“fill_parent”
-
android:orientation=“vertical” >
-
<com.tutor.path.PathMenuView
-
android:id="@+id/text"
-
android:layout_width=“fill_parent”
-
android:layout_height=“fill_parent”
-
tutor:position=“right_bottom”
-
/>
最后
下面是辛苦给大家整理的学习路线
[外链图片转存中…(img-cse5ggaX-1643518121306)]
本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录
今天关于[android] 界面切换的简单动画和安卓页面切换动画的分享就到这里,希望大家有所收获,若想了解更多关于Activity取消界面切换的默认动画方法(推荐)、Android Activity界面切换添加动画特效、Android Flutter实现页面切换转场动画效果、Android Path菜单的简单实现,android开发软件等相关知识,可以在本站进行查询。
本文标签: