Как уменьшить конечную активность до прямоугольника
В моем приложении для Android у меня есть плавающий Activity
. Это начало из-за пределов моего приложения, используя ActivityOptions.makeScaleUpAnimation
, чтобы увеличить масштаб от "исходного" прямоугольника. Когда мой Activity
заканчивается, я бы хотел, чтобы он сделал обратную ссылку на эту анимацию: т.е. Он сжимается обратно к этому прямоугольнику, когда он исчезает.
Я знаю, что могу получить прямоугольник с getIntent().getSourceBounds()
, и я надеялся, что смогу использовать overridePendingTransition()
, когда вы закончите достигните этого эффекта, но overridePendingTransition()
может принимать только фиксированный XML-ресурс: кажется, нет способа заставить эту анимацию зависеть от границ источника. Есть ли что-то еще, что я могу использовать для достижения этого эффекта?
Мое приложение предназначено для API 11+, но поскольку это только косметический эффект, я был бы доволен решением, которое зависит от более поздней версии.
Ответы
Ответ 1
Я не думаю, что есть способ уменьшить масштаб окна активности, кроме вызова overridePendingTransition. Однако этот код может помочь:
Масштабирование
ActivityOptions opts = ActivityOptions.makeCustomAnimation(getActivity(), R.anim.scale_up, 0);
startActivity (новый Intent (этот, SecondActivity.class), opts.toBundle());
Вот файл анимации scale_up:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:fromXScale="0"
android:toXScale="1.0"
android:fromYScale="0"
android:toYScale="1.0"
android:pivotX="50%p"
android:pivotY="50%p"
android:duration="500"/>
</set>
Уменьшить масштаб
Вызвать этот код из текущей активности:
finish();
overridePendingTransition(0, R.anim.scale_down);
Вот анимационный файл scale_down:
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:fromXScale="1.0"
android:toXScale="0"
android:fromYScale="1.0"
android:toYScale="0"
android:pivotX="50%p"
android:pivotY="50%p"
android:duration="250"/>
</set>
Вы можете изменить масштаб X и Y, чтобы получить желаемый прямоугольник. Надеюсь, это поможет.
Ответ 2
Основываясь на моем последнем комментарии, вот решение, которое я пробовал, и он работает. Возможно, вам придется изменить в соответствии с вашими требованиями.
Реализовать действие с прозрачным фоном и без заголовка внутри манифеста:
<activity
android:name="com.example.backgroundsensor.AnimatedActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:label="Animated activity" />
и пусть он настроит представление содержимого с макетом как:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
tools:ignore="MergeRootFrame" >
<View
android:id="@+id/visibleAreaView"
android:layout_width="300dp"
android:layout_height="300dp"
android:layout_gravity="center"
android:background="@android:color/holo_green_dark" />
</FrameLayout>
ВидимыйAreaView - тот, который вы увидите на экране, так как активность прозрачна. Вы можете установить границы вида в OnCreate для activity().
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.animated_activity);
// set the bounds of the animateView
}
Кроме того, переопределите метод завершения примерно так:
boolean animateFirst=true;
@Override
public void finish() {
if(animateFirst)
{
animateFirst = false;
loadAnim();
}else
{
super.finish();
}
}
public void loadAnim() {
View v = findViewById(R.id.animateView);
float x= v.getX() + v.getRight()/2;
float y = v.getY();
anim = new ScaleAnimation(1.0f, 0.0f,1.0f, 0.0f, x, y);
anim.setDuration(300);
anim.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationRepeat(Animation animation) {
// TODO Auto-generated method stub
}
@Override
public void onAnimationEnd(Animation animation) {
findViewById(R.id.animateView).setVisibility(View.GONE);
AnimatedActivity.this.finish();
}
});
v.startAnimation(anim);
}