android 监听webView滑动距离和标题栏颜色渐变

重写webView之 X5WebView

 

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.AbsoluteLayout;
import android.widget.FrameLayout;
import android.widget.ProgressBar;
import android.widget.TextView;

import com.tencent.smtt.sdk.WebSettings;
import com.tencent.smtt.sdk.WebView;
import com.tencent.smtt.sdk.WebViewClient;
import com.yuanxin.clan.R;
import com.yuanxin.clan.core.app.UserNative;
import com.yuanxin.clan.core.company.utils.MyWebChromeClient;
import com.yuanxin.clan.core.util.FastJsonUtils;
import com.yuanxin.clan.mvp.entity.UserAgentParam;
import com.yuanxin.clan.mvp.utils.CommonString;

import java.util.ArrayList;
import java.util.List;

public class X5WebView extends WebView {
   private ProgressBar progressbar;  //进度条
   private int progressHeight = 10;  //进度条的高度,默认10px
   TextView title;
   private ActionMode mActionMode;
   private List<String> mActionList = new ArrayList<>();
   private WebViewClient client = new WebViewClient() {
      /**
       * 防止加载网页时调起系统浏览器
       */
      public boolean shouldOverrideUrlLoading(WebView view, String url) {
         view.loadUrl(url);
         return true;
      }

        // 重写 WebViewClient  的  shouldInterceptRequest ()
        // API 21 以下用shouldInterceptRequest(WebView view, String url)
        // API 21 以上用shouldInterceptRequest(WebView view, WebResourceRequest request)
        // 下面会详细说明

        // API 21 以下用shouldInterceptRequest(WebView view, String url)
//        @Override
//        public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
//            if (url.contains("jquery.js"))
//       {
//          String localPath = url.replaceFirst("^http.*[tag]\\]", "");
//          try
//          {
//             InputStream is = getContext().getAssets().open(localPath);
//             String mimeType = "text/javascript";
//             if (localPath.endsWith("css"))
//             {
//                mimeType = "text/css";
//             }
//             return new WebResourceResponse(mimeType, "UTF-8", is);
//          }
//          catch (Exception e)
//          {
//             e.printStackTrace();
//          }
//       }
//            return super.shouldInterceptRequest(view, url);
//        }
//
//
//        // API 21 以上用shouldInterceptRequest(WebView view, WebResourceRequest request)
//        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
//        @Override
//        public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
//            String url = request.getUrl().toString();
//            if (url.contains("[tag]"))
//            {
//                String localPath = url.replaceFirst("^http.*[tag]\\]", "");
//                try
//                {
//                    InputStream is = getContext().getAssets().open(localPath);
//                    String mimeType = "text/javascript";
//                    if (localPath.endsWith("css"))
//                    {
//                        mimeType = "text/css";
//                    }
//                    return new WebResourceResponse(mimeType, "UTF-8", is);
//                }
//                catch (Exception e)
//                {
//                    e.printStackTrace();
//                }
//            }
//            return super.shouldInterceptRequest(view, request);
//        }
   };
   public OnScrollListener listener;
   /**
    * This is called in response to an internal scroll in this view (i.e., the
    * view scrolled its own contents). This is typically as a result of
    * {@link #scrollBy(int, int)} or {@link #scrollTo(int, int)} having been
    * called.
    *
    * @param l Current horizontal scroll origin.
    * @param t Current vertical scroll origin.
    * @param oldl Previous horizontal scroll origin.
    * @param oldt Previous vertical scroll origin.
    */
   @Override
   protected void onScrollChanged(int l, int t, int oldl, int oldt) {
      super.onScrollChanged(l, t, oldl, oldt);

      if (listener != null){
         if (t - oldt <= 2){
            listener.onScrollDown();
         }
         if(oldt - t >= 2) {
            listener.onScrollUp();
         }
         listener.scrollHeight(t);
      }
   }
   public void setListener(OnScrollListener listener){
      this.listener = listener;
   }

   public interface OnScrollListener{
      void onScrollUp();//上滑
      void onScrollDown();//下滑
      void scrollHeight(int h);
   }
   //这两个方法会在用户长按选择web文本时,在弹出菜单前被调用。
   @Override
   public ActionMode startActionMode(ActionMode.Callback callback) {
      ActionMode actionMode = startActionMode(callback);
      Log.e("hxw", actionMode.toString());
      return resolveActionMode(actionMode);
   }

   @Override
   public ActionMode startActionMode(ActionMode.Callback callback, int type) {
      ActionMode actionMode = startActionMode(callback, type);
      Log.e("hxw", actionMode.toString() + " " + type);
      return resolveActionMode(actionMode);
   }

