1. 程式人生 > 實用技巧 >android Activity之間專場效果

android Activity之間專場效果

第一種:自己編寫進出效果 然後給activity加上就ok了 例如:(首先要在res資料夾下建立anim資料夾,然後把動畫效果xml檔案放到裡面去)

1.放大進入,

zoomin.xml:

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
android:interpolator="@android:anim/decelerate_interpolator"> 
<scale android:fromXScale="0.1" android:toXScale="1.0" 
android:fromYScale
="0.1" android:toYScale="1.0" android:pivotX="50%p" android:pivotY="50%p" android:duration="300" /> <!-- 這裡為了看到動畫演示效果,把動畫持續時間設為3秒 --> <alpha android:fromAlpha="0.1" android:toAlpha="1.0" android:duration="300" />

縮小退出

zoomout.xml

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
android:interpolator
="@android:anim/decelerate_interpolator" android:zAdjustment="top"> <scale android:fromXScale="1.0" android:toXScale=".5" android:fromYScale="1.0" android:toYScale=".5" android:pivotX="50%p" android:pivotY="50%p" android:duration="300" /> <!-- 系統內建的動畫持續時間 android:duration="@android:integer/config_mediumAnimTime" --> <alpha android:fromAlpha="1.0" android:toAlpha="0" android:duration
="300"/> </set>

MainActivity.java:

public class MainActivity extends Activity  { 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_1);
overridePendingTransition(R.anim.zoomin, R.anim.zoomout); 
//overridePendingTransition(R.anim.alphain, R.anim.alphaout);
//overridePendingTransition(R.anim.move_in_right, R.anim.move_out_right);
//overridePendingTransition(R.anim.move_in_left, R.anim.move_out_left);
 } 

完成!

第二種:

第一步:在 Activity 中的 setContentView(); 方法前加入:

//在需要啟動的activity中開啟動畫的特徵
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

或者,在 AnimationActivity 中設定如下 style,並引用到 AnimationActivity 即可。

<itemname=”android:windowContentTransitions”>true</item>

第二步:在 Activity 中的 setContentView(); 方法前加入一行程式碼:

//進入效果3選1
getWindow().setEnterTransition(new Explode());//分解 是從螢幕中間進或者出,然後將檢視移動至最後位置,達到動畫的效果
//getWindow().setEnterTransition(new Slide());//滑動 是從螢幕邊緣進出,同理通過移動檢視形成動畫
//getWindow().setEnterTransition(new Fade());//淡進淡出 是通過改變檢視的透明度來達到動畫效果
//退出效果3選1
getWindow().setExitTransition(new Explode());
//getWindow().setExitTransition(new Slide());
//getWindow().setExitTransition(new Fade());

第三步:把跳轉程式碼改為這種startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this).toBundle());

簡單的跳轉效果已經完成 如果需要共享元素的話

例如,我的例子中兩個頁面都有一個同樣內容的 textview ,所以要使其得到共享。

<!–共享元素必須新增 transitionName 屬性,且對應的元素name 值一致–>
<android.support.v7.widget.AppCompatTextView
android:id=”@+id/tv_shared_element”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_gravity=”bottom”
android:layout_marginTop=”56dp”
android:layout_marginBottom=”72dp”
android:gravity=”center_horizontal”
android:text=”@string/app_txt”
android:textColor=”#323232″
android:textSize=”18sp”
android:transitionName=”sharedelement”
tools:ignore=”UnusedAttribute”/>

注意:我們必須為兩個頁面的共同元素(textview)設定一個屬性:

android:transitionName=”sharedelement”

並且必須保證兩個 textview 的 transitionName 設定的內容一致,否者將無法達到共享元素的動畫效果。

最後的關鍵一步:更改 startActivity(); 引數內容,因為我們設定了共享元素,所以到進行指定,這樣 startActivity 時才能夠找到目標,所以啟動 activity 的程式碼因改為這樣:

//這裡的 sharedElementName必須與xml檔案中設定的值一致,否則無法共享
//tvSharedElement表示要參與共享的 view
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this,tvSharedElement,
“sharedelement”).toBundle());

如果你的兩個 activity 中有兩個及以上的內容需要共享元素動畫時,你只需要修改程式碼為:

startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this,
Pair.create((View)tvSharedElement,”sharedelement”))
.toBundle());

這裡通過 Pair.create(view,”shared name”);來傳入需要共享的元素。

好了,本篇關於 android5.x 提供的幾種過渡動畫效果就展示完了,雖然過渡動畫效果很漂亮,但是也要合理的運用,也不能每一個 activity 都設定過渡動畫。那麼,如上動態圖演示的一樣,本案例關鍵程式碼將在下面貼出:

案例程式碼

MainActivity 程式碼如下:

import android.annotation.SuppressLint;
import android.app.ActivityOptions;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.AppCompatButton;
import android.support.v7.widget.AppCompatTextView;
import android.util.Pair;
import android.view.View;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;

