Android轉場效果實現(xiàn)示例淺析
前言
又沒什么好的思路,還是隨便寫一些,所以這次就來整點活。
我們都知道Activity的跳轉擁有默認的跳轉動畫,或者把這個默認的動畫給取消,就會讓跳轉的效果讓人覺得比較生硬。那我們能不能做出一些比較好的轉場效果呢?本篇只介紹實現(xiàn)的思路,而不去深究某個思路的具體實現(xiàn),因為有些知識點內容太多了,如果深入去看怕是很難一時半會講明白。
Activity跳轉動畫
Activity是可以設置跳轉動畫的,有了動畫之后,跳轉的效果的體驗就會比之前好一些。
我這里先寫兩個動畫,跳轉時新頁面進入的動畫
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="100%"
android:toXDelta="0%"
android:fromYDelta="0%"
android:toYDelta="0%"
android:duration="1000"/>
</set>
和舊頁面退出的動畫
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0%"
android:toXDelta="-100%"
android:fromYDelta="0%"
android:toYDelta="0%"
android:duration="1000"/>
</set>
然后在跳轉時調用方法
Intent intent = new Intent(TwoActivity.this, ThreeActivity.class); startActivity(intent); overridePendingTransition(R.anim.activity_start,R.anim.activity_end);
這樣就能實現(xiàn)頁面切換時的動畫效果,但是要有一點需要注意,這個動畫一定要合理,因為是動畫展示完之后第二個頁面才展示,如果你動畫的邏輯涉及得不合理,會出現(xiàn)動畫結束之后再展示第二個頁面這個過程會顯得很生硬。
但是如果僅僅只有頁面切換的動畫,還是覺得差點意思。這時候就需要發(fā)揮自己想象力了。我這里可以用一個自定義View和這個動畫進行聯(lián)動,讓他們看起來是一個整體的效果。
比如我這樣寫一個View
<RelativeLayout
android:id="@+id/btn"
android:layout_width="120dp"
android:layout_height="60dp"
android:background="@drawable/test_start"
android:layout_alignParentEnd="true"
android:layout_marginTop="50dp"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下一步"
android:layout_centerInParent="true"
android:textColor="#ffff"
/>
</RelativeLayout>
設置一個背景,顏色和第二個頁面的顏色相同
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<!--背景顏色-->
<solid android:color="@color/jh_blue" />
<corners
android:topLeftRadius="100dp"
android:bottomLeftRadius="100dp"
/>
</shape>
最終會展現(xiàn)出這樣的效果

共享元素
在5.0之后,android提供了共享元素的實現(xiàn)。Material Design剛出來的時候我還沒畢業(yè),我覺得現(xiàn)在回去看它的這個思想和一些內容,確實能有一些其它的收獲,這個概念的提出確實牛
共享元素簡單來說效果就是你兩個頁面之間的跳轉,設置了共享的元素會做個動畫,會讓人感覺是這個頁面的View做了一個動畫移動到另一個頁面,體現(xiàn)出現(xiàn)的效果就很好。
那既然效果好,為什么不普遍使用呢?我覺得有兩個原因,第一個是之前不像現(xiàn)在一樣基本都是5.0以上的手機,之前要對4.4做適配,然后開發(fā)中,沒那方面的需求,自然也不會往那個方向去想,甚至都不知道Android有提供這個東西。第二個原因是好用是好用,相對的坑也多。
可以先看看如何實現(xiàn),我這里寫個簡單點的Demo,首先在第一個頁面創(chuàng)建一個view
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
>
<ImageView
android:id="@+id/iv_test"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_marginTop="500dp"
android:src="@drawable/aaaaa"
android:transitionName="test"
/>
</RelativeLayout>
看到這里有個屬性transitionName,這個就是定義共享元素,然后在第二個頁面也創(chuàng)建一個view
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/blue"
android:gravity="center_horizontal"
>
<ImageView
android:id="@+id/iv_test"
android:layout_width="180dp"
android:layout_height="180dp"
android:layout_marginTop="20dp"
android:src="@drawable/aaaaa"
android:transitionName="test"
/>
</RelativeLayout>
看到他們的transitionName是一樣的,然后在跳轉時用ActivityOptions.makeSceneTransitionAnimation就行了,具體的它已經里面幫你封裝好了
ImageView imageView = findViewById(R.id.iv_test);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(TwoActivity.this, ThreeActivity.class);
Bundle bundle = ActivityOptions.makeSceneTransitionAnimation(TwoActivity.this, imageView, "test")
.toBundle();
startActivity(intent, bundle);
}
});
就這么簡單,其中要注意的是你頁面的style如果是用Material的style就沒什么問題,但如果不是,你就需要在你的style中設置
<item name="android:windowActivityTransitions">true</item>
當然也可以在代碼中動態(tài)設置
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
最終的效果就是這樣的

