Quantcast
Channel: kenji matsuokaのニッキ
Viewing all articles
Browse latest Browse all 342

L Developer Preview マテリアルデザイン - アニメーション

$
0
0
原文
マテリアルデザイン内でのアニメーションがユーザーのアクションに対するフィードバックとアプリ内でユーザーと対話するときの視覚的な一貫性を提供します。マテリアルテーマは標準でボタンとactivityの移り変わりのために複数のアニメーションを提供し、Android L Developer Previewが提供する追加APIはそれらのアニメーションをカスタマイズし、新しいアニメーションを作ることが出来ます。
・Touch feedback
・Reveal effect
・Activityの切り替え
・Curved motion
・View状態の変化

Touch feedback

ボタンのための標準のフィードバックは新しいRippleDrawableクラスを使用し、波紋エフェクトにより異なる状態に切り替わります。

殆どの場合において、この機能を使用するためには波紋の範囲をviewに留めるためにandroid:attr/selectableItemBackgroundでbackgroundを指定するか、Viewを超えて波紋を広げるためにandroid:attr/selectableItemBackgroundBorderlessを指定する必要があります。RippleDrawable を作ってあなたのViewにセットすることも出来ます。あるいはripple属性を使ってXMLリソースとしてRippleDrawable を定義することも出来ます。Android L Develoepr PreviewはRipple effectを使ってselection colorをアニメーションしています。

標準のタッチフィードバックカラーを変更するために、テーマのandroid:colorControlHighlight属性を使ってRippleDrawable objectsに色をアサインできます。

Reveal effect

ViewAnimationUtils.createCircularRevealメソッドにより、Viewの表示・非表示を行うときに円形に切り抜かれたアニメーションを適用できます。
このエフェクト使って、前方の非表示ビューを表示する。


// 前方の非表示View
View myView = findViewById(R.id.my_view);

// くり抜く円の中央部分を求める
int cx = (myView.getLeft() + myView.getRight()) / 2;
int cy = (myView.getTop() + myView.getBottom()) / 2;

// くり抜く円の最終的な半径を求める
int finalRadius = myView.getWidth();

// Viewのためのアニメーションを作成して開始する
// (初期値の半径はゼロ)
ValueAnimator anim =
ViewAnimationUtils.createCircularReveal(myView, cx, cy, 0, finalRadius);
anim.start();


このエフェクトを使って、前面の表示ビューを非表示にする

// 前面に表示されているview
final View myView = findViewById(R.id.my_view);

// 切り抜く円の中央を求める
int cx = (myView.getLeft() + myView.getRight()) / 2;
int cy = (myView.getTop() + myView.getBottom()) / 2;

// 切り抜く円の最初の半径を求める
int initialRadius = myView.getWidth();

// アニメーションを作成する(最後の半径はゼロ)
ValueAnimator anim =
ViewAnimationUtils.createCircularReveal(myView, cx, cy, initialRadius, 0);

// アニメーションが完了しviewが非表示になったら呼び出される
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
myView.setVisibility(View.INVISIBLE);
}
});

// アニメーションを開始
anim.start();


Activityの切り替え

enter/exit transition、そして要素を共有すりActivity間の切り替えでカスタムアニメーションを指定することが出来ます。

・ enter transitionはActivityのViewがどうやってシーンに入ってくるか決定します。例えば、explode enter transitionはViewがそれぞれシーンの外側から飛んできてスクリーンの中央に集まります。
・ exit transitionはActivityのViewがどうやってシーンから出ていくかを決定します。例えば、explode exit transitionはViewが中央から外側に向かって飛んでいきます。
・shared element transitionは2つの移り変わるActivity間で共有されているViewがどのようにActivity間で変化するかを決定します。例えば、2つのActivityが同じ画像を異なる場所とサイズで持っていた時、moveImage shared elementは画像をActivity間でスムーズに移動、スケールさせます。

Android L Developer Previewはこれらのenter transitionとexit transitionをサポートします。
・explode シーンの中央に向かってviewが入ったり出たりします
・slide シーンの端からViewが入ってきたり出たりします。
・fade シーンにViewがフェードイン・アウトしたりします。

それぞれのTransitionはenterあるいはexittransitionをサポートするandroid.transition.Visibilityクラスを継承しています。より詳細はAPIreferenceの android.transition.Transitionクラスを見てください。

Android L Developer Previewは以下のShared elements transitionもサポートしています。

・changeBounds ターゲットviewのレイアウトがアニメーションして変化します
・changeClipBounds ターゲットViewのclipがアニメーションして変化します。
・changeTransform ターゲットViewのサイズと向きがアニメーションして変化します。
・moveImage imageViewのためにサイズとスケールがアニメーションします。
アプリ内のActivity transitionが有効な場合、標準で切り替わっているActivity間のcross-feding transitionが有効になっています。

図1: 1つの共有Elementによるシーンの移り変わり

