最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android CoordinatorLayout高級用法之自定義Behavior

 更新時間:2018年02月01日 09:21:46   作者:FightSeeker  
這篇文章主要介紹了Android CoordinatorLayout高級用法之自定義Behavior,具有一定的參考價值,感興趣的小伙伴們可以參考一下

上次簡單的說了一下CoordinatorLayout的基本用法(android特性之CoordinatorLayout用法探析實例)。其中CoordinatorLayout給我們提供了一種新的事件的處理方式,Behavior。還記得那一串字符串嗎?

app:layout_behavior="@string/appbar_scrolling_view_behavior" 

其實它并不是一個字符串資源,而它代表的是一個類,就是一個Behavior,這玩意其實還可以自定義的。

首先,來讓我見識一下它的真面目:

public static abstract class Behavior<V extends View> { 
... 
} 

Behavior是CoordinatorLayout的一個內(nèi)部泛型抽象類。內(nèi)部類中指定的view類型規(guī)定了哪種類型的view的可以使用才Behavior。因此,如果沒有特殊需求,直接指定view為View就行了。

1.某個view需要根據(jù)監(jiān)聽另一個的行為來控制自己的行為,這個時候我們需要重寫2個方法:

public boolean layoutDependsOn(CoordinatorLayout parent, V child, View dependency) { 
      return false; 
    } 
public boolean onDependentViewChanged(CoordinatorLayout parent, V child, View dependency) { 
      return false; 
    } 

2.我們的view需要根據(jù)監(jiān)聽CoordinatorLayout中的子view的滾動行為來改變自己的狀態(tài),現(xiàn)在我們就需要重寫下面的方法了:

public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, 
    V child, View directTargetChild, View target, int nestedScrollAxes) { 
  return false; 
} 
public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, V child, View target, 
    int dx, int dy, int[] consumed) { 
  // Do nothing 
} 

下面我們先來看一下情況1,讓一個view跟隨另一個view的行為而實現(xiàn)狀態(tài)的改變。我們定義一個Behavior,名字叫:FooterBehavior,代碼如下:

package com.lingyun.coordinatorlayoutdemo;  
import android.content.Context; 
import android.support.design.widget.AppBarLayout; 
import android.support.design.widget.CoordinatorLayout; 
import android.util.AttributeSet; 
import android.view.View;  
/** 
 * Created by dandy on 2016/7/4. 
 */ 
public class FooterBehavior extends CoordinatorLayout.Behavior<View>{ 
 
  public FooterBehavior(Context context,AttributeSet attributeSet){ 
    super(context,attributeSet); 
  } 
 
  @Override 
  public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) { 
    return dependency instanceof AppBarLayout; 
  } 
 
  @Override 
  public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) { 
    float scaleY = Math.abs(dependency.getY()) / dependency.getHeight(); 
    child.setTranslationY(child.getHeight() * scaleY); 
    return true; 
  } 
} 

我們在自定義的Behavior中,帶有參數(shù)的這個構(gòu)造必須要重載,因為在CoordinatorLayout里利用反射去獲取這個Behavior的時候就是拿的這個構(gòu)造。

在layoutDependsOn中,我們設(shè)置讓View的狀態(tài)來跟隨AppBarLayout,也就是說只有AppBarLayout的狀態(tài)發(fā)生變化才會影響到View。

接下來就是在onDependentViewChanged中對View做出相應(yīng)的狀態(tài)改變。在代碼中,我們做的改變是,跟隨dependedcy一起在Y軸方向移動,來達到顯示和隱藏的目的。先布局如下:

activity_main.xml布局:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout 
 xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent">  
  <include layout="@layout/appbar_main"/>  
  <include layout="@layout/content_main" />  
  <include layout="@layout/footer_main"/>  
</android.support.design.widget.CoordinatorLayout> 

