Подтвердить что ты не робот

Как уменьшить конечную активность до прямоугольника

В моем приложении для Android у меня есть плавающий Activity. Это начало из-за пределов моего приложения, используя ActivityOptions.makeScaleUpAnimation, чтобы увеличить масштаб от "исходного" прямоугольника. Когда мой Activity заканчивается, я бы хотел, чтобы он сделал обратную ссылку на эту анимацию: т.е. Он сжимается обратно к этому прямоугольнику, когда он исчезает.

Я знаю, что могу получить прямоугольник с getIntent().getSourceBounds(), и я надеялся, что смогу использовать overridePendingTransition(), когда вы закончите достигните этого эффекта, но overridePendingTransition() может принимать только фиксированный XML-ресурс: кажется, нет способа заставить эту анимацию зависеть от границ источника. Есть ли что-то еще, что я могу использовать для достижения этого эффекта?

Мое приложение предназначено для API 11+, но поскольку это только косметический эффект, я был бы доволен решением, которое зависит от более поздней версии.

4b9b3361

Ответ 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);

}