5

コーディネーターを使って遊び始めましたが、添付画像でその動作を実現しようとしています。バックグラウンド画像をフルサイズスクロールすると、一部のテキストビューが消えてしまい、一部がビューページ(ツールバーレイアウトではなく)の一部として固執するようになりたいのですが、これをどのように達成できますか?私はあなたが特定または一般的な解決をしたい場合はわからないとしてコーディネーターレイアウトを使用してフルスクリーンの画像ビューを折りたたんで、ビューページとヘッダーを置き換えます

enter image description here

+0

が、それは大丈夫です最初の状態?または、あなたは絶対にそれらを隠したいですか? –

+0

新しいデザインサポートウィジェットBottomSheetを見たことがありますか?BottomSheetを使用してこれを実現できると思います.... – Moinkhan

答えて

2

layout_behaviorを使用すると、スクロール時に消えたい文字列を処理できます。あなたが処理したいビューにlayout_behavior:アプリとしてカスタムビューの動作を設定、レイアウトXMLでCoordinatorLayout.Behavior

ViewBehavior.java

public class ViewBehavior extends CoordinatorLayout.Behavior<RelativeLayout> { 

private Context mContext; 

public ViewBehavior(Context context, AttributeSet attrs) { 
    mContext = context; 
} 

@Override 
public boolean layoutDependsOn(CoordinatorLayout parent, RelativeLayout child, View dependency) { 
    return dependency instanceof AppBarLayout; 
} 

@Override 
public boolean onDependentViewChanged(CoordinatorLayout parent, RelativeLayout child, View dependency) { 
    child.measure(View.MeasureSpec.makeMeasureSpec(parent.getWidth(), View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(parent.getHeight(), View.MeasureSpec.AT_MOST)); 
    int maxScroll = ((AppBarLayout) dependency).getTotalScrollRange(); 
    float percentage = Math.abs(dependency.getY())/(float) maxScroll; 
    float childPosition = dependency.getHeight() 
      + dependency.getY() 
      - child.getMeasuredHeight() 
      - (getToolbarHeight() - child.getMeasuredHeight()) * percentage/2; 

    CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) child.getLayoutParams(); 
    child.setLayoutParams(lp); 

    child.setY(childPosition); 
    return true; 
} 

public int getToolbarHeight() { 
    int result = 0; 
    TypedValue tv = new TypedValue(); 
    if (mContext.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) { 
     result = TypedValue.complexToDimensionPixelSize(tv.data, mContext.getResources().getDisplayMetrics()); 
    } 
    return result; 
} 
} 

を使用して、ビューの動作をカスタマイズします。

activity_main.xml

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:id="@+id/coordinator_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true"> 

<android.support.design.widget.AppBarLayout 
    android:id="@+id/app_bar_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

    <android.support.design.widget.CollapsingToolbarLayout 
     android:id="@+id/collapsing_toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:fitsSystemWindows="true" 
     app:contentScrim="?attr/colorPrimary" 
     app:layout_scrollFlags="scroll|exitUntilCollapsed"> 

     <ImageView 
      android:id="@+id/image" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:fitsSystemWindows="true" 
      app:layout_collapseMode="parallax" /> 

    </android.support.design.widget.CollapsingToolbarLayout> 

</android.support.design.widget.AppBarLayout> 

<android.support.v4.widget.NestedScrollView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fillViewport="true" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

    <LinearLayout 
     android:id="@+id/llViewPager" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 

     <com.astuetz.PagerSlidingTabStrip 
      android:id="@+id/tabs" 
      android:layout_width="match_parent" 
      android:layout_height="48dp" 
      android:textColor="@color/red" 
      app:pstsShouldExpand="true" 
      app:pstsTextAllCaps="true" /> 

     <android.support.v4.view.ViewPager 
      android:id="@+id/viewpager" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="@android:color/white" /> 
    </LinearLayout> 
</android.support.v4.widget.NestedScrollView> 

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="com.stacktest.ViewBehavior"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_marginBottom="20dp" 
     android:layout_marginLeft="36dp" 
     android:layout_marginTop="20dp" 
     android:text="Text-1" /> 

    <TextView 
     android:id="@+id/txt2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_marginBottom="20dp" 
     android:layout_marginRight="36dp" 
     android:layout_marginTop="20dp" 
     android:text="Text-2" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@id/txt2" 
     android:layout_marginBottom="20dp" 
     android:layout_marginLeft="36dp" 
     android:paddingRight="20dp" 
     android:text="Text-3" /> 

    <TextView 
     android:id="@+id/txt4" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_below="@id/txt2" 
     android:layout_marginBottom="20dp" 
     android:layout_marginRight="36dp" 
     android:text="Text-4" /> 
</RelativeLayout> 
</android.support.design.widget.CoordinatorLayout> 

最後に、レイアウトを使用して、ActivityクラスにViewPagerとタブを作成します。

MainActivity.java

