Android中解决WebView上下滑动监听问题

有些时候我们需要监听webview的滚动事件,但WebView没有直接监听滑动的方法,看WebView的源码则会发现有一个protected void onScrollChanged(int l, int t, int oldl, int oldt)方法。

这个方法。是受到保护的所以我们无法直接使用,所以我们写一个加强的WebView,重写onScrollChanged方法并利用接口回调。

public class NewWebView extends WebView{

 private OnScrollChangeListener mOnScrollChangeListener;

 public NewWebView(Context context, AttributeSet attrs) {
  super(context, attrs);
 }

 @Override
 protected void onScrollChanged(int l, int t, int oldl, int oldt) {
  super.onScrollChanged(l, t, oldl, oldt);
  // webview的高度
  float webcontent = getContentHeight() * getScale();
  // 当前webview的高度
  float webnow = getHeight() + getScrollY();
  if (Math.abs(webcontent - webnow) < 1) {
   //处于底端
   mOnScrollChangeListener.onPageEnd(l, t, oldl, oldt);
  } else if (getScrollY() == 0) {
   //处于顶端
   mOnScrollChangeListener.onPageTop(l, t, oldl, oldt);
  } else {
   mOnScrollChangeListener.onScrollChanged(l, t, oldl, oldt);
  }
 }

 public void setOnScrollChangeListener(OnScrollChangeListener listener) {
  this.mOnScrollChangeListener = listener;
 }

 public interface OnScrollChangeListener {

  public void onPageEnd(int l, int t, int oldl, int oldt);

  public void onPageTop(int l, int t, int oldl, int oldt);

  public void onScrollChanged(int l, int t, int oldl, int oldt); 

 }

}

使用:

public class NewsActivity extends AppCompatActivity {