   //处理item,处理点击
   private ActionMode resolveActionMode(ActionMode actionMode) {
      if (actionMode != null) {
         final Menu menu = actionMode.getMenu();
         mActionMode = actionMode;
         menu.clear();
         Log.e("hxw", mActionList.toString());
         for (int i = 0; i < mActionList.size(); i++) {
            menu.add(mActionList.get(i));
         }
         for (int i = 0; i < menu.size(); i++) {
            MenuItem menuItem = menu.getItem(i);
            menuItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
               @Override
               public boolean onMenuItemClick(MenuItem item) {
                  // getSelectedData((String) item.getTitle());
                  // releaseAction();

                  return true;
               }
            });
         }
      }
      mActionMode = actionMode;
      return actionMode;
   }
   //设置弹出action列表

   public void setActionList(List<String> actionList) {
      mActionList = actionList;
   }

   @SuppressLint("SetJavaScriptEnabled")
   public X5WebView(Context arg0, AttributeSet arg1) {
      super(arg0, arg1);
      initWebViewSettings(arg0);
      this.setWebViewClient(client);
      this.setWebChromeClient(new MyWebChromeClient(arg0, progressbar));
      // this.setWebChromeClient(chromeClient);
      // WebStorage webStorage = WebStorage.getInstance();
      this.getView().setClickable(true);
   }

   public void setProgressbarDrawable(Drawable d) {
      progressbar.setProgressDrawable(d);
   }

   private void initWebViewSettings(Context context) {
      //创建进度条
      progressbar = new ProgressBar(context, null,
            android.R.attr.progressBarStyleHorizontal);
      //设置加载进度条的高度
      progressbar.setLayoutParams(new AbsoluteLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, progressHeight, 0, 0));

      Drawable drawable = context.getResources().getDrawable(R.drawable.progressbar_blue);
      progressbar.setProgressDrawable(drawable);

      //添加进度到WebView
      addView(progressbar);


      WebSettings webSetting = this.getSettings();
      webSetting.setJavaScriptEnabled(true);
      webSetting.setJavaScriptCanOpenWindowsAutomatically(true);
      webSetting.setAllowFileAccess(true);
      webSetting.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
      webSetting.setSupportZoom(true);
      webSetting.setBuiltInZoomControls(true);
      webSetting.setUseWideViewPort(true);
      webSetting.setSupportMultipleWindows(true);
      // webSetting.setLoadWithOverviewMode(true);
      webSetting.setAppCacheEnabled(false);
      // webSetting.setDatabaseEnabled(true);
      webSetting.setDomStorageEnabled(true);
      webSetting.setGeolocationEnabled(true);
      webSetting.setAppCacheMaxSize(Long.MAX_VALUE);
      webSetting.setTextSize(WebSettings.TextSize.NORMAL);
      // webSetting.setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);
      webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND);
      // webSetting.setRenderPriority(WebSettings.RenderPriority.HIGH);
      webSetting.setCacheMode(WebSettings.LOAD_DEFAULT);
      webSetting.setDisplayZoomControls(false);
      this.setWebContentsDebuggingEnabled(true);
      String ua = webSetting.getUserAgentString();
      UserAgentParam up = new UserAgentParam(CommonString.appTag, UserNative.getId(), UserNative.getName(), UserNative.getPhone(), UserNative.getPwd(), UserNative.getEpId());
      webSetting.setUserAgent(ua + "&" + FastJsonUtils.toJSONString(up));

      webSetting.setLoadsImagesAutomatically(true);
      Log.e("hxw", webSetting.getUserAgentString());
      // this.getSettingsExtension().setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);//extension
      // settings 的设计
   }

// @Override
// protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
//    boolean ret = super.drawChild(canvas, child, drawingTime);
//    canvas.save();
//    Paint paint = new Paint();
//    paint.setColor(0x7fff0000);
//    paint.setTextSize(24.f);
//    paint.setAntiAlias(true);
//    if (getX5WebViewExtension() != null) {
//       canvas.drawText(this.getContext().getPackageName() + "-pid:"
//             + android.os.Process.myPid(), 10, 50, paint);
//       canvas.drawText(
//             "X5  Core:" + QbSdk.getTbsVersion(this.getContext()), 10,
//             100, paint);
//    } else {
//       canvas.drawText(this.getContext().getPackageName() + "-pid:"
//             + android.os.Process.myPid(), 10, 50, paint);
//       canvas.drawText("Sys Core", 10, 100, paint);
//    }
//    canvas.drawText(Build.MANUFACTURER, 10, 150, paint);
//    canvas.drawText(Build.MODEL, 10, 200, paint);
//    canvas.restore();
//    return ret;
// }

   /*public X5WebView(Context arg0) {
      super(arg0);
      setBackgroundColor(85621);
   }*/
}

 

 

 

webview 监听滑动距离

 

 

        mWebview.setListener(new X5WebView.OnScrollListener() {
            @Override
            public void onScrollUp() {
                Logger.e("up");
            }

            @Override
            public void onScrollDown() {
                Logger.e("down");
            }

            @Override
            public void scrollHeight(int h) {
                if (h > 0) {
                    headLayout.setBackgroundResource(R.color.epblueyl);//标题栏颜色渐变
                }
                float f = (h + 0f) / 450;//滑动距离450px
                if (f > 1) {
                    f = 1f;
                }
                if (f < 0) {
                    f = 0;
                }
//                headLayout.setAlpha(f*1);
                headLayout.setBackgroundColor(ColorUtils.changeAlpha(ContextCompat.getColor(YxServiceActivity.this, R.color.epblueyl),(int)(f * 1 * 0xff)));
            }
        });

通用标题栏渐变色demo:https://blog.csdn.net/meixi_android/article/details/78124913

 

实现效果:渐变显示

 

demo链接:https://download.csdn.net/download/meixi_android/10966003

demo云盘链接:https://pan.baidu.com/s/1bNGSzYitvXTUk4x_3PgPWw

云盘密码:回复QQ——1085220040

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值