Qad*_*ain 43 android custom-controls scrollview webview
如何WebView
在Android中实现Scroll Listener
我试过这个,但它没有调用我Log.i
滚动webview.
package com.example.webview.full.width;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.webkit.WebView;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
public class scorllableWebview extends WebView implements OnScrollListener {
Context ctx;
AttributeSet atrs;
public scorllableWebview(Context context) {
super(context);
ctx = context;
}
public scorllableWebview(Context context, AttributeSet atters){
super(context, atters);
ctx = context;
atrs = atters;
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
Log.i("onScroll", "Called");
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
Log.i("onScrollStateChanged", "Called");
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的 MainActivity.java
package com.example.webview.full.width;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.Menu;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;
public class MainActivity extends Activity {
ProgressDialog progressDialog;
scorllableWebview wv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
wv = (scorllableWebview) findViewById(R.id.scorllableWebview);
wv.getSettings().setJavaScriptEnabled(true);
wv.getSettings().setBuiltInZoomControls(true);
wv.getSettings().supportZoom();
progressDialog = ProgressDialog.show(MainActivity.this,
"Loading Book...!", "Please Wait");
progressDialog.setCancelable(true);
String htnlString = "<!DOCTYPE html><html><body style = \"text-align:center\"><script type=\"text/javascript\">for(a=1;a<=10;a++)document.write('<img style=\"border-style:dotted;border-width:10px;border-color:black;\"src=\"http://myURL.com/books_snaps/EN567/'+a+'.jpg\" alt=\"Page Not Found\"/>');</script></body></html>";
// width=\"100%\"
wv.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
progressDialog.dismiss();
Toast.makeText(MainActivity.this, "Completed",
Toast.LENGTH_SHORT).show();
wv.pageUp(true);
super.onPageFinished(view, url);
}
});
wv.loadDataWithBaseURL(null, htnlString, "text/html", "UTF-8", null);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的XML文件.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.example.webview.full.width.scorllableWebview
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scorllableWebview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
Chr*_*ins 86
就像是:
public class ObservableWebView extends WebView
{
private OnScrollChangedCallback mOnScrollChangedCallback;
public ObservableWebView(final Context context)
{
super(context);
}
public ObservableWebView(final Context context, final AttributeSet attrs)
{
super(context, attrs);
}
public ObservableWebView(final Context context, final AttributeSet attrs, final int defStyle)
{
super(context, attrs, defStyle);
}
@Override
protected void onScrollChanged(final int l, final int t, final int oldl, final int oldt)
{
super.onScrollChanged(l, t, oldl, oldt);
if(mOnScrollChangedCallback != null) mOnScrollChangedCallback.onScroll(l, t, oldl, oldt);
}
public OnScrollChangedCallback getOnScrollChangedCallback()
{
return mOnScrollChangedCallback;
}
public void setOnScrollChangedCallback(final OnScrollChangedCallback onScrollChangedCallback)
{
mOnScrollChangedCallback = onScrollChangedCallback;
}
/**
* Impliment in the activity/fragment/view that you want to listen to the webview
*/
public static interface OnScrollChangedCallback
{
public void onScroll(int l, int t, int oldl, int oldt);
}
}
Run Code Online (Sandbox Code Playgroud)
应该工作,这是未经测试的,但这适用于Android中的几乎所有其他视图.
你会实现如下:
wv = (ObservableWebView) findViewById(R.id.scorllableWebview);
wv.setOnScrollChangedCallback(new OnScrollChangedCallback(){
public void onScroll(int l, int t, int oldl, int oldt){
if(t> oldt){
//Do stuff
System.out.println("Swipe UP");
//Do stuff
}
else if(t< oldt){
System.out.println("Swipe Down");
}
Log.d(TAG,"We Scrolled etc...");
}
});
Run Code Online (Sandbox Code Playgroud)
Alé*_*lho 21
从API 23开始,您不再需要这样做了,您可以使用 所有视图上可用的新OnScrollChangeListener,包括在WebView上.但是,由于您仍需要支持旧版本,您仍然可以使用@ Chris.Jenkins的建议.我对提议的类进行了一些调整,使其与新的OnScrollChangeListener接口"更兼容":
public class ObservableWebView extends WebView {
private OnScrollChangeListener onScrollChangeListener;
public ObservableWebView(Context context) {
super(context);
}
public ObservableWebView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ObservableWebView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (onScrollChangeListener != null) {
onScrollChangeListener.onScrollChange(this, l, t, oldl, oldt);
}
}
public void setOnScrollChangeListener(OnScrollChangeListener onScrollChangeListener) {
this.onScrollChangeListener = onScrollChangeListener;
}
public OnScrollChangeListener getOnScrollChangeListener() {
return onScrollChangeListener;
}
public interface OnScrollChangeListener {
/**
* 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);
}
}
Run Code Online (Sandbox Code Playgroud)
无需扩展 WebView。关于什么:
webView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
Log.v(TAG, "+++ scrollchanged "+webView.getScrollY());
}
});
Run Code Online (Sandbox Code Playgroud)
这是已接受答案的更优雅的 Kotlin 版本
class ObservableWebView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : WebView(context, attrs, defStyleAttr) {
var scrollListener: WebViewScrollListener? = null
override fun onScrollChanged(scrollX: Int, scrollY: Int, oldScrollX: Int, oldScrollY: Int) {
super.onScrollChanged(scrollX, scrollY, oldScrollX, oldScrollY)
when {
scrollY > oldScrollY -> scrollListener?.onScrollDown()
scrollY < oldScrollY -> scrollListener?.onScrollUp()
}
scrollListener?.onScroll(scrollX, scrollY, oldScrollX, oldScrollY)
}
}
interface WebViewScrollListener{
fun onScroll(scrollX: Int, scrollY: Int, oldScrollX: Int, oldScrollY: Int)
fun onScrollDown()
fun onScrollUp()
}
Run Code Online (Sandbox Code Playgroud)