在Chrome中,当用户向上/向下滑动内容时,地址栏将被隐藏/显示。
我可以为我的应用程序实现类似的逻辑吗?
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
tools:ignore="MergeRootFrame">
<WebView
android:id="@+id/my_webview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
我想知道我是否可以通过以下代码执行任何操作,以便在用户向上/向下滑动webView时隐藏/显示ActionBar。
WebView webView = (WebView) findViewById(R.id.my_webview);
webView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch (View v, MotionEvent event) {
webView.onTouchEvent(event);
}
});
答案 0 :(得分:5)
答案 1 :(得分:2)
首先,您需要使用 alignParentBottom 和 match_parent WebView以及顶部的某个栏进行布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffff" >
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentBottom="true" />
<RelativeLayout
android:id="@+id/actionBar"
android:layout_width="match_parent"
android:layout_height="50dp" >
<TextView
android:id="@+id/tvTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="TextView" />
</RelativeLayout>
</RelativeLayout>
然后你需要代码:
1)声明并设置一些内部值并调整大小 WebView使其低于我们的栏:
private int baseHeight;
private int webViewOnTouchHeight;
private int barHeight;
private float heightChange;
private float startEventY;
barHeight = actionBar.getMeasuredHeight();
baseHeight = getView().getMeasuredHeight();
webView.getLayoutParams().height = webView.getMeasuredHeight() - barHeight;
webView.requestLayout();
webView.setOnTouchListener(listener);
2)创建调整大小的方法。在这里,我们检查屏幕顶部和条形高度限制的新高度
private boolean resizeView(float delta) {
heightChange = delta;
int newHeight = (int)(webViewOnTouchHeight - delta);
if (newHeight > baseHeight){ // scroll over top
if (webView.getLayoutParams().height < baseHeight){
webView.getLayoutParams().height = baseHeight;
webView.requestLayout();
return true;
}
}else if (newHeight < baseHeight - barHeight){ // scroll below bar
if (webView.getLayoutParams().height > baseHeight - barHeight){
webView.getLayoutParams().height = baseHeight - barHeight;
webView.requestLayout();
return true;
}
} else { // scroll between top and bar
webView.getLayoutParams().height = (int)(webViewOnTouchHeight - delta);
webView.requestLayout();
return true;
}
return false;
}
3)创建自定义onTouch侦听器,我们将调整大小 WebView和更改我们栏的Y值
private OnTouchListener listener = new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
startEventY = event.getY();
heightChange = 0;
webViewOnTouchHeight = webView.getLayoutParams().height;
break;
case MotionEvent.ACTION_MOVE:
float delta = (event.getY()+heightChange)-startEventY;
boolean heigthChanged = resizeView(delta);
if (heigthChanged){
actionBar.setTranslationY(baseHeight - webView.getLayoutParams().height - barHeight);
}
}
return false;
}
};
答案 2 :(得分:0)
现在有一种非常简洁的方法可以在不使用设计支持库编写任何Java代码的情况下完成此任务。请参阅下面的Dhir Pratap答案:
(我会把它作为评论,但我没有足够的代表。)
How to Hide ActionBar/Toolbar While Scrolling Down in Webview
<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">
<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.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:layout_scrollFlags="scroll|enterAlways"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</android.support.design.widget.AppBarLayout>
<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"
android:layout_gravity="fill_vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</android.support.v4.widget.NestedScrollView>
</android.support.design.widget.CoordinatorLayout>
答案 3 :(得分:-2)
尝试以下代码,希望它适合您:
private void init(){
WebView web = new WebView(this);
final Context context = this;
web.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View arg0, MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// show action bar
((Activity) context).getActionBar().show();
break;
case MotionEvent.ACTION_UP:
// hide action bar
((Activity) context).getActionBar().hide();
break;
default:
break;
}
return false;
}
});
}