Android关于Activity切换效果的实现加强
jopen
13年前
<p>早前做完一个应用后期需要加入点效果化。</p> <p>相对于iPhone上应用的效果,最为经典的界面切换视觉效果就是,放大进入和缩小退出。</p> <p>还好Android也早以有了这样对应的动画文件。</p> <p>并且如大家所知的,提供了</p> <p>overridePendingTransition()这个</p> <p>最简单实现的方法api.</p> <p>------------------------</p> <p>但是如网上所说的:</p> <p>这里需要特别说明的是,关于overridePendingTransition这个函数,有两点需要主意:<br /> 1.它必需紧挨着startActivity()或者finish()函数之后调用<br /> 2.它只在android2.0以及以上版本上适用</p> <p>----------------------------------------</p> <p>第二点不提了。</p> <p>提下第一点,该方法必须在以上两个函数之后调用。</p> <p>简单说就是 A ——> B切换</p> <p>我们可以在A是startActivity方法后执行。那我A进来的时候呢?</p> <p>比如A为入口Activity。</p> <p>当然目前的应用可以很简单的解决这个视觉上的问题,因为一般应用进入都做了log或是过渡的Activity。</p> <p>问题1也基本算解决了。</p> <p>但是感觉每次都在start或是finish方法后写下这代码挺麻烦的</p> <p>于是我试着把overridePendingTransition写在基类的oncreate中。</p> <p></p> <pre class="brush:xml; toolbar: true; auto-links: false;">/** * @author Nono * */ public abstract class BaseActivity extends Activity { public TextView titleView; @Override protected void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); super.onCreate(savedInstanceState); overridePendingTransition(R.anim.zoomin, R.anim.zoomout); }</pre> <br /> 发现也行的。。猜测这个方法背后发生了什么。 <p></p> <p>然后蛋疼的去看了下Activity中overridePendingTransition()方法,</p> <p style="text-align:left;">然后引出:ActivityManagerNative,ActivityManagerProxy等等各个无语凝噎的名词。</p> <p style="text-align:left;">引出ActivityManager框架。FrameWork层次东西了,有兴趣的可以google研究下。</p> <p style="text-align:left;"></p> <p style="text-align:left;">提下切换效果的另一种玩法。</p> <p style="text-align:left;">style文件。</p> <p style="text-align:left;">上面这个方式看似能很好的解决了切换这个问题。</p> <p style="text-align:left;">但是仔细一看却发现,只存在两种状态下,startActivity,开启时和 finish,结束时。</p> <p style="text-align:left;">一开始我考虑到activity单例以及不销毁问题。也就是不finish的时候。</p> <p style="text-align:left;">悲剧了效果代码没地方写了。</p> <p style="text-align:left;">简单举例:比如tabLayout布局式的。一个tabHost容器中有4个Activity,一般来说tag切换时,我们是不调用finish,而只是执行onStop,甚至上次我打</p> <p style="text-align:left;">log时发现居然只是onPasue()(这个问题比较诡异了,暂且不理它)。</p> <p style="text-align:left;">最后发现activity中Style下的一个android:windowAnimationStyle属性。</p> <p style="text-align:left;"></p> <p style="text-align:left;"></p> <pre class="brush:xml; toolbar: true; auto-links: false;"><style name="activty_fade_in_fade_out"> <item name="@android:activityOpenEnterAnimation">@anim/fade_in</item> <item name="@android:activityOpenExitAnimation">@anim/fade_out</item> <item name="@android:activityCloseEnterAnimation">@anim/fade_in</item> <item name="@android:activityCloseExitAnimation">@anim/fade_out</item> </style></pre> <br /> <pre class="brush:xml; toolbar: true; auto-links: false;"><style name="register_activity" parent="XTheme"> <item name="@android:windowAnimationStyle">@style/activty_bottom_in_top_out</item> </style></pre> <p></p> <p style="text-align:left;"></p> <pre class="brush:xml; toolbar: true; auto-links: false;"><activity android:name=".activity.LoginActivity" android:screenOrientation="portrait" android:theme="@style/In_Out_theme"/></pre> <br /> 以上只是style中item可以有更多选择,就刚好解决了上面提到的问题。 <p></p> <p style="text-align:left;"><span style="font-family:Arial;color:#333333;"><span style="line-height:26px;font-size:14px;">参数更多查看文档</span></span></p> <p style="text-align:left;"><span style="font-family:Arial;color:#333333;"><span style="line-height:26px;font-size:14px;"><a href="/misc/goto?guid=4959517964366765911" target="_blank">http://developer.android.com/reference/android/R.styleable.html#WindowAnimation</a><br /> </span></span></p> <p style="text-align:left;"><span style="font-family:Arial;color:#333333;"><br /> </span></p> <p style="text-align:left;"><span style="font-family:Arial;color:#333333;">顺带提下界面中View的效果,同样的可以自定义动画。</span></p> <p style="text-align:left;"><span style="font-family:Arial;color:#333333;">以及在布局文件中的</span></p> <p style="text-align:left;"><span style="font-family:Arial;color:#333333;">android:layoutAnimation中定义动画效果。<br /> </span></p> <p style="text-align:left;"><span style="font-family:Arial;color:#333333;"><br /> </span></p>