Material DesignシリーズのカスタムBehaviorはすべてのViewをサポートします。


本論文の実例は、AndroidカスタムBehaviorがすべてのViewをサポートしていることを共有しています。具体的な内容は以下の通りです。
一、実現効果図
この右下のFABは、アニメーションはもちろん多様で、インタフェースのどこに置いてもいいです。ここでは例を挙げます。しかし、v 7のカバンの中で提供されているBehaviorは今はFloat at at ingAction Buttonしか使えません。ですから、今日実現されたこのBehaviorはすべてのViewをサポートしています。ImageView、Buton、Layoutで使えます。

二、カスタマイズBehaviorとアニメーションのパッケージ
私たちはBehaviorがCoordinasolayoutのサブクラスであることを知っています。Ctrl+Tはその実現クラスを調べています。現在は以下のいくつかがあります。
1.AppBarLayout.Behavior;
2.AppBarLayout.SrollingView Behavior;
3.Float ingAction.Behavior;
4.Snackbar.Behavior;
5.Bottom Sheet Behaviro;
6.Swipe DispmissBehavior;
7.Header Behavior
8.View Offset Behavior;
9.Header ScrrollingView Behavior;
その中の第1、7は抽象類で、8はパック保護の類で、9は8の1つのサブクラスで、私達は後でまた言います。
アプリBarLayout.ScrrollingView Behaviorはよく使います。つまり私達はラyout xmlでよく使います。behavior=「@string/appbar_」scrolling_viewbehaviorです。
Snackbar.BehaviorはSnackbarに使われています。これは言うまでもないです。
FlooatoningAction.Behavior、Bottom Sheet Behaviro、SwipeDisplamissBehaviorは文章の冒頭のいくつかの友情リンクのブログではっきりと述べました。皆さん、振り返ってみてください。
今日はカスタムBehaviorがすべてのViewをFABとしてサポートするということです。Float Action.Behaviorですが、Float ingAction Buttonだけをサポートしていますので、今日はBehaviorを自分で受け継いでDefineBehaviorを書きます。だから第一歩はFloat at ingAction.Behaviorのソースコードを開けてみます。
BaicBehaviorを実現
まず知らなければならないのは、Coordinatolayout.Behaviorという基質がパンチングをサポートしていることです。Float at Action.Behaviorを見てから送るのが先です。それを引用するViewはFloat Actionでなければならないと制限されています。ここでも勉強して継承すればいいです。
私達は新しいクラスのBaicBehaviorを作って、Float at at ingAction.Behaviorのコードをコピーして、中の泛型を次のように変えます。
public class Baic Behavior<T extends View>extends Coordination Layout.Behavior<T>;
つまり、BaicBehaviorのクラスを引用してViewにすればいいので、BaicBehaviorの中にコピーされたコードの中にFloat at ingActionのところを引用してViewに変更します。
よく見ると、これらの種類はandroid.support.design.widgetに包まれています。これらは確かにpackage保護の種類です。だから、私達はプロジェクトの下でAndroid.support.design.widgetカバンを新たに作って、BaicBehaviorを新しいカバンの下に移して、問題を発見して解決します。
プロジェクトのソースコードとBaicBehaviorの完全なソースコードはリンクをダウンロードします。文章の冒頭か最後に探してください。
アニメーションの実現と簡略化
(前のブログの客観を見ていないので、必ず振り返ってみてください。違った収穫があります。)
以前の同シリーズのブログで、Viewの拡大縮小動画を実現する際、特にViewが隠されている時は、下記のコードでViewを記録して動画を移動したら実行できますか?

//   View         。
private boolean isOutExecute = false;

private ViewPropertyAnimatorListener outAnimatorListener = new ViewPropertyAnimatorListener() {
 @Override
 public void onAnimationStart(View view) {
 isOutExecute = true;
 }

 @Override
 public void onAnimationEnd(View view) {
 view.setVisibility(View.GONE);
 isOutExecute = false;
 }

 @Override
 public void onAnimationCancel(View view) {
 isOutExecute = false;
 }
};