這個動畫效果是默認的,如果你要自己實現(xiàn),就需要自己去寫transition,比如我這里這樣設置時間
<fade xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="300"
/>
<style name="test_style" parent="android:Theme.NoTitleBar.Fullscreen">
<item name="android:windowActivityTransitions">true</item>
<item name="android:windowEnterTransition">@transition/activity_fade</item>
<item name="android:windowExitTransition">@transition/activity_fade</item>
</style>
它其實功能很龐大,同樣的坑也會很多。我這里就不往下說了,前面也說了,這篇文章主要是寫個思路,你要是能把它玩好了,就和自定義view一樣,屬性動畫一樣,想實現(xiàn)什么效果,就實現(xiàn)什么效果,我也不常用,對這個技術點也只是入門。
通過window去實現(xiàn)
這個思路是在activity上方有個圖層,圖層中有個view和下方圖層的view的大小和位置相同,然后去改上圖層的view。此時如果下圖層做跳轉,也不會影響,就是能實現(xiàn)和上面共享元素一樣的效果。但是我以前用的window是系統(tǒng)級別的window,所以能實現(xiàn)效果,其它級別的不知道會不會有問題,得開發(fā)時候具體調試才知道,總之主要看思路,先不用在意細節(jié)。
還是用一個Demo來舉例,先寫Activity的頁面,兩個textview是用做標識看效果的
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
>
<ImageView
android:id="@+id/iv_test"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_marginTop="500dp"
android:src="@drawable/aaaaa"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="在圖片上方"
android:layout_marginTop="480dp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="在圖片下方"
android:layout_below="@+id/iv_test"
/>
</RelativeLayout>
再寫window的布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
>
<ImageView
android:id="@+id/iv_test"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_marginTop="500dp"
android:src="@drawable/aaaaa"
/>
</RelativeLayout>
可以看到兩個view的初始位置和大小都相同,然后看看具體的實現(xiàn)
public class TwoActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_two);
ImageView imageView = findViewById(R.id.iv_test);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
playWindow();
}
});
}
private void playWindow() {
RelativeLayout relativeLayout = (RelativeLayout) LayoutInflater.from(this).inflate(R.layout.test_window, null);
View windowView = relativeLayout.findViewById(R.id.iv_test);
WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams wlp = new WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_APPLICATION,
WindowManager.LayoutParams.FLAG_FULLSCREEN
, PixelFormat.RGBA_8888);
windowManager.addView(relativeLayout, wlp);
windowView.post(new Runnable() {
@Override
public void run() {
start(windowView);
}
});
}
private void start(final View view) {
int w = view.getWidth();
int h = view.getHeight();
ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 300);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int v = (int) animation.getAnimatedValue();
RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) view.getLayoutParams();
rlp.width = w + v;
rlp.height = h + v;
view.setLayoutParams(rlp);
view.invalidate();
}
});
valueAnimator.setDuration(700).start();
}
}
demo里面我為了方便用了TYPE_APPLICATION,但實際我這邊開發(fā)用的是FIRST_SYSTEM_WINDOW以上的系統(tǒng)層級彈窗。
然后我們來看看最終的效果

這里是做了個放大的效果,但實際你可以放大后跳轉Activity然后移動位置,再縮小,就有無縫轉場的效果,其實和上面的共享元素的效果類似。
總結
能實現(xiàn)轉場的方式很多,不用拘束于調用原生的方法,比如如果真依賴原生提供的方法,要是真要適配5.0以下的怎么做?最重要的是要發(fā)揮自己的想象力,去思考。當然,這個原生提供的系統(tǒng)確實也有很多學問在里邊,想要玩得爐火純青,也是需要不斷的去嘗試,不斷的去踩坑。
以上就是Android轉場效果實現(xiàn)示例淺析的詳細內容,更多關于Android轉場效果的資料請關注腳本之家其它相關文章!
相關文章
Android為Tiny4412設備驅動在proc目錄下添加一個可讀版本信息的文件
今天小編就為大家分享一篇關于Android為Tiny4412設備驅動在proc目錄下添加一個可讀版本信息的文件,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12
Android AlarmManager實現(xiàn)定時循環(huán)后臺任務
這篇文章主要為大家詳細介紹了Android AlarmManager實現(xiàn)定時循環(huán)后臺任務,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06
Android RecyclerView實現(xiàn)下拉刷新和上拉加載
這篇文章主要介紹了Android RecyclerView實現(xiàn)下拉刷新和上拉加載的相關資料,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05
Android?Flutter實現(xiàn)評分組件的示例代碼
在很多應用中,我們都需要收集用戶的評分,比如商品滿意度、配送滿意度、應用使用體驗等等。本文就利用flutter_rating_bar實現(xiàn)簡易的評分組件,感興趣的可以2022-11-11
Android DrawerLayout布局與NavigationView導航菜單應用
這篇文章主要介紹了Android DrawerLayout抽屜布局與NavigationView導航菜單應用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2023-01-01
Android自定義View設定到FrameLayout布局中實現(xiàn)多組件顯示的方法 分享
Android自定義View設定到FrameLayout布局中實現(xiàn)多組件顯示的方法 分享,需要的朋友可以參考一下2013-05-05

