Android棒棒糖材质设计列表视图中的活动转换动画
我正在使用主/细节模式,目前正在转向Android棒棒糖。如果我单击ListView中的某个项目,我希望有一个。动画正在工作,但我不知道如何在共享元素(在我的例子中是ImageView)之间制作特定动画 如果单击自定义ListView中的一行(带有图像和文本),则转换应切换到my DetailActivtiy中的图像。在本视频中应该是这样的:或本视频: 我已将此代码添加到两个ImageView中:Android棒棒糖材质设计列表视图中的活动转换动画,android,android-listview,android-5.0-lollipop,material-design,activity-transition,Android,Android Listview,Android 5.0 Lollipop,Material Design,Activity Transition,我正在使用主/细节模式,目前正在转向Android棒棒糖。如果我单击ListView中的某个项目,我希望有一个。动画正在工作,但我不知道如何在共享元素(在我的例子中是ImageView)之间制作特定动画 如果单击自定义ListView中的一行(带有图像和文本),则转换应切换到my DetailActivtiy中的图像。在本视频中应该是这样的:或本视频: 我已将此代码添加到两个ImageView中: <ImageView android:transitionName=
<ImageView
android:transitionName="@string/transition_title_image"/>
使用此方法调用my DetailActivity:
if (Build.VERSION.SDK_INT >= 21) {
Intent intent = new Intent(ArticleListActivity.this, ArticleDetailActivity.class);
intent.putExtra("pos", id);
intent.putExtra("articleList", articleList);
String transitionName = getString(R.string.transition_title_image);
ImageView article_thumb = (ImageView) findViewById(R.id.article_thumb);
ActivityOptionsCompat options =
ActivityOptionsCompat.makeSceneTransitionAnimation(ArticleListActivity.this,
article_thumb, // The view which starts the transition
transitionName // The transitionName of the view we’re transitioning to
);
ActivityCompat.startActivity(ArticleListActivity.this, intent, options.toBundle());
}
@Override
protected void onCreate(Bundle savedInstanceState) {
if (Build.VERSION.SDK_INT >= 21) {
//To enable window content transitions in your code instead, call the Window.requestFeature() method:
getWindow().requestFeature(android.view.Window.FEATURE_CONTENT_TRANSITIONS);
Transition ts_enter = new Slide(); //Slide(); //Explode();
Transition ts_exit = new Explode(); //Slide(); //Explode();
ts_enter.setDuration(2000);
ts_exit.setDuration(2000);
getWindow().setEnterTransition(ts_enter);
getWindow().setExitTransition(ts_exit);
}
super.onCreate(savedInstanceState)
我的活动:
if (Build.VERSION.SDK_INT >= 21) {
Intent intent = new Intent(ArticleListActivity.this, ArticleDetailActivity.class);
intent.putExtra("pos", id);
intent.putExtra("articleList", articleList);
String transitionName = getString(R.string.transition_title_image);
ImageView article_thumb = (ImageView) findViewById(R.id.article_thumb);
ActivityOptionsCompat options =
ActivityOptionsCompat.makeSceneTransitionAnimation(ArticleListActivity.this,
article_thumb, // The view which starts the transition
transitionName // The transitionName of the view we’re transitioning to
);
ActivityCompat.startActivity(ArticleListActivity.this, intent, options.toBundle());
}
@Override
protected void onCreate(Bundle savedInstanceState) {
if (Build.VERSION.SDK_INT >= 21) {
//To enable window content transitions in your code instead, call the Window.requestFeature() method:
getWindow().requestFeature(android.view.Window.FEATURE_CONTENT_TRANSITIONS);
Transition ts_enter = new Slide(); //Slide(); //Explode();
Transition ts_exit = new Explode(); //Slide(); //Explode();
ts_enter.setDuration(2000);
ts_exit.setDuration(2000);
getWindow().setEnterTransition(ts_enter);
getWindow().setExitTransition(ts_exit);
}
super.onCreate(savedInstanceState)
) 试试这个:
ImageView
指定一个唯一的转换名称。如果所有图像视图都具有相同的转换名称,则框架将不知道在动画开始时选择哪一个,并且转换将无法正常运行ImageView
时,将其唯一的转换名称作为Intent
extra传递给详细信息活动onCreate()
方法中,从意图包中检索名称,并将其设置为ImageView
的转换名称好的,但是你没有解释问题是什么。动画现在看起来像什么?出现故障了吗?在您的代码中,您已经使用<代码> SETICANTURSTATION()/<代码>和<代码> SETXITIVITION()/代码>设置内容转换,但是您在哪里设置共享元素转换?如果您在描述您所看到的问题有困难时,您可能需要考虑张贴您自己的应用程序的视频。Android Studio有一个非常有用的视频捕获工具,可能会派上用场。可能有用。只是一个调整:您不应该在intentextra中使用唯一的转换名称。您应该使用“详细信息”活动中使用的转换名称。唯一的名称会自动关联,这样当您返回时,即使重新创建活动,框架也会知道要与共享元素关联的视图。ApiDemos有一个简单的例子应该会有所帮助。@GeorgeMount我不确定我是否完全理解你的意思。“ApiDemos”是指这个示例项目吗@乔治山我找到了阿皮德莫斯。但是,我仍然不明白为什么在这种情况下需要使用
SharedElementCallback
映射共享元素。。。将共享元素传递给Intent
中的被调用活动会有什么问题?您的意思是说,如果系统破坏并重新创建某个活动,是否有可能出现某种与状态丢失相关的错误?我遗漏了什么吗?当您从详细信息活动转到列表活动时,框架必须知道列表活动中的哪个视图作为共享元素。当你“回头”的时候,它可以帮你找到答案,因为你在前进的过程中使用了它。继续进行时,您可能知道列表活动中的特定transitionName,但更有可能的是,您正在共享一个更通用的名称,并且由列表活动分配正确的视图。例如,如果您不在同一个应用程序中,您就无法了解远程应用程序的命名方案(除了商定的共享元素名称)。啊,好吧。。。对于存在于不同应用程序中的活动,这是一个很好的观点。谢谢你把它清理干净!