精华内容
下载资源
问答
  • 我用的是add进行跳转的,为了防止重复加载问题。 transaction.setCustomAnimations(R...我是这样设置add跳转的动画,是可以的,但是我通过getFragmentManager().popBackStack();的时候却没有动画,不知道是怎么回事呢?
  • 最近再做一个功能,需求是: 当用户账号在异地登录,不管用户在哪个页面,都要去打开登录界面,要求登录成功或者返回不登录,都要回到MainActivity,其余的页面全部再后台... <activity android:name=".Activity.MainActivit

    最近再做一个功能,需求是:

        当用户账号在异地登录,不管用户在哪个页面,都要去打开登录界面,要求登录成功或者返回不登录,都要回到MainActivity,其余的页面全部再后台关闭.
    

    实现步骤如下:

    1.把MainActivity页面在单独的任务栈中放置,代码如下:

        在配置清单文件中:
    
          <activity android:name=".Activity.MainActivity" android:launchMode="singleInstance"/>
    
    如不懂Activity四种启动模式的,先去百度一下,网上有很多详细的讲解;这个时候我们的app就有两个任务栈,而且MianActivity任务栈在单独的一个任务栈中,
    
    

    2.当跳转到登录界面的时候,我们去清空之前的任务栈,这个时候登录的页面也在一个任务栈中,这个时候,就是连个页面连个任务栈

    代码:

    Intent intent2 = new Intent(act, LoginActivity.class);
    //表示清空之间任务栈中所有的页面,重新创建一个任务栈,放入登录页面
    intent2.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK);
    
    act.startActivity(intent2);
    

    这个时候就完成了;

    但是,测试却发现,android默认情况同一个任务站页面切换动画和不同任务栈页面切换动画竟然是不一样的;

    刚开始感到很奇怪,仔细细想,一个app默认只有一个任务栈,不同任务栈之间页面切换,默认就是不同app之间页面切换,(我们都知道隐式意图可以实现不同app页面切换),动画不一样才是Google的良苦用心,

    但是我们是一个app,不能让用户有两个app切换的感觉,既然google提供了使用Theme来配置全局动画,那么猜想一定有设置不同任务栈之间页面之间切换的动画,立马在主题页面试一番,当看到Task…这个单词时候,潸然泪下;接下来就是屡起袖子:干!

    进入今天的主题,要不然就跑题了!

    一.通过主题去设置同一个栈之间页面切换动画,不了解的可以去参考鸿洋这篇博客

    1 . 在项目res目录下新建anim文件夹,里边放的都是动画,写入4个动画 in_from_right.xml ; in_from_right_close.xml ; out_to_left.xml ,out_to_left_colse.xml ;具体代码如下:和Android默认的动画一致

    in_from_right.xml代码

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/accelerate_interpolator">
        <translate
            android:duration="300"
            android:fromXDelta="100%p"
            android:toXDelta="0%p" />
    </set>

    in_from_right_close.xml 代码

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/accelerate_interpolator">
        <translate
            android:duration="300"
            android:fromXDelta="-100%p"
            android:toXDelta="0%p" />
    </set>

    out_to_left.xml 代码:

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/accelerate_interpolator">
        <translate
            android:duration="300"
            android:fromXDelta="0%p"
            android:toXDelta="-100%p" />
    </set>

    out_to_left_colse.xml 代码:

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:interpolator="@android:anim/accelerate_interpolator">
        <translate
            android:duration="300"
            android:fromXDelta="0%p"
            android:toXDelta="100%p" />
    </set>

    2 . 在values文件夹下,Style文件中写入如下代码:

      <style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
            <!--自定义页面切换动画-->
          <itemname="android:windowAnimationStyle">@style/fade</item>
        </style>
    @style/fade代码
    
    <style name="fade" parent="@android:style/Animation.Activity">
    
            <item name="android:activityOpenEnterAnimation">@anim/in_from_right</item>
    
            <item name="android:activityOpenExitAnimation">@anim/out_to_left</item>
    
            <item name="android:activityCloseEnterAnimation">@anim/in_from_right_close</item>
    
            <item name="android:activityCloseExitAnimation">@anim/out_to_left_colse</item>
    
        </style>
    

    3 . 最后在清单文件中引入我们自定义的主题,

    以上就算完成了通过主题配置同一个任务栈之间页面切换动画

    二. 通过主题去设置不同Task页面之间的动画切换,具体属性去参考pi9nc博客

    不同栈之间的动画切换,只需要在上边2步骤中加入下边4个属性,即可设置完成不同任务栈之间页面动画切换的设置:

    
            <item name="android:taskOpenEnterAnimation">@anim/in_from_right</item>
    
            <item name="android:taskOpenExitAnimation">@anim/out_to_left</item>
    
            <item name="android:taskCloseEnterAnimation">@anim/in_from_right_close</item>
    
            <item name="android:taskCloseExitAnimation">@anim/out_to_left_colse</item>

    至此感谢,鸿洋这篇博客,pi9nc博客对我提供的参考.希望对后来人提供一些帮助!

    展开全文
  • android.view.animation.Animation.start::: 其中有括号的类是匿名类。

    安卓视图类可以直接设置下面的动画,其中有括号的类是匿名类。
    在这里插入图片描述

    动画想要动起来,需要两个函数

    一个函数根据当前的时间实现每帧动画的绘制(更新点),另一个函数实现递归功能,周期的(有规律的)调用绘制函数,并在动画结束时终止递归。

    递归函数本身不具有周期定时功能,在 android 中,定时执行的功能有两种实现,一种是Handler方式(安卓底朝天—— android.os.Handler.post::Runnable: 的调用栈),一种是 Choreographer 方式(安卓底朝天 —— android.view.Choreographer.postCallback::int,Runnable,Object: 的调用栈)。Handler 方式可以让一个回调函数在任意时间点执行,也可以让一个回调函数在任意时间段后执行,而 Choreographer 可以让一个函数在屏幕刷新的时候执行,由于屏幕刷新是周期性的,因此 Choreographer 可以让一个回调函数被周期性的调用。而动画绘制函数就是通过 Choreographer 被周期性的调用

    动画 android.animation.ValueAnimator 的更新点是:

    android.animation.ValueAnimator.AnimatorUpdateListener.onAnimationUpdate::ValueAnimator:,递归点是在函数 android.view.Choreographer.FrameCallback(android.animation.AnimationHandler.mFrameCallback).doFrame::long: 中调用了 android.view.Choreographer.postFrameCallback::FrameCallback:。关于这个动画可以看 安卓底朝天 —— android.animation.ValueAnimator.start:: 的调用栈

    这篇我们看的是 android.view.animation.Animation 的更新点和递归点

    提前剧透:更新点是函数 android.view.animation.Animation.applyTransformation::float,Transformation:,递归点是在函数 android.view.View.draw::Canvas,ViewGroup,long: 中调用函数 android.view.View.invalidate::boolean:。

    android.view.animation.Animation 不直接通过通过 Choreographer 类实现周期性的递归,而是通过视图周期性的重绘实现自己的周期性递归,而视图周期性的重绘也是通过 Choreographer 类实现的。
    在这里插入图片描述
    android.view.View.startAnimation::Animation: 函数只是:1. 给动画设置了时间(时间一般是设置为现在),2. 给视图设置了动画,3. 最后重绘视图。我们看看设置时间的函数的源码,一会儿会用到(主要是记住属性 android.view.animation.Animation.mStartTime ):

        /**
         * When this animation should start. When the start time is set to
         * {@link #START_ON_FIRST_FRAME}, the animation will start the first time
         * {@link #getTransformation(long, Transformation)} is invoked. The time passed
         * to this method should be obtained by calling
         * {@link AnimationUtils#currentAnimationTimeMillis()} instead of
         * {@link System#currentTimeMillis()}.
         *
         * @param startTimeMillis the start time in milliseconds
         */
        public void setStartTime(long startTimeMillis) {
            mStartTime = startTimeMillis;
            mStarted = mEnded = false;
            mCycleFlip = false;
            mRepeated = 0;
            mMore = true;
        }
    

    设置时间与设置动画这两个动作并没有直接导致动画的开始,能让动画开始的是视图的重绘(invalidate)。

    下面是动画更新点与递归点在函数调用树中的位置。
    在这里插入图片描述
    递归点 invalidate 函数的调用是有条件的:

    
        /**
         * This method is called by ViewGroup.drawChild() to have each child view draw itself.
         *
         * This is where the View specializes rendering behavior based on layer type,
         * and hardware acceleration.
         */
        boolean draw(Canvas canvas, ViewGroup parent, long drawingTime) {
        。。。。。。
           // to call invalidate() successfully when doing animations
        。。。。。。
                if (more && hardwareAcceleratedCanvas) {
                if (a.hasAlpha() && (mPrivateFlags & PFLAG_ALPHA_SET) == PFLAG_ALPHA_SET) {
                    // alpha animations should cause the child to recreate its display list
                    invalidate(true);                        //   递归点
                }
            }
            。。。。。。
    

    看看这个递归点的条件

    在这里插入图片描述
    局部变量 more 的含义是是否有更多的动画(more animation)没有完成,它由函数 android.view.animation.Animation.getTransformation::long,Transformation: 根据当前时间、动画开始时间、动画持续时间计算得到:
    在这里插入图片描述
    现在再看更新点函数 android.view.animation.Animation.applyTransformation::float,Transformation: :

        /**
         * Helper for getTransformation. Subclasses should implement this to apply
         * their transforms given an interpolation value.  Implementations of this
         * method should always replace the specified Transformation or document
         * they are doing otherwise.
         * 
         * @param interpolatedTime The value of the normalized time (0.0 to 1.0)
         *        after it has been run through the interpolation function.
         * @param t The Transformation object to fill in with the current
         *        transforms.
         */
        protected void applyTransformation(float interpolatedTime, Transformation t) {
        }
    

    Animation 类中没有实现这个更新点函数,这个函数在子类中实现


    在这里插入图片描述

    展开全文
  • Android Fragment切换动画

    千次阅读 2015-11-27 18:45:43
    Fragment的基本用法大家应该都很熟悉了,下面记录下小白今天用到Fragment的一点...2,show(),hide()时,就是在BackStackRecord里面去选择目标fragment 放到栈顶,所有已经add到这个里面的fragment此时其实都是onResume

    Fragment的基本用法大家应该都很熟悉了,下面记录下小白今天用到Fragment的一点小技巧;

    一,Fragment几个重要的方法:

    1,add(),replace()时,会执行fragment的生命周期

    2,show(),hide()时,就是在BackStackRecord里面去选择目标fragment 放到栈顶,所有已经add到这个栈里面的fragment此时其实都是onResume()的,不会影响生命周期,

     如果要想在我们理解的onResume()时去做一些操作,那么就在复写onHiddenChanged(boolean hidden)方法,因为show(),hide()方法都会回调这个方法。


    二,在同一个Activity 中,标签项的Fragment切换动画

      如果Fragment不是用ViewPager来加载,而是用FrameLayout

    这时要想为其加上切换动画的话,就可以直接用FragmentManager里面的抽象方法

    首先获取FragmentManager对像,通过FragmentManager对象来获取FragmentTransaction超类,

    关键代码如下:

    getSupportFragmentManager().beginTransaction()
            .setCustomAnimations(R.anim.push_in_right,R.anim.push_out_left)
            .show(mDiscoverFragment).hide(mHomeFragment)
            .commit();
    注意:一定要在show(),hide()前设置,
    看源码:
    public FragmentTransaction show(Fragment fragment) {
        BackStackRecord.Op op = new BackStackRecord.Op();
        op.cmd = 5;
        op.fragment = fragment;
        this.addOp(op);
        return this;
    }
    
    void addOp(BackStackRecord.Op op) {
        if(this.mHead == null) {
            this.mHead = this.mTail = op;
        } else {
            op.prev = this.mTail;
            this.mTail.next = op;
            this.mTail = op;
        }
    
        op.enterAnim = this.mEnterAnim;
        op.exitAnim = this.mExitAnim;
        op.popEnterAnim = this.mPopEnterAnim;
        op.popExitAnim = this.mPopExitAnim;
        ++this.mNumOp;
    }
    
    以上,只要这样简单的一句,fragment切换时的水平动画效果就出来了。自己快去试试吧,

    展开全文
  • Android浏览书籍的层叠翻页动画效果。用于演示手机阅读电子书的平滑翻页,另外说明了PDF文件渲染器PdfRenderer和视图StackView的使用方法。
  • windowAnimationStyle是通过task的插入和弹出执行的, 如果添加了类似如下intent标识符: intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); 这时会导致activity动画错乱. ...

    打开res/styles.xml:

    windowAnimationStyle是通过task栈的插入和弹出执行的,

    如果添加了类似如下intent标识符:

    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);

    这时会导致activity动画错乱.

    解决办法:

    //定义跳转动画,需要在startActivity后调用
    ((Activity) context).overridePendingTransition(R.anim.open_enter,R.anim.open_exit);

     

    具体的动画细节可以发挥自己的想象~

    这里给出我的:

     

    展开全文
  • 开头 中国互联网发展的这些年,如今90后程序员是中国程序员的主力军,互联网的热潮也让一批批00后蠢蠢欲动,尝试涌入互联网圈。 当程序员容易,当一个优秀的程序员需要不断学习,从...1、Android属性动画实现原理 2、
  • 前言 下面的题目都是楼主在Android交流群大家在面试字节跳动时遇到的,如果大家有好的题目或者...、Android 事件分发机制、 Binder、Android 高级必备 :AMS,WMS,PMS、Glide、 Android 组件化与插件化等面试题和技术
  • 前言 下面的题目都是楼主在Android交流群大家在面试字节跳动时遇到的,如果大家有好的题目或者...、Android 事件分发机制、 Binder、Android 高级必备 :AMS,WMS,PMS、Glide、 Android 组件化与插件化等面试题和技术
  • 前言 如果你也学习Android,那么你大概率会看过我的文章。经常有读者给我留言:“该怎么学习Android?...Navigation:一个用于管理Fragment切换的工具类,可视化、可绑定控件、支持动画等是其优点。 Data Bin
  • 这里有很多自定义view可以参考思路思路比较简单,整个view无非两样东西云雨滴这里又包含两部分动画,一部分是云的左右移动动画,一部分是雨滴移动动画 那我们这里可以自定义一些属性,如果对自定义属性还不太了解的...
  • Set a custom style resource that will be used for resolving transit animations....主activity布局文件:android:orientation="vertical" android:padding="4dip"android:gravity="center_horizontal"android:l...
  • Android群英传

    2018-08-14 11:08:11
    讲解了Android体系与系统架构、Android开发工具新接触、Android控件架构与自定义控件详解、ListView使用技巧、Android Scroll分析、Android绘图机制与处理技巧、Android动画机制与使用技巧、Activity与Activity调用...
  • 安卓开发技术

    千次阅读 2020-06-20 22:14:41
    安卓开发技术 主要从安卓开发基础和进阶两方面论述 基础 Java基础 符号集、数据类型、常量、变量、表达式语句 继承、多态,序列化 Android基础 四大组件及其生命周期 Activity Service Broadcast Receiver Content...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 160
精华内容 64
关键字:

android栈动画