カスタム transitionsを指定する

まず始めに、マテリアルテーマを継承するスタイルを定義するときにandroid:windowContentTransitions 属性により、window content transitionsを有効にします。スタイル定義で、特定のenter、exitあるいはshared element transitionを定義することも出来ます。

<style name="BaseAppTheme" parent="android:Theme.Material">
<!-- window content transitionsを有効にする -->
<item name="android:windowContentTransitions">true</item>

<!-- enterとexit transitionsを指定する -->
<item name="android:windowEnterTransition">@transition/explode</item>
<item name="android:windowExitTransition">@transition/explode</item>

<!-- shared element transitionsを指定する -->
<item name="android:windowSharedElementEnterTransition">
@transition/move_image</item>
<item name="android:windowSharedElementExitTransition">
@transition/move_image</item>
</style>


下記の例ではmove_image transitionを定義しています。

<!-- res/transition/move_image.xml -->
<!-- (下記のShared Transitionsも見てください) -->
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<moveImage/>
</transitionSet>

moveImage要素はandroid.transition.MoveImageクラスと一致します。詳細はAPI referenceのandroid.transition.Transition .を見てください。

代わりにWindow.requestFeatureメソッドをコールしwindow content transitionをコード内で有効にする。

// あなたのActivity内で実行する(theme内でtransitionを有効にしていない場合)
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

// exit transitionをセットする
getWindow().setExitTransition(new Explode());

以下のメソッドを呼びTransitionオブジェクトを使ってコード内でTransitionを指定する
・Window.setEnterTransition
・Window.setExitTransition
・Window.setSharedElementEnterTransition
・Window.setSharedElementExitTransition

setExitTransition と setSharedElementExitTransition メソッドは呼び出したActivityの終了時の動きを定めます。setEnterTransition とsetSharedElementEnterTransition メソッドは呼び出したActivityの開始時の動きを定めます。

transitionの全体のエフェクトを取得するために、window content transitionを呼び出し時とActivity呼び出し後の両方で有効にするよう必要があります。そうしないと、呼び出されたActivityは終了時のtransitionを始め、(scaleあるいはfadeのような)window transitionが表示されます。
Enter transitionを素早く開始するために、呼び出されるAnctivityで Window.setAllowEnterTransitionOverlapメソッドを使用して下さい。これにより、enter transitionをより劇的にします。同様に、Activityを呼び出しexit transitionのためにWindow.setAllowExitTransitionOverlaメソッドを呼び出してください。

transitionを使ってのActivity開始

Activityでtransitionを有効にし、exit transition を設定していたらstartActivityメソッドで他のActivityを起動するときにtransitionが起動されます。2つめのAcitivityのためにenter transitionを設定していたらActivityが開始されるときにもtransitionが起動されます。

Shared elements transitions

要素を共有する2つのActivity間でschened transition animationを作るために
1.style内でWindow content transitionsを有効にする
2.Style内で共有する要素を指定する。
3.XML リソースとしてtransitionを定義する。
4.それぞれのレイアウトで共有する要素に対しandroid : viewName属性に共通の名称を割り当てる。
5. ActivityOptions.makeSceneTransitionAnimationメソッドを使用する

// clickイベントを取得した要素を取得する
final View imgContainerView = findViewById(R.id.img_container);

// このActivityのtransitionのために共通のエレメントを取得する
final View androidRobotView = findViewById(R.id.image_small);

// click listenerを定義する
imgContainerView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(this, Activity2.class);
// transition animationを作る - android:viewName="robot"で定義された
// 両Activityのレイアウト内にある画像
ActivityOptions options = ActivityOptions
.makeSceneTransitionAnimation(this, androidRobotView, "robot");
// 新しいactivityを開始する
startActivity(intent, options.toBundle());
}
});

動的にコード内で生成したviewを共有するには、View.setViewNameメソッドでそれぞれのActivityに共通の要素名を指定してください。

scene transition animationを逆再生するために、2番目のActivityを終了したときに、Activity.finish の代わりに Activity.finishAfterTransitionメソッドを呼んでください。

複数の要素を共有する

複数の共有エレメントを持っている2つのActivity間の scene transition animationを作るために、両layoutのAndroid: viewName attribute (あるいはそれぞれのActivityでView.setViewNameを使って)共有する要素を定義し、下記のようにActivityOptionsオブジェクトを作ります。

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this,
Pair.create(view1, "agreedName1"),
Pair.create(view2, "agreedName2"));

Curved Motion

マテリアルデザインのAnimationは時間軸に伴う空間内での動きをcurvesに依存します。Android L Developer Preview はアニメーションのタイミングカーブとモーションパターンカーブをカスタマイズして定義できる新しいAPIを提供します。