@SuppressLint(“NewApi”)
public class MainActivity extends AppCompatActivity {

@BindView(R.id.btn_explode)
AppCompatButton btnExplode;
@BindView(R.id.btn_slide)
AppCompatButton btnSlide;
@BindView(R.id.btn_fade)
AppCompatButton btnFade;
@BindView(R.id.tv_shared_element)
AppCompatTextView tvSharedElement;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
}

@OnClick(R.id.btn_explode)
void onExplodeClick() {
Intent intent = new Intent(this, AnimationsActivity.class);
startActivityWithAnimation(intent, ”explode”);
}

@OnClick(R.id.btn_slide)
void onSlideClick() {
Intent intent = new Intent(this, AnimationsActivity.class);
startActivityWithAnimation(intent, ”slide”);
}

@OnClick(R.id.btn_fade)
void onFadeClick() {
Intent intent = new Intent(this, AnimationsActivity.class);
startActivityWithAnimation(intent, ”fade”);
}

private void startActivityWithAnimation(Intent intent, String animType) {
intent.putExtra(“anim”, animType);
//這裡的 sharedElementName 必須與 xml 檔案中設定的值一致,否則無法共享
// tvSharedElement 表示要參與共享的 view
//        startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this, tvSharedElement,
//                ”shared element”).toBundle());
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this,
Pair.create((View) tvSharedElement, ”shared element”))
.toBundle());
}
}

MainActivity 佈局檔案我就不貼出來了,就三個 Button 和一個 TextView,最後我會給出本案例完整程式碼的資源連結,大家若不懂可以去下載來參考。

接著是 AnimationsActivity 的程式碼,這是一個開啟動畫的 Activity ,程式碼如下:

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.AppCompatTextView;
import android.transition.Explode;
import android.transition.Fade;
import android.transition.Slide;
import android.view.Window;

import butterknife.BindView;
import butterknife.ButterKnife;

@SuppressLint(“NewApi”)
public class AnimationsActivity extends AppCompatActivity {

@BindView(R.id.tv_anim_type)
AppCompatTextView tvAnimType;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在需要啟動的 activity 中開啟動畫的特徵
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

setContentView(R.layout.activity_animations);
ButterKnife.bind(this);

setEnterAnim();
}

@SuppressWarnings(“ConstantConditions”)
private void setEnterAnim() {
final String animType = (String) getIntent().getExtras().get(“anim”);
tvAnimType.setText(animType);

switch (animType) {
case ”explode”:
getWindow().setEnterTransition(new Explode());
break;
case ”slide”:
getWindow().setEnterTransition(new Slide());
break;
case ”fade”:
getWindow().setEnterTransition(new Fade());
break;
}
}
}

AnimationsActivity 佈局檔案如下,我覺得還是有必要貼出來:

<?xml version=”1.0″ encoding=”utf-8″?>
<android.support.design.widget.CoordinatorLayout xmlns:android=”http://schemas.android.com/apk/res/android”
xmlns:app=”http://schemas.android.com/apk/res-auto”
xmlns:tools=”http://schemas.android.com/tools”
android:layout_width=”match_parent”
android:layout_height=”match_parent”>

<android.support.v7.widget.ContentFrameLayout
android:id=”@+id/frame”
android:layout_width=”match_parent”
android:layout_height=”280dp”
android:background=”#ff3312″>

<android.support.v7.widget.AppCompatTextView
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_gravity=”center”
android:text=”https://blog.csdn.net/smile_Running”
android:textColor=”#ffffff”
android:textSize=”20sp”
tools:ignore=”HardcodedText” />

</android.support.v7.widget.ContentFrameLayout>

<!– anchor 屬性必須在 CoordinatorLayout 下一級才能生效 –>
<android.support.design.widget.FloatingActionButton
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:src=”@drawable/ic_person_add_black_24dp”
app:elevation=”8dp”
app:layout_anchor=”@id/frame”
app:layout_anchorGravity=”bottom|right” />

<android.support.design.widget.FloatingActionButton
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:src=”@drawable/ic_sentiment_satisfied_black_24dp”
app:elevation=”8dp”
app:layout_anchor=”@id/frame”
app:layout_anchorGravity=”bottom|left” />

<android.support.v7.widget.CardView
android:layout_width=”220dp”
android:layout_height=”120dp”
app:cardBackgroundColor=”#ffdd55″
app:cardCornerRadius=”24dp”
app:cardElevation=”8dp”
app:layout_anchor=”@id/frame”
app:layout_anchorGravity=”bottom|center_horizontal”>

<android.support.v7.widget.AppCompatTextView
android:id=”@+id/tv_anim_type”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_gravity=”center”
android:text=”animations”
android:textColor=”#ffffff”
android:textSize=”25sp”
tools:ignore=”HardcodedText” />
</android.support.v7.widget.CardView>

<android.support.v7.widget.AppCompatTextView
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_gravity=”bottom”
android:layout_marginBottom=”72dp”
android:gravity=”center_horizontal”
android:text=”@string/app_txt”
android:textColor=”#323232″
android:textSize=”18sp”
android:transitionName=”shared element”
tools:ignore=”UnusedAttribute” />
</android.support.design.widget.CoordinatorLayout>