ScrollViewネストWebView WebView自動スクロールの問題
2359 ワード
最近のプロジェクトではWebViewが使用され、下部にはオリジナルのコンテンツが表示されます.そこでScrollViewでWebViewをネストすることを思いつき、
WebViewの高さを固定し,WebViewをスライドして臨界値までスライドイベントを交換しようとしたが,いくつかの小さな問題が発見された.Ps:WebViewが完全にロードされていない場合、WebViewの下部にオリジナルのコンテンツが表示されます.また、WebViewの上部にスライドして下部交換スライドイベントを取得すると、カートンが発生し、連動の効果がなく、ユーザー体験に影響します.
WebViewのコンテンツを動的に取得してWebViewの高さを設定する方法は、別の方法でしかありません.
スライドイベントはScrolViewコントロールに渡されます.しかし、この時点で問題に直面して長い間困っていました.WebViewをロードすると、WebViewは上部ではなく自動的に領域にスクロールします.
WebViewのロードの進捗状況を監視し、100%になるとトップにスクロールするように設定したが、自動スクロールはロードが完了した後に発生するため、まだ問題があることが分かった.その後、気がつけば、ViewPager+Fragment+RecyclerViewを思い浮かべると、RecyclerViewが自動的にスクロールすることがあります.WebViewが焦点を占めている可能性があるための自動スクロールを思い浮かべ、WebViewの親レイアウトに行を追加しました.
descendantFocusabilityの役割については、前のブログを見てみましょう.https://blog.csdn.net/ZuoZuoShengHen/article/details/85009176
WebViewの高さを固定し,WebViewをスライドして臨界値までスライドイベントを交換しようとしたが,いくつかの小さな問題が発見された.Ps:WebViewが完全にロードされていない場合、WebViewの下部にオリジナルのコンテンツが表示されます.また、WebViewの上部にスライドして下部交換スライドイベントを取得すると、カートンが発生し、連動の効果がなく、ユーザー体験に影響します.
WebViewのコンテンツを動的に取得してWebViewの高さを設定する方法は、別の方法でしかありません.
javascript:MyApp.resize(document.body.getBoundingClientRect().height);
@JavascriptInterface
public void resize(final float height) {
mWebView.post(new Runnable() {
@Override
public void run() {
if (mWebView != null) {
ViewGroup.LayoutParams params = mWebView.getLayoutParams();
params.width = getResources().getDisplayMetrics().widthPixels;
params.height = (int) (height * getResources().getDisplayMetrics().density);
mWebView.setLayoutParams(params);
}
}
});
}
もちろんonDrawメソッドを傍受してWebViewのコンテンツの変化を傍受してWebViewの高さを変える必要があります.@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (getContentHeight() != lastContentHeight) {
lastContentHeight = getContentHeight();
if (mOnContentChangeListener != null) {
mOnContentChangeListener.onContentChange();
}
}
}
mWebView.setOnContentChangeListener(new CustomWebView.OnContentChangeListener() {
@Override
public void onContentChange() {
if (mWebView != null) {
mWebView.loadUrl("javascript:MyApp.resize(document.body.getBoundingClientRect().height)");
}
}
});
スライドイベントはScrolViewコントロールに渡されます.しかし、この時点で問題に直面して長い間困っていました.WebViewをロードすると、WebViewは上部ではなく自動的に領域にスクロールします.
WebViewのロードの進捗状況を監視し、100%になるとトップにスクロールするように設定したが、自動スクロールはロードが完了した後に発生するため、まだ問題があることが分かった.その後、気がつけば、ViewPager+Fragment+RecyclerViewを思い浮かべると、RecyclerViewが自動的にスクロールすることがあります.WebViewが焦点を占めている可能性があるための自動スクロールを思い浮かべ、WebViewの親レイアウトに行を追加しました.
android:descendantFocusability="blocksDescendants"
解決したことに気づいた!不思議、ははは!descendantFocusabilityの役割については、前のブログを見てみましょう.https://blog.csdn.net/ZuoZuoShengHen/article/details/85009176