public class MainActivity extends AppCompatActivity { 

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

    ((CollapsingToolbarLayout) findViewById(R.id.collapsing_toolbar)).setTitle(" "); 

    ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager); 
    viewPager.setAdapter(new MyPagerAdapter(getSupportFragmentManager())); 

    PagerSlidingTabStrip tabsStrip = (PagerSlidingTabStrip) findViewById(R.id.tabs); 
    tabsStrip.setViewPager(viewPager); 
} 

public class MyPagerAdapter extends FragmentPagerAdapter { 
    final int PAGE_COUNT = 2; 
    private String tabTitles[] = new String[] { "Tab1", "Tab2" }; 

    public MyPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public int getCount() { 
     return PAGE_COUNT; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return TestFragment.newInstance(position + 1); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return tabTitles[position]; 
    } 
} 
} 

APPCOMPATとサポートライブラリと一緒にbuild.gradleに次の余分な依存関係を追加します。

  • com.android.support:design:23.2.1
  • com.astuetz:pagerslidingtabstrip:あなたは、タブを見ることができれば(ViewPagerタブ用)1.0.1
+0

これは*ほぼ*私が必要とするものです! 私はこれを投稿してから読んだチュートリアルでビヘイビアークラスを見ましたが、実際にイメージに適用することはできません。私の質問では、緑の色はイメージ(すなわちscale = fitXY)でなければならず、私はそれをbarlayoutとして「行為」するように縮小したいと思っています。 – crazyPixel

+0

scaleType = fitXYの画像をImageView(android:src)に追加します。削除** @ android:color/transparent ** from values-21/styles.xml –

1

、私はあなたの特定の質問に対する私の解決策を提供するつもりです。鍵はscrollFlagscollapseModeで作業することです。 が本当にの場合、appBarが展開されたときにタブを非表示にしたい場合は、視認性で再生できます。

<?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" 
android:id="@+id/main_content" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<android.support.design.widget.AppBarLayout 
    android:id="@+id/appBar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 
    <android.support.design.widget.CollapsingToolbarLayout 
     android:id="@+id/collapsing_toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:contentScrim="?attr/colorPrimary" 
     app:layout_scrollFlags="scroll|enterAlways|snap"> 

     <RelativeLayout 
      android:layout_marginTop="?attr/actionBarSize" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

      <ImageView 
       android:id="@+id/image" 
       android:layout_width="match_parent" 
       android:layout_height="375dp" 
       android:src="@drawable/ic_launcher"/> 

      <LinearLayout 
       android:layout_marginBottom="30dp" 
       android:layout_below="@+id/image" 
       android:layout_width="match_parent" 
       android:orientation="horizontal" 
       android:layout_height="wrap_content"> 

       <TextView 
        android:layout_marginLeft="30dp" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:textSize="20sp" 
        android:text="textView1"/> 

       <TextView 
        android:layout_marginLeft="140dp" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:textSize="20sp" 
        android:text="textView2"/> 

      </LinearLayout> 

     </RelativeLayout> 


     <android.support.v7.widget.Toolbar 
      android:id="@+id/mToolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
      app:layout_collapseMode="pin"/> 

    </android.support.design.widget.CollapsingToolbarLayout> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:orientation="horizontal" 
     android:layout_height="wrap_content"> 

     <TextView 
      android:layout_marginLeft="30dp" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="20sp" 
      android:text="textView3"/> 

     <TextView 
      android:layout_marginLeft="140dp" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="20sp" 
      android:text="textView4"/> 

    </LinearLayout> 

    <android.support.design.widget.TabLayout 
     android:id="@+id/tabLayout" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:layout_gravity="bottom" 
     android:background="?attr/colorPrimary" 
     app:tabMode="scrollable"/> 
</android.support.design.widget.AppBarLayout> 

<android.support.v4.view.ViewPager 
    android:id="@+id/tab_viewpager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

+0

ありがとうございます。しかし、私はimageviewにmatch_parentを持たせてCollapseingToolbarLayoutの背景にすることをお勧めします。 essentialy collapingtoolbarlayout(上部のbarlayoutを縮小する役割を果たす)のボトム部分のように動作するtouchイベントを持つにはimageviewが必要です – crazyPixel

+0

CollapsingToolbarLayoutの場合、最大の高さを設定する必要があります。必要ならばイメージビューでmatch_parentを設定できますが、イメージビューのレイアウトに高さを設定する必要があります。 touchイベントの場合は、画像にclickListenerを追加して、ツールバーをプログラマブルに閉じます(appBarLayout.setExpanded(true/false))。 –

+0

ここに似たものを得たいですか? http://saulmm.github .io/mastering-coordinator 背景画像ビューのみをフルスクリーンにして、スワイプ可能にします。 onclicklistenerを置くことは、私の問題を解決することはできません。なぜなら、この問題を忌み嫌う私の質問に答えることができないからです。 – crazyPixel

関連する問題