appbar_main.xml布局如下:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.AppBarLayout 
  xmlns:android="http://schemas.android.com/apk/res/android" 
  xmlns:app="http://schemas.android.com/apk/res-auto" 
  android:layout_width="match_parent" 
  android:layout_height="wrap_content" 
  android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 
 
  <android.support.v7.widget.Toolbar 
    android:id="@+id/toolbar" 
    android:layout_width="match_parent" 
    android:layout_height="?attr/actionBarSize" 
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
    android:background="?attr/colorPrimary" 
    app:layout_scrollFlags="scroll|enterAlways"/> 
 
</android.support.design.widget.AppBarLayout> 

content_main.xml布局如下:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.NestedScrollView 
  xmlns:android="http://schemas.android.com/apk/res/android" 
  xmlns:app="http://schemas.android.com/apk/res-auto" 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" 
  app:layout_behavior="@string/appbar_scrolling_view_behavior"> 
 
  <TextView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center" 
    android:text="你是誰?你從哪里來?你到哪里去?"/> 
</android.support.v4.widget.NestedScrollView> 

footer_main.xml布局如下:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  xmlns:app="http://schemas.android.com/apk/res-auto" 
  android:orientation="horizontal" 
  android:layout_width="match_parent" 
  android:layout_height="60dp" 
  android:layout_gravity="bottom" 
  android:background="?attr/colorPrimary" 
  app:layout_behavior="com.lingyun.coordinatorlayoutdemo.FooterBehavior"> 
 
  <TextView 
    android:layout_width="0dp" 
    android:layout_height="match_parent" 
    android:text="Tab1" 
    android:layout_weight="1" 
    android:gravity="center" 
    android:textColor="@android:color/white"/> 
  <TextView 
    android:layout_width="0dp" 
    android:layout_height="match_parent" 
    android:text="Tab2" 
    android:layout_weight="1" 
    android:gravity="center" 
    android:textColor="@android:color/white"/> 
  <TextView 
    android:layout_width="0dp" 
    android:layout_height="match_parent" 
    android:text="Tab3" 
    android:layout_weight="1" 
    android:gravity="center" 
    android:textColor="@android:color/white"/> 
 
</LinearLayout> 

注意看,在footer_main.xml中我們設(shè)置了

app:layout_behavior="com.lingyun.coordinatorlayoutdemo.FooterBehavior" 

這正好就是我們自定義的FooterBehavior的絕對路徑。下面我們來看一下效果圖:

在效果圖上我們看到,當(dāng)我們上下滑動屏幕的時候,底部footer布局和標題Toolbar一起移動,實現(xiàn)了顯示和隱藏的效果。

學(xué)會了第一張簡單的自定義Behavior之后,接下來我們再來看一下第二種情況,滑動。因為這個是根據(jù)CoordinatorLayout里子view的滾動行為來改變我們的狀態(tài)的,所以情況1中的2個方法我們就不需要重寫了。下面,我們用情況2來實現(xiàn)上面的效果。
先來看一下下面幾個參數(shù):

child:簡單點說,就是用到當(dāng)前CoordinatorLayout的子View,響應(yīng)此Behavior。

target:CoordinatorLayout的子View,引起滾動的view,其實child的狀態(tài)改變是根據(jù)target來實現(xiàn)的。

package com.lingyun.coordinatorlayoutdemo;  
import android.content.Context; 
import android.support.design.widget.CoordinatorLayout; 
import android.support.v4.view.ViewCompat; 
import android.util.AttributeSet; 
import android.view.View; 
 
/** 
 * Created by dandy on 2016/7/4. 
 */ 
public class FooterBehavior extends CoordinatorLayout.Behavior<View>{ 
 
  private float targetY = -1; 
 
  private static final String TAG = "FooterBehavior"; 
 
  public FooterBehavior(Context context,AttributeSet attributeSet){ 
    super(context, attributeSet); 
  } 
 
  @Override 
  public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, View child, 
                    View directTargetChild, View target, int nestedScrollAxes) { 
    if(targetY == -1){ 
      targetY = target.getY(); 
    } 
    return (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0; 
  } 
 
  @Override 
  public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, View child, View target, 
                 int dx, int dy, int[] consumed) { 
    super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed); 
    float scrooY = targetY - Math.abs(target.getY()); 
    float scaleY = scrooY / targetY; 
    child.setTranslationY(child.getHeight() * scaleY); 
  } 
} 