各コールの場所にこんなに長く書かないために、このコードを一つの種類にカプセル化して、以下のように簡略化します。

public static class ListenerAnimatorEndBuild {
 //   View         。
 private boolean isOutExecute = false;

 private ViewPropertyAnimatorListener outAnimatorListener;

 public ListenerAnimatorEndBuild() {
 outAnimatorListener = new ViewPropertyAnimatorListener() {
 @Override
 public void onAnimationStart(View view) {
 isOutExecute = true;
 }
 @Override
 public void onAnimationEnd(View view) {
 view.setVisibility(View.GONE);
 isOutExecute = false;
 }

 @Override
 public void onAnimationCancel(View view) {
 isOutExecute = false;
 }
 };
 }

 // View         。
 public boolean isFinish() {
 return !isOutExecute;
 }

 //   ViewPropertyAnimatorListener。
 public ViewPropertyAnimatorListener build() {
 return outAnimatorListener;
 }
}

そうすると、私達が使う時はコードが二行しかないです。

ListenerAnimatorEndBuild listenerAnimatorEndBuild = new ListenerAnimatorEndBuild();

//          :
listenerAnimatorEndBuild.isFinish();

BaicBehaviorを継承してDefineBaviorを実現します。
前にBaicBehaviorを定義しましたが、ここではBaicBehaviorを継承して私達のアニメーションロジックを実現するだけです。

public class DefineBehavior extends BasicBehavior<View> {

 private ListenerAnimatorEndBuild listenerAnimatorEndBuild;

 public DefineBehavior(Context context, AttributeSet attrs) {
 super(context, attrs);
 listenerAnimatorEndBuild = new ListenerAnimatorEndBuild();
 }

 @Override
 public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, View directTargetChild, View target, int nestedScrollAxes) {
 return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL;
 }

 @Override
 public void onNestedScroll(CoordinatorLayout coordinatorLayout, View child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) {
// if (dyConsumed > 0 && dyUnconsumed == 0) {
// System.out.println("   。。。");
// }
// if (dyConsumed == 0 && dyUnconsumed > 0) {
// System.out.println("        。。。");
// }
// if (dyConsumed < 0 && dyUnconsumed == 0) {
// System.out.println("   。。。");
// }
// if (dyConsumed == 0 && dyUnconsumed < 0) {
// System.out.println("    ,    。。。");
// }

 //              ,              。
 if ((dyConsumed > 0 || dyUnconsumed > 0) && listenerAnimatorEndBuild.isFinish() && child.getVisibility() == View.VISIBLE) {//   
 scaleHide(child, listenerAnimatorEndBuild.build());
 } else if ((dyConsumed < 0 || dyUnconsumed < 0) && child.getVisibility() != View.VISIBLE) {
 scaleShow(child, null);
 }
 }
}

びっくりするかもしれません。ハハ、驚かないでください。パッケージはこんなに簡単で、すべてのViewのサポートが実現できます。
三、どう使いますか
googleが提供するBehaviorと同じように、パッケージ名を引用すればいいです。
ap:layout_behavior=「comp.yanzhenjie.definebehavior.behavior.DefineBehavior」
googleが提供するBehaviorと同じように簡単に使うために、String.xmlでこのstringを定義してもいいです。
<string name=「define_」behavior">comp.yanzhenjie.definebehavior.behavior.DefineBehavior
使う時:
ap:layout_behavior=「@string/define_」behavior「
今は元のプロジェクトのFloat ingActButtonをImageViewに変えます。

<ImageView
 android:id="@+id/fab"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_gravity="bottom|end"
 android:layout_margin="16dp"
 android:src="@mipmap/ic_launcher"
 app:layout_behavior="@string/define_behavior"
 app:layout_scrollFlags="scroll|enterAlways|snap" />

はい、OKです。具体的な効果はみんなでソースをダウンロードします。http://xiazai.jb51.net/201609/yuanma/AndroidDefineBehavior(jb 51.net)rar
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。