После поиска решения в течение полудня без результата, я придумал собственную реализацию. Я использую прозрачную активность с подходящим корневым макетом. Корневая компоновка - это вид, который затем может быть обнаружен с помощью createCircularReveal()
.
Мой код выглядит следующим образом:
Тема Определение в styles.xml
<style name="Theme.Transparent" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowIsTranslucent">true</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
активность Определение в AndroidManifest.xml
<activity
android:name=".ui.CircularRevealActivity"
android:theme="@style/Theme.Transparent"
android:launchMode="singleTask"
/>
я объявил макет моя работа (я выбрал DrawerLayout, так что у меня может быть NavDrawer. Eve раскладка ры должны работать здесь.)
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<FrameLayout
android:id="@+id/root_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/honey_melon"
>
<!-- Insert your actual layout here -->
</FrameLayout>
</android.support.v4.widget.DrawerLayout>
Немаловажным является FrameLayout с идентификатором root_layout
. Эта точка зрения будет раскрыта в этой деятельности.
Наконец я реализовал CircularRevealActivity
и переписал onCreate()
:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
overridePendingTransition(R.anim.do_not_move, R.anim.do_not_move);
setContentView(R.layout.activity_reveal_circular);
if (savedInstanceState == null) {
rootLayout.setVisibility(View.INVISIBLE);
ViewTreeObserver viewTreeObserver = rootLayout.getViewTreeObserver();
if (viewTreeObserver.isAlive()) {
viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
circularRevealActivity();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
rootLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
} else {
rootLayout.getViewTreeObserver().removeOnGlobalLayoutListener(this);
}
}
});
}
}
}
Это было важно, чтобы положить circularRevealActivity()
в OnGlobalLayoutListener
, потому что вид должен быть нарисован для анимации.
circularRevealActivity()
выглядит предложение Ishaan в:
private void circularRevealActivity() {
int cx = rootLayout.getWidth()/2;
int cy = rootLayout.getHeight()/2;
float finalRadius = Math.max(rootLayout.getWidth(), rootLayout.getHeight());
// create the animator for this view (the start radius is zero)
Animator circularReveal = ViewAnimationUtils.createCircularReveal(rootLayout, cx, cy, 0, finalRadius);
circularReveal.setDuration(1000);
// make the view visible and start the animation
rootLayout.setVisibility(View.VISIBLE);
circularReveal.start();
}
Edit 1
было добавлено определение для R.anim.do_not_move
. Тем не менее, он должен работать и без этой строки, если в вашем проекте не указаны переходы по умолчанию для действий. Дайте мне знать,
R.anim.do_not_move:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromYDelta="0"
android:toYDelta="0"
android:duration="@android:integer/config_mediumAnimTime"
/>
</set>
Любые удачи на этом? – StuStirling
Нет. Не активно его искать. –