Если вы делаете заметку каждый раз, когда один из ваших интервалов ввода открывается или закрывается, вы можете делать то, что хотите, объединяя ключи opens
и closes
, сортировать в упорядоченный набор, «Хорошо, допустим, допустим, что каждая смежная пара чисел образует интервал, тогда я могу сосредоточить всю свою логику на этих интервалах как дискретные куски».
myRange = range(201)
intervals = [(1,5), (2,8), (9,12), (20,30)]
opens = {}
closes = {}
def open(index):
if index not in opens:
opens[index] = 0
opens[index] += 1
def close(index):
if index not in closes:
closes[index] = 0
closes[index] += 1
for start, end in intervals:
if end > start: # Making sure to exclude empty intervals, which can be problematic later
open(start)
close(end)
# Sort all the interval-endpoints that we really need to look at
oset = {0:None, 200:None}
for k in opens.keys():
oset[k] = None
for k in closes.keys():
oset[k] = None
relevant_indices = sorted(oset.keys())
# Find the clear ranges
state = 0
results = []
for i in range(len(relevant_indices) - 1):
start = relevant_indices[i]
end = relevant_indices[i+1]
start_state = state
if start in opens:
start_state += opens[start]
if start in closes:
start_state -= closes[start]
end_state = start_state
if end in opens:
end_state += opens[end]
if end in closes:
end_state -= closes[end]
state = end_state
if start_state == 0:
result_start = start
result_end = end
results.append((result_start, result_end))
for start, end in results:
print(str(start) + " " + str(end))
Эти выходы :
0 1
8 9
12 20
30 200
Интервалы не нужно сортировать.
Вам нужно будет пометить оба ваши представления с помощью уникального имени перехода.
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);
Помните, что общие переходы элементов пересекают всю иерархию представлений, чтобы узнать исходные и целевые представления, и только после того, как целевая активность полностью заложила обратные преобразования структуры, чтобы дать вам иллюзию вы хотите добиться этого, да, если иерархии представлений сложны или действия требуют времени для настройки и т. д. (зависит от сети), вам может понадобиться немного поработать.