如何在21之前的设备中实现共享元素转换?我或多或少地遵循了这里的指南http://antonioleiva.com/material-design-everywhere/但我得到的错误就像"属性transitionName仅用于api级别21或更高级别"
android android-activity activity-transition shared-element-transition
Android Lolipop有一个api,允许在不同活动中的共享元素之间轻松转换.
看起来这个api不支持具有多个视图的转换.有没有办法使用相同的API?
编辑
根据@pskink的建议,我使用了不同的方法
ActivityOptions options = ActivityOptions
.makeSceneTransitionAnimation(this, Pair.create((View)view, "viewPager"), Pair.create((View) fab, "fab"));
startActivity(intent, options.toBundle());
Run Code Online (Sandbox Code Playgroud)
这从ActivityA到ActivityB工作正常,但点击后退按钮会导致此堆栈跟踪
A/OpenGLRenderer(17305): requireSurface() called but no surface set!
A/libc(17305): Fatal signal 6 (SIGABRT), code -6 in tid 17349(RenderThread)
Build fingerprint: 'google/hammerhead/hammerhead:5.0/LRX21O/1570415:user/release-keys'
Revision: '11'
ABI: 'arm'
pid: 3364, tid: 3414, name: RenderThread >>> com.example.package <<<
signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
Abort message: 'requireSurface() called but no surface set!'
r0 00000000 r1 00000d56 r2 00000006 r3 00000000
r4 9e9b5db8 r5 …Run Code Online (Sandbox Code Playgroud) 我正在处理两个活动之间的Lollipop过渡.我有一个共享元素,我通过活动A和B的转换动画.在活动B中弹出一个键盘并调整窗口大小.进入活动B时动画看起来很棒.问题是当返回活动时A共享元素转换看起来很糟糕,因为窗口大小仍然基于键盘调整大小的程度(即使键盘在返回时自动最小化) A并且最终窗口的大小正确).
我已经尝试在离开活动B并调用finishAfterTransition之前手动隐藏软输入.不幸没有运气!我也尝试推迟共享元素转换,但这也没有奏效.一个解决方案是在用户按下以完成活动B时有一个微小的延迟(10ms),以便在离开之前给窗口时间调整自己的大小,但这对我来说感觉很糟糕.
任何想法非常感谢!
我们正在尝试进行转换,将一个 Activity 的 TextView 移动到另一个 Activity 的另一个 TextView。常见的令人敬畏的 Android Lollipop 过渡,用于动画共享视图。
在我们的场景中,第一个 TextView 是白色的,第二个是红色的。它也有不同的尺寸。
我们遇到的问题是,如果我们仔细观察动画并使用慢动作动画中的手机,我们可以看到白色 TextView 没有做任何动画。取而代之的是,红色的 TextView 出现在白色的上面,然后动画到最终位置。
我们想要实现的是在白色 TextView 移动到红色时淡出它,并从白色 TextView 淡入红色,同时对其进行动画处理。嗯……你知道的,效果令人难以置信:·)
为了实现它,我们在主题定义中使用转换:
<item name="android:windowSharedElementEnterTransition">@transition/auto_transition</item>
<item name="android:windowSharedElementExitTransition">@transition/auto_transition</item>
Run Code Online (Sandbox Code Playgroud)
并且,在我们的 auto_transition.xml 文件中:
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<autoTransition/>
</transitionSet>
Run Code Online (Sandbox Code Playgroud)
但是,可以肯定的是,这不是 Android 人希望它工作的方式。
如果有人有任何见解,将不胜感激。谢谢!
android-5.0-lollipop activity-transition shared-element-transition
我试图在转换之后在一个TextView和一个EditText´ but when showing the resulting Activity the text in theEditView have been shifted up. See attached pictures. Also, clicking on theEditView` 之间进行Android共享转换,将文本恢复到正确的位置.
首先单击RecylcerView中的任何行:
单元视图,日期TextEdit和名称TextEdit将共享给下一个活动.单元格背景将转换为工具栏.
启动活动单元格布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/adapter_actionlist"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true"
android:background="?android:attr/selectableItemBackground"
android:transitionName="@string/transition_key_action" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="72dp"
>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/adapter_actionList_checkBox"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_marginLeft="12dp"/>
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_alignParentStart="true"
android:layout_marginLeft="72dp"
android:layout_marginRight="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="2"
android:ellipsize="end"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Large Text"
android:id="@+id/adapter_actionlist_toplabel"
android:paddingTop="0dp"
android:paddingBottom="0dp" …Run Code Online (Sandbox Code Playgroud) 我从那里打开一个活动A,然后打开活动B,并将共享元素传递给它。它可以动画化过渡效果,但是当我返回到活动A,然后再次进入活动B时(仍使用
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
Run Code Online (Sandbox Code Playgroud)
共享元素转换未运行。
对于常规动画,您可以在onNewIntent中调用overridePendingTransition()来运行动画。/sf/answers/582896401/
我尝试在那里调用startPostponedEnterTransition(),但是什么也没发生。
这是我的代码,允许过渡
void allowWindowTransitions(){
Window w = getWindow();
w.requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
Run Code Online (Sandbox Code Playgroud)
启动活动的代码
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
ActivityOptionsCompat options = ActivityOptionsCompat.
makeSceneTransitionAnimation(this, sharedElement, "profile");
startActivity(intent, options.toBundle());
Run Code Online (Sandbox Code Playgroud)
我试过弄乱setSharedElementReturnTransition和setSharedElementReenterTransition,但是什么也没发生。
有没有一种方法可以手动触发共享元素转换来解决此问题。
android android-activity android-transitions shared-element-transition
我试图使用共享元素转换在两个屏幕之间设置动画.下面是我的代码的相关部分(可能更多也不相关)但我已经削减了一些以节省空间.
activity_main.xml中:
<android.support.v4.widget.DrawerLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.AppBarLayout ... >
...
</android.support.design.widget.AppBarLayout>
<fragment
android:id="@+id/fragment"
android:name=".MainFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:layout="@layout/fragment_main" />
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.NavigationView ... />
</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)
fragment_main.xml:
<android.support.v7.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="8dp"
android:scrollbars="vertical"
tools:context=".MainFragment"
tools:showIn="@layout/activity_main" />
Run Code Online (Sandbox Code Playgroud)
RecyclerView中的每个项目都包含一个CardView作为根视图:
card_item.xml:
<android.support.v7.widget.CardView
android:id="@+id/card_view"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.google.android.gms.maps.MapView
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="180dp"
map:liteMode="true" />
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/map"
android:transitionName="@string/transition_title" />
<TextView
android:id="@+id/subtitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/job_title"
android:transitionName="@string/transition_rate" />
<TextView
android:id="@+id/description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/job_rate"
android:transitionName="@string/transition_description" />
</RelativeLayout>
</android.support.v7.widget.CardView>
Run Code Online (Sandbox Code Playgroud)
在RecyclerView的ViewHolder中,我设置了onClickListener:
mCardView.setOnClickListener(new View.OnClickListener() {
@Override …Run Code Online (Sandbox Code Playgroud) 我在活动之间和使用API 21的设备上使用共享元素转换,不调用onEnterAnimationComplete()方法.这里说的是它是在api 21中引入的.请注意,该方法适用于Android版本6和7.该问题仅适用于在Android 5上运行的设备.任何想法?
我将从显示事件情况的gif图像开始。
该列表项应该设置为动画头文件。如您所见,当按下“后退”按钮时,标题项目会向下动画,成为列表项目。还有一个问题,这些片段的“活动”父对象也会在渐变过渡之后闪烁,因此,如果您对此有任何想法,我想知道:)
现在,在粘贴代码片段之前对我的代码进行一些解释。这个应用程式可浏览HTML文件的树状结构。小RecyclerView列表项是文档的标题。单击文档时,它会将标题固定在顶部,WebView并显示HTML。只有一个片段,并且在创建新片段时,该片段会创建其自身的另一个实例。该结构有些奇怪,但是后退按钮和堆栈似乎可以正常工作。这段代码在C#中,因为我使用的是Xamarin.Android,但除单击处理外,大多数代码都非常相似。
我可以从我的XML文件开始。布局仍然是WIP,所以我知道它们很凌乱。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/linear_layout_main"
android:background="#ffffff">
<LinearLayout
android:id="@+id/progressLayout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="gone"
android:gravity="center">
<ProgressBar
android:id="@+id/progressbar"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<LinearLayout
android:id="@+id/subroutines_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:background="#ffffff">
<TextView
android:id="@+id/routine_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:padding="5dp"
android:textSize="24sp"
android:visibility="gone"/>
<FrameLayout
android:id="@+id/preview_frame"
android:layout_width ="match_parent"
android:layout_height="150dp"
android:visibility="gone">
<WebView
android:id="@+id/routine_preview"
android:layout_width="match_parent"
android:layout_height="150dp"
android:gravity="center_vertical"
android:padding="5dp"
android:transitionName="webview_preview_transition"
android:scrollbars="none"
android:visibility="gone"/>
<TextView
android:id="@+id/routine_preview_clickable"
android:layout_width="match_parent"
android:layout_height="150dp"
android:gravity="center_vertical"
android:visibility="gone"/>
</FrameLayout>
<TextView
android:id="@+id/preview_separator"
android:layout_width="match_parent"
android:layout_height="1dp"
android:gravity="center_vertical"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:background="@color/material_grey_100"
android:visibility="gone"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/routines_rv"
android:layout_width="match_parent"
android:layout_height="match_parent" …Run Code Online (Sandbox Code Playgroud) android android-animation xamarin.android android-transitions shared-element-transition
实现了活动共享元素转换的活动.它工作正常,但在极少数运行> = LOLLIPOP的设备上接收崩溃.
报告:
Fatal Exception: java.lang.IllegalArgumentException
at android.os.Parcel.readException(Parcel.java:1550)
at android.os.Parcel.readException(Parcel.java:1499)
at android.app.ActivityManagerProxy.isTopOfTask(ActivityManagerNative.java:4654)
at android.app.Activity.isTopOfTask(Activity.java:5557)
at android.app.Activity.startActivityForResult(Activity.java:3903)
at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:65)
at android.app.Activity.startActivity(Activity.java:4146)
at com.mypackage.Activity1.method1(Activity1.java:414).
Run Code Online (Sandbox Code Playgroud)
试过这个:
Intent intent = new Intent(Activity1.this, Activity2.class);
ActivityOptionsCompat options = ActivityOptionsCompat.
makeSceneTransitionAnimation(Activity1.this,
logoImageView,
ViewCompat.getTransitionName(logoImageView));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
startActivity(intent, options.toBundle());
} else {
startActivity(intent);
}
overridePendingTransition(R.anim.stay, R.anim.stay);
Run Code Online (Sandbox Code Playgroud)
那么这个来自ActivityManagerProxy中的 sof IllegalArgumentException:
Intent intent = new Intent(Activity1.this, Activity2.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
ActivityOptions options = ActivityOptions
.makeSceneTransitionAnimation(Activity1.this,
logoImageView,
getString(R.string.splashLogoSharedTransition));
startActivity(intent, options.toBundle());
} else …Run Code Online (Sandbox Code Playgroud) animation android android-activity shared-element-transition