在方法onStartNestedScroll中,首先獲取target在Y軸上距離屏幕頂端的距離,然后判斷是否是在Y軸上滾動。
方法onNestPreScroll中,就是時時根據(jù)target距離屏幕頂端的距離計算出滾動的距離,然后根據(jù)比例計算出child移動的距離。
截圖和上面比較沒啥區(qū)別:

基本的自定義Behavior就是這樣了,以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android自制精彩彈幕效果

    Android自制精彩彈幕效果

    這篇文章主要為大家詳細介紹了Android自制精彩彈幕效果,彈幕垂直方向可固定隨機,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • android自定義view用path畫長方形

    android自定義view用path畫長方形

    這篇文章主要為大家詳細介紹了android自定義view用path畫長方形,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Android Binder進程間通信工具AIDL使用示例深入分析

    Android Binder進程間通信工具AIDL使用示例深入分析

    Binder作為Android 眾多的IPC通訊手段之一,在Framework的數(shù)據(jù)傳輸中起到極為關(guān)鍵的作用。Binder機制可謂是Android 知識體系里的重中之重,作為偏底層的基礎(chǔ)組件,平時我們很少關(guān)注它,而它卻是無處不在,也是Android 面試易考察的點之一
    2022-11-11
  • Flutter開發(fā)實現(xiàn)底部留言板

    Flutter開發(fā)實現(xiàn)底部留言板

    這篇文章主要為大家詳細介紹了Flutter開發(fā)實現(xiàn)底部留言板,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Android入門之實現(xiàn)自定義Adapter

    Android入門之實現(xiàn)自定義Adapter

    這篇文章主要為大家詳細介紹了Android如何實現(xiàn)自定義Adapter,文中的示例代碼講解詳細,對我們學(xué)習(xí)Android有一定的幫助,需要的可以參考一下
    2022-11-11
  • Android仿高德首頁三段式滑動效果的示例代碼

    Android仿高德首頁三段式滑動效果的示例代碼

    很多app都會使用三段式滑動,比如說高德的首頁和某寶等物流信息都是使用的三段式滑動方式。本文將介紹如何實現(xiàn)這一效果,感興趣的可以學(xué)習(xí)一下
    2022-01-01
  • android利用消息機制獲取網(wǎng)絡(luò)圖片

    android利用消息機制獲取網(wǎng)絡(luò)圖片

    這篇文章主要為大家詳細介紹了android利用消息機制獲取網(wǎng)絡(luò)圖片的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Android實現(xiàn)簽名涂鴉手寫板

    Android實現(xiàn)簽名涂鴉手寫板

    這篇文章主要為大家詳細介紹了Android實現(xiàn)簽名涂鴉手寫板,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Android使用注解代替枚舉節(jié)省系統(tǒng)內(nèi)存開銷的方法

    Android使用注解代替枚舉節(jié)省系統(tǒng)內(nèi)存開銷的方法

    在本篇文章里小編給大家整理的是關(guān)于Android使用注解代替枚舉節(jié)省系統(tǒng)內(nèi)存開銷的方法和實例,需要的朋友們參考下。
    2020-01-01
  • android實現(xiàn)注冊登錄程序

    android實現(xiàn)注冊登錄程序

    這篇文章主要為大家詳細介紹了android實現(xiàn)注冊登錄程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04

最新評論

桂阳县| 虹口区| 浑源县| 新郑市| 南华县| 迁安市| 大宁县| 临漳县| 科技| 城步| 呼图壁县| 商水县| 长汀县| 丹东市| 临西县| 玛曲县| 廉江市| 微山县| 桦川县| 黄大仙区| 北海市| 龙南县| 扎鲁特旗| 皋兰县| 资源县| 磐安县| 河西区| 兴义市| 崇义县| 新营市| 瑞安市| 黔西县| 安徽省| 陆良县| 鄂伦春自治旗| 永胜县| 新泰市| 凯里市| 依安县| 彝良县| 砀山县|