如何在 CollapsingToolbar 中制作可滚动的 TextView?
How do I make a Scrollable TextView inside CollapsingToolbar?
-
android
-
coordinator-layout
-
android-coordinatorlayout
-
android-collapsingtoolbarlayout
-
android-appbarlayout
我目前正在试验 CoordinatorLayout + AppbarLayout + CollapsingToolbarLayout 的方式:
1) 使用 "Toolbar" [无嵌套 ScrollView/RecyclerView] 向下滚动 Appbar。
2) 应用栏下方的内容应随着应用栏的滚动而移动。
3) 多张图片保存在 ViewPager 下。
4) ViewPager 中的最后一项将是文本视图。
我使用以下布局实现了 1) 和 2) :
<?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:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools">
<android.support.design.widget.AppBarLayout
android:id="@+id/flexible.example.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/flexible.example.collapsing"
android:layout_width="match_parent"
android:layout_height="300dp"
app:expandedTitleMarginBottom="94dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
app:contentScrim="?colorPrimary"
>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:id="@+id/text_sample"
android:scrollbars="vertical"
android:scrollIndicators="right"
app:layout_collapseMode="parallax"
app:layout_scrollFlags="scroll|enterAlways"
android:layout_gravity="center"
android:nestedScrollingEnabled="true"
/>
</android.support.design.widget.CollapsingToolbarLayout>
<android.support.v7.widget.Toolbar
android:id="@+id/ioexample.toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/PM01"
android:elevation="4dp"
app:layout_collapseMode="pin"
app:layout_anchor="@id/flexible.example.collapsing"
app:layout_anchorGravity="bottom"
app:theme="@style/ThemeOverlay.AppCompat.Light"
style="@style/ToolBarWithNavigationBack"
app:layout_scrollFlags="scroll|enterAlways|snap"
>
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/recyclerviewcontainer"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>
我现在想要实现的是使 collpasingtoolbarlayout 内的文本视图可滚动(上面的#4)。由于我的搜索到现在让我相信 Appbar 正在自行处理所有触摸事件,这似乎并不容易。但由于这是一项要求,我很乐意获得指导/指点来帮助我完成这项工作。
有人可以告诉我要实现此功能的内容和位置。
经过大量研究并通过 SO 进行更多搜索后,我知道我需要做什么才能达到预期效果:
1) 为 appbarlayout 实现自定义行为:
public class AppBarLayoutCustomBehavior extends AppBarLayout.Behavior {
private boolean setIntercept = false;
private boolean lockAppBar = false;
DragCallback mDragCallback = new DragCallback() {
@Override
public boolean canDrag(@NonNull AppBarLayout appBarLayout) {
return !lockAppBar;
}
};
@Override
public boolean onInterceptTouchEvent(CoordinatorLayout parent, AppBarLayout child, MotionEvent ev) {
super.onInterceptTouchEvent(parent, child, ev);
return setIntercept;
}
public void setInterceptTouchEvent(boolean set) {
setIntercept = set;
}
public AppBarLayoutCustomBehavior() {
super();
setDragCallback(mDragCallback);
}
public AppBarLayoutCustomBehavior(Context ctx, AttributeSet attributeSet) {
super(ctx, attributeSet);
setDragCallback(mDragCallback);
}
public void lockAppBar() {
lockAppBar = true;
}
public void unlockAppBar() {
lockAppBar = false;
}
}
2) 将此自定义行为与应用栏一起使用:
CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appBarLayout.getLayoutParams();
final AppBarLayoutCustomBehavior mBehavior = new AppBarLayoutCustomBehavior();
lp.setBehavior(mBehavior);
/// use toolbar to enable/disable dragging on the appbar behavior. This way
/// out toolbar acts as a drag handle for the app bar.
Toolbar toolbar = (Toolbar) activity.findViewById(R.id.main_toolbar);
toolbar.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
mBehavior.setInterceptTouchEvent(true);
return true;
case MotionEvent.ACTION_CANCEL:
mBehavior.setInterceptTouchEvent(false);
return true;
}
return false;
}
});
3) 设置textview的移动方式使其可滚动
textView.setMovementMethod(ScrollingMovementMethod.getInstance());
android
coordinator-layout
android-coordinatorlayout
android-collapsingtoolbarlayout
android-appbarlayout
我目前正在试验 CoordinatorLayout + AppbarLayout + CollapsingToolbarLayout 的方式:
1) 使用 "Toolbar" [无嵌套 ScrollView/RecyclerView] 向下滚动 Appbar。
2) 应用栏下方的内容应随着应用栏的滚动而移动。
3) 多张图片保存在 ViewPager 下。
4) ViewPager 中的最后一项将是文本视图。
我使用以下布局实现了 1) 和 2) :
<?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:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools">
<android.support.design.widget.AppBarLayout
android:id="@+id/flexible.example.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/flexible.example.collapsing"
android:layout_width="match_parent"
android:layout_height="300dp"
app:expandedTitleMarginBottom="94dp"
app:layout_scrollFlags="scroll|exitUntilCollapsed|snap"
app:contentScrim="?colorPrimary"
>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:id="@+id/text_sample"
android:scrollbars="vertical"
android:scrollIndicators="right"
app:layout_collapseMode="parallax"
app:layout_scrollFlags="scroll|enterAlways"
android:layout_gravity="center"
android:nestedScrollingEnabled="true"
/>
</android.support.design.widget.CollapsingToolbarLayout>
<android.support.v7.widget.Toolbar
android:id="@+id/ioexample.toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="@color/PM01"
android:elevation="4dp"
app:layout_collapseMode="pin"
app:layout_anchor="@id/flexible.example.collapsing"
app:layout_anchorGravity="bottom"
app:theme="@style/ThemeOverlay.AppCompat.Light"
style="@style/ToolBarWithNavigationBack"
app:layout_scrollFlags="scroll|enterAlways|snap"
>
</android.support.v7.widget.Toolbar>
</android.support.design.widget.AppBarLayout>
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/recyclerviewcontainer"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>
我现在想要实现的是使 collpasingtoolbarlayout 内的文本视图可滚动(上面的#4)。由于我的搜索到现在让我相信 Appbar 正在自行处理所有触摸事件,这似乎并不容易。但由于这是一项要求,我很乐意获得指导/指点来帮助我完成这项工作。
有人可以告诉我要实现此功能的内容和位置。
经过大量研究并通过 SO 进行更多搜索后,我知道我需要做什么才能达到预期效果:
1) 为 appbarlayout 实现自定义行为:
public class AppBarLayoutCustomBehavior extends AppBarLayout.Behavior {
private boolean setIntercept = false;
private boolean lockAppBar = false;
DragCallback mDragCallback = new DragCallback() {
@Override
public boolean canDrag(@NonNull AppBarLayout appBarLayout) {
return !lockAppBar;
}
};
@Override
public boolean onInterceptTouchEvent(CoordinatorLayout parent, AppBarLayout child, MotionEvent ev) {
super.onInterceptTouchEvent(parent, child, ev);
return setIntercept;
}
public void setInterceptTouchEvent(boolean set) {
setIntercept = set;
}
public AppBarLayoutCustomBehavior() {
super();
setDragCallback(mDragCallback);
}
public AppBarLayoutCustomBehavior(Context ctx, AttributeSet attributeSet) {
super(ctx, attributeSet);
setDragCallback(mDragCallback);
}
public void lockAppBar() {
lockAppBar = true;
}
public void unlockAppBar() {
lockAppBar = false;
}
}
2) 将此自定义行为与应用栏一起使用:
CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams)appBarLayout.getLayoutParams();
final AppBarLayoutCustomBehavior mBehavior = new AppBarLayoutCustomBehavior();
lp.setBehavior(mBehavior);
/// use toolbar to enable/disable dragging on the appbar behavior. This way
/// out toolbar acts as a drag handle for the app bar.
Toolbar toolbar = (Toolbar) activity.findViewById(R.id.main_toolbar);
toolbar.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
mBehavior.setInterceptTouchEvent(true);
return true;
case MotionEvent.ACTION_CANCEL:
mBehavior.setInterceptTouchEvent(false);
return true;
}
return false;
}
});
3) 设置textview的移动方式使其可滚动
textView.setMovementMethod(ScrollingMovementMethod.getInstance());