依照https://developer.android.com/training/material/animations.html
ViewAnimationUtils.createCircularReveal()方法使您能够
设置剪切圆的动画以显示或隐藏视图要使用此效果显示以前不可见的视图,请执行以下操作:
//以前不可见的视图 View myView=findviewbyd(R.id.my\u视图); //获取剪切圆的中心 intcx=(myView.getLeft()+myView.getRight())/2; int cy=(myView.getTop()+myView.getBottom())/2; //获取最终圆的剪裁半径 int finalRadius=Math.max(myView.getWidth(),myView.getHeight()); //为此视图创建动画制作程序(开始半径为零) 动画师= ViewAnimationUtils.createCircularVeal(myView,cx,cy,0,finalRadius); //使视图可见并启动动画 设置可见性(View.VISIBLE); anim.start();
这是为了展示一种观点。我如何使用它来循环显示整个活动,而不使用任何共享元素
具体来说,我希望我的searchActivity从工具栏中的SearchAction按钮循环显示
在寻找了半天没有结果的解决方案之后,我想出了一个自己的实现。我正在使用具有匹配根布局的透明活动。
根布局是一个视图,可以使用createCircularReveal()显示该视图
我的代码如下所示:
style.xml中的主题定义
<;style name=“Theme.Transparent”parent=“Theme.AppCompat.Light.NoActionBar”>;
<;item name=“android:windowIsTranslucent”>;正确</项目>;
<;item name=“android:statusBarColor”&[email protected]安卓:彩色/透明</项目>;
<;item name=“android:windowBackground”&[email protected]安卓:彩色/透明</项目>;
</风格>;
AndroidManifest.xml中的活动定义
<;活动
android:name=“.ui.circularrevelactivity”
android:theme=“@style/theme.Transparent”
android:launchMode=“singleTask”
/&燃气轮机;
然后我为我的活动声明了一个布局(我选择了DrawerLayout,这样我就可以拥有一个NavDrawer。每个布局都应该在这里工作。)
<;android.support.v4.widget.DrawerLayout
android:id=“@+id/drawer\u布局”
xmlns:android=”http://schemas.android.com/apk/res/android"
android:layout\u width=“匹配父项”
android:layout\u height=“match\u parent”
&燃气轮机;
<;框架布局
android:id=“@+id/root\u布局”
android:layout\u width=“匹配父项”
android:layout\u height=“match\u parent”
android:background=“@color/huney\u humber”
&燃气轮机;
<;!--在此处插入实际布局-->;
</框架布局>;
</android.support.v4.widget.DrawerLayout>;
重要的是id为根布局的FrameLayout。此视图将在活动中显示
最后,我实现了CircularRevealActivity并重写了onCreate():
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
重写转换(R.anim.do\u not\u move,R.anim.do\u not\u move);
setContentView(R.layout.activity\u reveal\u circular);
如果(savedInstanceState==null){
rootLayout.setVisibility(View.INVISIBLE);
ViewTreeObserver ViewTreeObserver=rootLayout.getViewTreeObserver();
if(viewTreeObserver.isAlive()){
viewTreeObserver.addOnGlobalLayoutListener(新viewTreeObserver.OnGlobalLayoutListener(){
@凌驾
公共图书馆{
循环相关性();
if(Build.VERSION.SDK\u INT<;Build.VERSION\u code.JELLY\u BEAN){
rootLayout.getViewTreeObserver().RemoveGlobalOnlyOutliner(此文件);
}否则{
getViewTreeObserver().removeOnGlobalLayoutListener(此);
}
}
});
}
}
}
将circularRevealActivity()放入OnGlobalLayoutListener中非常重要,因为需要为动画绘制视图
circularrevelactivity()看起来像伊莎恩的提议:
私有无效循环有效性(){
int cx=rootLayout.getWidth()/2;
int cy=rootLayout.getHeight()/2;
float finalRadius=Math.max(rootLayout.getWidth(),rootLayout.getHeight());
//为此视图创建动画制作程序(开始半径为零)
Animator CircularVeal=ViewAnimationUtils.createCircularVeal(rootLayout,cx,cy,0,finalRadius);
循环最小设定持续时间(1000);
//使视图可见并启动动画
setVisibility(View.VISIBLE);
circularReveal.start();
}
编辑1
添加了R.anim.do\u not\u move的定义。但是,如果您的设计没有为活动指定默认转换,那么在没有该行的情况下它也应该可以工作。让我知道
R.anim.请勿移动:
<;设置xmlns:android=”http://schemas.android.com/apk/res/android“>;
<;翻译
android:fromYDelta=“0”
android:toYDelta=“0”
android:duration=“@android:integer/config\u mediumAnimTime”
/&燃气轮机;
</设置>;