PathInterpolator クラスは新しいベジェカーブあるいはPathオブジェクトに基づく補完を行います。このinterpolator はコンストラクターの引数に(0,0)から(1,1)のアンカーポイントとコントロールポイントで表される1x1のスクエアなモーションカーブで指定します。XMLリソースとしてPathInterpolator を定義することも出来ます。

<pathInterpolator xmlns:android="http://schemas.android.com/apk/res/android"
android:controlX1="0.4"
android:controlY1="0"
android:controlX2="1"
android:controlY2="1"/>

Android L Developer Previewはマテリアルデザイン内で3つの基本的なカーブをXMLリソースとして提供しています。
@interpolator/fast_out_linear_in.xml
@interpolator/fast_out_slow_in.xml
@interpolator/linear_out_slow_in.xml
Animator.setInterpolationメソッドにPathInterpolatorオブジェクトを渡すことが出来ます。

ObjectAnimator クラスの新しいコンストラクターは2つ以上のプロパティーを使って経路に沿ったアニメーションを作ることが出来ます。例えば、下記のanimatorはPathオブジェクトを使ってViweのXとYプロパティーをアニメートさせます。

ObjectAnimator mAnimator;
mAnimator = ObjectAnimator.ofFloat(view, View.X, View.Y, path);
...
mAnimator.start();


View状態の変化によるアニメーション

新しいStateListAnimatorクラスでビューの状態が変わるときに実行されるアニメーションを定義できます。下記の例はどうやってXMLリソースでStateListAnimatorを定義するかを示します。

<!-- viewが押されたら、translationZプロパティをアニメートさせる-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<set>
<objectAnimator android:propertyName="translationZ"
android:duration="100"
android:valueTo="2"
android:valueType="floatType"/>
<!-- XやYのような他のプロパティのように
他のobjectAnimator要素もここで持てます-->
</set>
</item>
<item android:state_enabled="true"
android:state_pressed="false"
android:state_focused="true">
<set>
<objectAnimator android:propertyName="translationZ"
android:duration="100"
android:valueTo="2"
android:valueType="floatType"/>
</set>
</item>
</selector>


注意 Android L Developer Preview releaseの既知の問題としてアニメーションが正しい振る舞いをするようにStateListAnimator 内で valueFrom値を提供することが必要です。

新しいAnimatedStateListDrawable はviewに関する状態が変化したときにアニメーションを表示するdrawableを作ります。Android L Developer Previewのいくつかのシステムウィジェットが標準でこのアニメーションを使用します。以下の例はどのようにXMLリソースとしてAnimatedStateListDrawableを定義するかを示します。

<!-- res/drawable/myanimstatedrawable.xml -->
<animated-selector
xmlns:android="http://schemas.android.com/apk/res/android">

<!-- それぞれの状態でことなるdrawableを渡します-->
<item android:id="@+id/pressed" android:drawable="@drawable/drawableP"
android:state_pressed="true"/>
<item android:id="@+id/focused" android:drawable="@drawable/drawableF"
android:state_focused="true"/>
<item android:id="@id/default"
android:drawable="@drawable/drawableD"/>

<!-- transitionを指定します -->
<transition android:fromId="@+id/default" android:toId="@+id/pressed">
<animation-list>
<item android:duration="15" android:drawable="@drawable/dt1"/>
<item android:duration="15" android:drawable="@drawable/dt2"/>
...
</animation-list>
</transition>
...
</animated-selector>


Drawableの色づけ

Android L Developer Previewはbitmapあるいはnine-patcheをアルファマスクとして定義しcolorリソースやテーマの属性で色づけすることが出来ます。(例 android : attr / colorPrimary)1度だけこのassetsを作り、自動的にテーマにマッチするように色づけできます。

bitmapに色づけするために、BitmapDrawableやNinePatchDrawable.にsetTintメソッドかandroid:tint属性を使用します。

setTintメソッドでPower-Duffモードにセットしコード内でNinePatchDrawableとBitmapDrawableオブジェクトの色を混合することも出来ます。layoutで tint modeを設定するには android : tintMode属性を使います。

イメージから特出した色を抽出する

Android L Developer Preview Support Library はPaletteクラスを含んでいて、画像の特出した色を抽出できます。このクラスは、以下の特出した色を抽出します:
・鮮明
・鮮明で暗い
・鮮明で明るい
・くすんでいる
・くすんでいて暗い
・くすんでいて明るい
これらの色の抽出するには画像をロードするバックグラウンドスレッドで静的メソッドPalette.generateにBitmapを渡します。あなたがスレッドを使用できない場合はPalette.generateAsyncを呼びリスナーを渡してください。

画像から特出した色を受け取るためにPalette.getVibrantColor.などのPallets内のgetterメソッドを使用します。

より詳細は android.support.v7.graphics.Palette のAPIリファレンスを見てください。



Except as noted, this content is licensed under Creative Commons Attribution 2.5. For details and restrictions, see the Content License.



Viewing all articles
Browse latest Browse all 342

Trending Articles