 private NewsWebView mWebView;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_news);
  mWebView = (NewsWebView) findViewById(R.id.web_view);
  mWebView.setOnScrollChangeListener(new NewsWebView.OnScrollChangeListener() {
   @Override
   public void onPageEnd(int l, int t, int oldl, int oldt) {
    Logs.d("已经到达地端");
   }

   @Override
   public void onPageTop(int l, int t, int oldl, int oldt) {
    Logs.d("已经到达顶端");
   }

   @Override
   public void onScrollChanged(int l, int t, int oldl, int oldt) {
   }
  });

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android WebView的详解及实例

    Android WebView的详解       Android WebView在android平台上是一个特殊的View, 他能用来显示网页,这个类可以被用来在你的app中仅仅显示一张在线的网页,还可以用来开发浏览器. 在Android手机中内置了一款高性能webkit内核浏览器,在SDK中封装为一个叫做WebView组件.WebKit是Mac OS X v10.3及以上版本所包含的软件框 架(对v10.2.7及以上版本也可通过软件更新获取). 同时,WebKit也是Mac OS X的Safa

  • Android 5.1 WebView内存泄漏问题及快速解决方法

    问题背景 在排查项目内存泄漏过程中发现了一些由WebView引起的内存泄漏,经过测试发现该部分泄漏只会出现在android 5.1及以上的机型.虽然项目使用WebView的场景并不多,但秉承着一个泄漏都不放过的精神,我们肯定要把它给解决了. 遇到的问题 项目中使用WebView的页面主要在FAQ页面,问题也出现在多次进入退出时,发现内存占用大,GC频繁.使用LeakCanary观察发现有两个内存泄漏很频繁: 我们分析一下这两个泄漏: 从图一我们可以发现是WebView的ContentViewCo

  • Android WebView自定义长按选择实现收藏/分享选中文本功能

    效果图(1.3M) 一.前言 ** 戳这里可以去DEMO,来吧 ** 相信刚接触android不久的同志们,在面对产品提出的 : "自定义WebView页面中,长按文本的弹出选项.点击选择后,分享.转发.收藏选择文本" 这样的需求时,第一反应大部分是:这是系统行为,如果实现需要在web端实现. 但是web端实现的局限性太大,曾经也有过监听系统粘贴板,在用户点击复制的时候实现其他的逻辑,但是这样用户体验不好,所以自定义WebView中长按的弹出菜单,并在点击时返回选中文本的小控件闪亮登场

  • Android WebView 不支持 H5 input type="file" 解决方法

    最近因为赶项目进度,因此将本来要用原生控件实现的界面,自己做了H5并嵌入webview中.发现点击H5中 input type="file" 标签 不能打开android资源管理器. 通过网络搜索发现是因为 android webview 由于考虑安全原因屏蔽了 input type="file" 这个功能 . 经过不懈的努力,以及google 翻译的帮助 在 stackoverflow 中找到了解决的方法. 具体可以理解为 重写webview 的WebChrome

  • Android webview使用方法总结

    Android webview使用方法总结            这里对Android webview的几种用法进行了总结,提供了九种用法,都要简单实例,大家可以参考下: 1. 打开网页时不调用系统浏览器, 而是在本WebView中显示: mWebView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.

  • Android 解决WebView无法上传文件的问题

    Android 解决WebView无法上传文件的问题 Android原生的WebView并不支持上传文件,需要我们自己实现相应的方法.于是我把工作中的相关代码记录下来.下次直接拿来用就行了.一点一滴都是经验. 1.需要定义三个变量 private ValueCallback<Uri[]> uploadMessageAboveL; private final static int FILE_CHOOSER_RESULT_CODE = 10000; private ValueCallback<

  • Android WebView或手机浏览器打开连接问题解决办法总结

    Android WebView或手机浏览器打开连接问题解决办法总结 1.通常情况下 大家可能都想使用WebView打开网页内部链接而不想再调用手机浏览器, 我们可以通过以下两种方法实现: (1)为WebView设置一个WebViewClient,并重写shouldOverrideUrlLoading(WebView view, String url)方法. class MyWebViewClient extends WebViewClient { @Override public boolean

  • Android中解决WebView上下滑动监听问题

    有些时候我们需要监听webview的滚动事件,但WebView没有直接监听滑动的方法,看WebView的源码则会发现有一个protected void onScrollChanged(int l, int t, int oldl, int oldt)方法. 这个方法.是受到保护的所以我们无法直接使用,所以我们写一个加强的WebView,重写onScrollChanged方法并利用接口回调. public class NewWebView extends WebView{ private OnSc

  • Android开发之ScrollView的滑动监听

    我们需要监听ScroView的滑动情况,比如滑动了多少距离,是否滑到布局的顶部或者底部.可惜的是SDK并没有相应的方法,不过倒是提供了一个 protected void onScrollChanged(int l, int t, int oldl, int oldt) 显然这个方法是不能被外界调用的,因此就需要把它暴露出去,解决方式就是写一个接口 /** * Created by 刘楠 on 2016/8/21 0021.17:24 */ public interface ScrollViewL

  • android中DownloadManager实现版本更新,监听下载进度实例

    DownloadManager简介 DownloadManager是Android 2.3(API level 9)用系统服务(Service)的方式提供了DownloadManager来处理长时间的下载操作.它包含两个静态内部类DownloadManager.Query(用来查询下载信息)和DownloadManager.Request(用来请求一个下载). DownloadManager主要提供了下面几个方法: public long enqueue(Request request)把任务加

  • 全面解析Android中对EditText输入实现监听的方法

    在 Android design support 包中提供了一种在输入不合适字符时一直显示的提示方式来显示,现在已经开始在更多的应用上被使用了:这些 Android app 在显示他们的错误提示时采用的不同的方式常常让人感觉非常的不和谐. 即这个一直显示的错误消息是在 TextInputLayout 中的 EditText 周围的.这也是,作为一个奖励,提供了材料设计风格中,活泼的浮动标签在一个 APP 的用户体验中常常是最无聊的部分. 这里来讨论如何在你的输入表单上去创建一个通用的.可重用的组

  • Android中的webview监听每次URL变化实例

    通过这个可以监听Android中webview访问的URL变化: webView.setWebViewClient(new WebViewClient(){ @Override public void onLoadResource(WebView view, String url) { Log.e("hao","WebView3:"+view.getUrl()+"\\n"+" URL3:"+url); super.onLoad

  • Android 滑动监听的实例详解

    Android 滑动监听的实例详解 摘要: ScollBy,ScollTo是对内容的移动,view.ScollyBy是对view的内容的移动 view,ScollTo是对内容的移动(移动到指定位置),view.ScollyBy是对view的内容的移动(移动距离) 在次activity中,当手指点击TextView ,此时是ViewGroup 响应还是TextView响应呢? 代码实践: 在activity中重写onTouchEvent(): public boolean onTouchEvent

  • Android 滑动监听RecyclerView线性流+左右划删除+上下移动

    废话不多说了,直接给大家贴代码了.具体代码如下所示: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_wid

  • Android 中SwipeRefreshLayout与ViewPager滑动事件冲突解决方法

    Android 中SwipeRefreshLayout与ViewPager滑动事件冲突解决方法 问题描述: 开发中发现,SwipeRefreshLayout的下拉刷新,与ViewPager开发的banner的左右滑动事件有一点冲突,导致banner的左右滑动不够顺畅.很容易在banner的左右滑动的过程中,触发SwipeRefreshLayout的下拉刷新,从而导致banner左右滑动的体验很差. 解决方案: 可以在ViewPager的滑动时候设置SwipeRefreshLayout暂时不可用,

  • Android中解决页签手指按下从左到右滑动的bug

    有一种方法可以阻止父层的View截获touch事件,就是调用 getParent().requestDisallowInterceptTouchEvent(true);方法. 一旦底层View收到touch的 action后调用这个方法那么父层View就不会再调用onInterceptTouchEvent了,也无法截获以后的action 在ViewPagerIndicator项目中找到TabPageIndicator该类,添加如下代码 @Override public boolean dispa

  • Android中Toolbar随着ScrollView滑动透明度渐变效果实现

    Android中Toolbar随着ScrollView滑动透明度渐变效果实现 一.思路:监听ScrollView的滑动事件 不断的修改Toolbar的透明度 二.注意 1.ScrollView 6.0以前没有scrollView.setOnScrollChangeListener(l)方法  所以要自定义ScrollView 在onScrollChanged()中监听 2.ScrollView 6.0(23)以前没有scrollView.setOnScrollChangeListener()方法

随机推荐