[英]How to scroll a ListView without using NestedScrollView?
[英]How to hide and show FAB on scroll of webview without using nestedScrollView
這是我的XML布局中的一個浮動操作按鈕。
我在NestedScrollView中的Webview導致收縮縮放支持崩潰。
<android.support.design.widget.FloatingActionButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:src="@drawable/filter_icon"
android:tint="#FFFFFF"
app:backgroundTint="@color/colorPrimary"
app:elevation="4dp"
app:fabSize="normal"
app:useCompatPadding="true"
app:layout_anchorGravity="bottom|end|right"
app:layout_behavior=".ScrollAwareFABBehavior">
</android.support.design.widget.FloatingActionButton>
完整的工作代碼,無需使用NestedScrollView即可隱藏和顯示Webview滾動上的FAB。
public class NestedWebView extends WebView {
private OnScrollChangedCallback mOnScrollChangedCallback;
public NestedWebView(Context context) {
super(context);
}
public NestedWebView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public NestedWebView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (mOnScrollChangedCallback != null) {
mOnScrollChangedCallback.onScrollChange(this, l, t, oldl, oldt);
}
}
public void setOnScrollChangedCallback(final OnScrollChangedCallback mOnScrollChangedCallback) {
this.mOnScrollChangedCallback = mOnScrollChangedCallback;
}
public OnScrollChangedCallback getOnScrollChangedCallback() {
return mOnScrollChangedCallback;
}
public interface OnScrollChangedCallback {
/**
* Called when the scroll position of a view changes.
*
* @param v The view whose scroll position has changed.
* @param scrollX Current horizontal scroll origin.
* @param scrollY Current vertical scroll origin.
* @param oldScrollX Previous horizontal scroll origin.
* @param oldScrollY Previous vertical scroll origin.
*/
void onScrollChange(WebView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY);
}
}
在xml中使用這樣的自定義Webview,
<com.essence.linuxcommands.NestedWebView
android:id="@+id/myWebView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:elevation="@dimen/card_margin"
android:scrollbarStyle="outsideOverlay"
android:shadowRadius="2"
android:visibility="gone"
/>
活動中或片段中
NestedWebView webview = (NestedWebView) rootView.findViewById(R.id.myWebView);
webview.setOnScrollChangedCallback(new NestedWebView.OnScrollChangedCallback() {
@Override
public void onScrollChange(WebView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
if (scrollY > oldScrollY && scrollY > 0) {
fab.hide();
}
if (scrollY < oldScrollY) {
fab.show();
}
}
});
行為班
public class ScrollAwareFABBehavior extends FloatingActionButton.Behavior {
public ScrollAwareFABBehavior() {
super();
}
public ScrollAwareFABBehavior(Context context, AttributeSet attrs) {
super(context, attrs);
}
private int mXonTouchDown;
private int mXonTouchUp;
@Override
public boolean onInterceptTouchEvent(CoordinatorLayout parent, FloatingActionButton child, MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
mXonTouchDown = (int) ev.getY();
} else if (ev.getAction() == MotionEvent.ACTION_UP) {
mXonTouchUp = (int) ev.getY();
}
if(mXonTouchDown > mXonTouchUp)
child.hide();
else
child.show();
return super.onInterceptTouchEvent(parent, child, ev);
}
}
您可以做到這一點創建新的類名稱TouchyWebView
package your.package.name;
public class TouchyWebView extends WebView {
public TouchyWebView(Context context) {
super(context);
}
public TouchyWebView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public TouchyWebView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
requestDisallowInterceptTouchEvent(true);
int action = event.getActionMasked();
String TAG = ActivityName.class.getSimpleName();
float initialX = 0, initialY = 0;
switch (action) {
case MotionEvent.ACTION_DOWN:
initialX = event.getX();
initialY = event.getY();
Log.d(TAG, "Action was DOWN");
break;
case MotionEvent.ACTION_MOVE:
Log.d(TAG, "Action was MOVE");
break;
case MotionEvent.ACTION_UP:
float finalX = event.getX();
float finalY = event.getY();
Log.d(TAG, "Action was UP");
if (initialX < finalX) {
Log.d(TAG, "Left to Right swipe performed");
}
if (initialX > finalX) {
Log.d(TAG, "Right to Left swipe performed");
}
if (initialY < finalY) {
Log.d(TAG, "Up to Down swipe performed");
// hide or show fab button here?
//fab.hide();
}
if (initialY > finalY) {
Log.d(TAG, "Down to Up swipe performed");
// hide or show fab button here?
//fab.show();
}
break;
case MotionEvent.ACTION_CANCEL:
Log.d(TAG, "Action was CANCEL");
break;
case MotionEvent.ACTION_OUTSIDE:
Log.d(TAG, "Movement occurred outside bounds of current screen element");
break;
}
return super.onTouchEvent(event);
}
}
現在,而不是使用新創建的XML的Webview,如下所示
您的WebView:
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
替換為:
<your.package.name.TouchyWebView
android:id="@+id/description_web"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
現在您的webview對象就像
WebView webview = (WebView)findViewById(R.id.webView);
改成
TouchyWebView touchyWebView = (TouchyWebView) findViewById(R.id.description_web);
final FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.myFAB);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
webview.setOnScrollChangeListener(new View.OnScrollChangeListener() {
@Override
public void onScrollChange(View Webview,int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
if (scrollY > oldScrollY && scrollY > 0) {
fab.hide();
}
if (scrollY < oldScrollY) {
fab.show();
}
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.