Вам нужно будет пометить оба ваши представления с помощью уникального имени перехода.
ViewCompat.setTransitionName(imageView, "some_unique_transitionName");
начать новую активность с помощью этой новой информации
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, imageView, ViewCompat.getTransitionName(imageView));
activity.startActivity(intent, options.toBundle());
Теперь, в новом действии : В зависимости от того, как вы открываете свою следующую активность и насколько сложной является ее иерархия, вы могли бы хотеть использовать supportPostponeEnterTransition();
во время onCreate и supportStartPostponedEnterTransition();
когда-нибудь позже, когда она настроена. Я дам вам прочитать документацию для него
. Помимо этого найдите вид нового действия, которое необходимо анимировать, и установите для него имя перехода
activityImage.setTransitionName(transitionName);
и
Несколько других вещей, которые вы, возможно, захотите поработать, могут быть длительностью анимации, интерполяторами и т. д.
getWindow().getSharedElementEnterTransition().setDuration(200);
getWindow().getSharedElementReturnTransition().setDuration(200)
.setInterpolator(new DecelerateInterpolator());
И переходы входа / выхода для вашей деятельности (вы будете это нужно)
Fade fade = new Fade();
fade.excludeTarget(android.R.id.statusBarBackground, true);
fade.excludeTarget(android.R.id.navigationBarBackground, true);
getWindow().setEnterTransition(fade);
getWindow().setExitTransition(fade);
Помните, что общие переходы элементов пересекают всю иерархию представлений, чтобы узнать исходные и целевые представления, и только после того, как целевая активность полностью заложила обратные преобразования структуры, чтобы дать вам иллюзию вы хотите добиться этого, да, если иерархии представлений сложны или действия требуют времени для настройки и т. д. (зависит от сети), вам может понадобиться немного поработать.
Что-то не так с тем, как вы настраиваете изображение, с которым вы тестируете. Возможно, вы захотите обновить его до того, как команда Rails будет обрабатывать его в своих собственных тестах:
module ActiveStorageHelpers
# ported from https://github.com/rails/rails/blob/5-2-stable/activestorage/test/test_helper.rb#L57
def create_file_blob(filename: "image.jpg", content_type: "image/jpeg", metadata: nil)
ActiveStorage::Blob.create_after_upload! io: file_fixture(filename).open, filename: filename, content_type: content_type, metadata: metadata
end
end
RSpec.configure do |config|
config.include ActiveStorageHelpers
end
Затем поместите крошечный файл изображения в spec/fixtures/file/images.jpg
(вот где метод file_fixture
будет искать его) .
Имея это в виду, вы можете настроить изображение на вашей модели в вашем функциональном тесте с помощью чего-то вроде:
instance_of_model.images.attach(create_file_blob)
Я не уверен, что вы имеете в виду, за исключением того, что происходит после теста?
Тест должен быть, как правило, атомарным и независимым, поэтому все ресурсы, которые вы создаете, должны быть удалены сразу после завершения теста. Кроме того, тесты выполняются в случайном порядке, поэтому тесты, которые зависят друг от друга, иногда не будут выполняться, а иногда нет, в зависимости от порядка выполнения.
Можете ли вы поделиться результатами или тестами, которые не прошли?
Тот факт, что тест пройден, означает, что тест не зависит от того, какое изображение найдено. Неработающая ссылка на изображение, как правило, не приводит к сбою теста, и на самом деле часто авторы тестов даже не удосуживаются предоставить имитированные изображения, потому что это (воспринимается как) слишком много работы и не имеет отношения к тестируемой вещи. .
Смотрите, ребята, вот почему мы просим привести пример . Теперь, когда ОП опубликовал пример , мы можем видеть, что его проблема заключается в кэшировании в браузере, и будет решена заменой
product.images.attach io: File.open(path), filename: 'image.png'
на
product.images.attach io: File.open(path), filename: "image-#{Time.now.strftime("%s%L")}.png"
в помощнике, который делает приложение. Я бы не решил это без примера.
ActiveStorage обрабатывает сохранение и обслуживание файлов. OP сохранял и обслуживал изображения с этим, что определенно предназначалось для этого. Чтобы разные службы могли обслуживать файлы по-разному, ActiveStorage отделяет опубликованный URL-адрес от фактического URL-адреса, обслуживающего изображения.
Опубликованный URL является почти постоянной ссылкой: это закодированная версия ключа базы данных для вложения. ActiveStorage обрабатывает запрос URL-адреса путем поиска места хранения файла и отправки временного перенаправления 302 на URL-адрес, который можно использовать для доступа к файлу, который называется «служебный URL-адрес». При использовании AWS S3 для хранения файлов служебный URL-адрес может быть подписанным URL-адресом, срок действия которого быстро истекает, но, тем не менее, он подключает браузер напрямую к S3, а не через веб-сервер в качестве посредника.
По умолчанию URL-адрес службы действителен в течение 5 минут, и ActiveRecord явно устанавливает
Cache-Control: max-age=300, private
при перенаправлении 302. Браузер кэширует этот ответ на перенаправление, и в течение следующих 5 минут браузер даже не будет пытаться использовать или проверить опубликованный URL-адрес, он немедленно заменит общедоступный URL-адрес на кэшированный URL-адрес службы.
К сожалению, хотя общедоступный URL-адрес предсказуемо воссоздается, URL-адрес службы генерируется случайным образом, поэтому, когда браузер выполняет автоматическое перенаправление, ранее действительный URL-адрес службы больше не работает. Решение (или обходной путь, в зависимости от вашей точки зрения) состоит в том, чтобы различать общедоступные URL-адреса путем добавления метки времени в имени файла, чтобы тесты не использовали повторно общедоступные URL-адреса.
Sidenote
Кстати, вам не следует использовать url_for
с image_tag
. Измените ваш ERB с
= image_tag url_for(product.image.variant(resize: "120x120"))
на
= image_tag(product.image.variant(resize: "120x120"))
Rails достаточно умен, чтобы справиться с любым случаем, но последний способ является рекомендуемым.