Javascript android中带有水平滚动的自定义webview

Javascript android中带有水平滚动的自定义webview,javascript,android,css,webview,webkit,Javascript,Android,Css,Webview,Webkit,自定义webview可以水平滚动并分页。这样我的页面将被分割成块。如何做到这一点?任何建议都表明我陷入了这个问题 webView.setWebViewClient(new WebViewClient(){ public void onPageFinished(WebView view, String url) { //injectJavascript(view); ScreenUtils screen =

自定义webview可以水平滚动并分页。这样我的页面将被分割成块。如何做到这一点?任何建议都表明我陷入了这个问题

webView.setWebViewClient(new WebViewClient(){

            public void onPageFinished(WebView view, String url) {
                //injectJavascript(view);

                ScreenUtils screen = new ScreenUtils(MainActivity.this);

                int deviceHeight = screen.getRealHeight();

                int deviceWidth = screen.getRealWidth();


                String varMySheet = "var mySheet = document.styleSheets[0];";

                String addCSSRule = "function addCSSRule(selector, newRule) {"
                        + "ruleIndex = mySheet.cssRules.length;"
                        + "mySheet.insertRule(selector + '{' + newRule + ';}', ruleIndex);"

                        + "}";


                float height=webView.getMeasuredHeight() / getResources().getDisplayMetrics().density;
                    String insertRule1 = "addCSSRule('html', 'margin:0px; padding:0px; height: "
                        + (height)
                        + "px; -webkit-column-gap: 0px; -webkit-column-width: "
                        + webView.getMeasuredWidth() + "px;')";


                webView.loadUrl("javascript:" + varMySheet);
                webView.loadUrl("javascript:" + addCSSRule);
                webView.loadUrl("javascript:" + insertRule1);
            }

        });
    }

我已经尝试了上面的代码,但是没有分页,在底部还有额外的填充

这就是我过去实现分页的方法

您必须使用自定义网络视图才能获得总滚动宽度

这是我用的

  public class WebViewWidth extends WebView {


     Context context;
     private boolean bAllowScroll = true;

    public WebViewWidth(Context context) {
        super(context);
        this.context = context;

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


    public int getContentWidth()
    {
        return this.computeHorizontalScrollRange();
    }
    public int getTotalHeight()
    {
        return this.computeVerticalScrollRange();
    }
}
在主活动
WebViewWidth webView
中作为全局变量

  webView = (WebViewWidth) findViewById(R.id.webView);
当您设置webview客户端时

    @Override
    public void onPageFinished(final WebView view, String url) {


        final WebView myWebView = (WebView) view;


        String varMySheet = "var mySheet = document.styleSheets[0];";

        String addCSSRule = "function addCSSRule(selector, newRule) {"
                + "ruleIndex = mySheet.cssRules.length;"
                + "mySheet.insertRule(selector + '{' + newRule + ';}', ruleIndex);"

                + "}";

        String insertRule1 = "addCSSRule('html', 'padding: 0px; height: "
                + (myWebView.getMeasuredHeight() / mContext.getResources().getDisplayMetrics().density)
                + "px; -webkit-column-gap: 0px; -webkit-column-width: "
                + myWebView.getMeasuredWidth() + "px;')";

        myWebView.loadUrl("javascript:" + varMySheet);
        myWebView.loadUrl("javascript:" + addCSSRule);
        myWebView.loadUrl("javascript:" + insertRule1);


        view.setVisibility(View.VISIBLE);
        super.onPageFinished(view, url);

         //giving delay of 2 sec ,else Totalscrollwidth is giving 0
        CountDownTimer test = new CountDownTimer(3000, 1000) {

            @Override
            public void onTick(long millisUntilFinished) { }

            @Override
            public void onFinish() {

                int widthis = webView.getContentWidth();

                TotalScrollWidth = widthis;

                    TotalPages = (TotalScrollWidth / ScreenWidth) - 1;

                progressdialog.dismiss();

            }
        };
        test.start();
    }
计算webview的屏幕宽度和总滚动宽度

现在totalpages=Totalscrollwidth/screenwidth-1

计算屏幕宽度

 Display display = getWindowManager().getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    int width = size.x;

    ScreenWidth = width;
现在,即使对于webview,也可以实现自定义滑动,当用户向右滑动时,您可以按屏幕宽度和距离滚动webview

像这样的东西

 webView.setOnTouchListener(new OnSwipeTouchListener(this) {
        @Override
        public void onSwipeLeft() {
            // Whatever
            loadnextpage();
        }

        @Override
        public void onSwipeRight() {

            loadpreviouspage();

        } }

  @Override
        public void newTouch() {
         // Do what ever needed for single tap action
        }


    });

我的轻扫触摸列表器

 public class OnSwipeTouchListener implements OnTouchListener  {

private final GestureDetector gestureDetector;
private static final int MAX_CLICK_DURATION = 1000;
private static final int MAX_CLICK_DISTANCE = 15;
 static Context mcontext;
private long pressStartTime;
private float pressedX;
private float pressedY;
private boolean stayedWithinClickDistance;
View inflationView;




public  int getLocationx() {
    return Locationx;
}

public void setLocationx(int locationx) {
    Locationx = locationx;
}

public int Locationx;

public int getLocationy() {
    return Locationy;
}

public void setLocationy(int locationy) {
    Locationy = locationy;
}

public int Locationy;

@SuppressWarnings("static-access")
public OnSwipeTouchListener(Context context) {
    gestureDetector = new GestureDetector(context, new GestureListener());
    this.mcontext=context;

}

public void onSwipeLeft() {
}

public void onSwipeRight() {
}
public void newTouch(){

 }

public boolean onTouch(View v, MotionEvent event) {


      this.inflationView=v;
        gestureDetector.onTouchEvent(event);


     if(event.getAction()== MotionEvent.ACTION_MOVE)
     {
          if (stayedWithinClickDistance && distance(pressedX, pressedY, event.getX(), event.getY()) > MAX_CLICK_DISTANCE) {
              stayedWithinClickDistance = false;
          }
         return true;
     }

     else if (event.getAction()== MotionEvent.ACTION_DOWN) {
         pressStartTime = System.currentTimeMillis();                
         pressedX = event.getX();
         pressedY = event.getY();
         stayedWithinClickDistance = true;

         return v.onTouchEvent(event);
     }
     else if(event.getAction()== MotionEvent.ACTION_UP) {

         long pressDuration = System.currentTimeMillis() - pressStartTime;
         if (pressDuration < MAX_CLICK_DURATION && stayedWithinClickDistance) {
            newTouch();
         }
         setLocationx((int)event.getX());
         setLocationy((int)event.getY());
         return v.onTouchEvent(event);
     }
     else{
         return v.onTouchEvent(event);
     }

}
private static float distance(float x1, float y1, float x2, float y2) {
    float dx = x1 - x2;
    float dy = y1 - y2;
    float distanceInPx = (float) Math.sqrt(dx * dx + dy * dy);
    return pxToDp(distanceInPx);
}

private static float pxToDp(float px) {
    return px / mcontext.getResources().getDisplayMetrics().density;
}






 private final class GestureListener extends SimpleOnGestureListener {

        private static final int SWIPE_DISTANCE_THRESHOLD = 100;
        private static final int SWIPE_VELOCITY_THRESHOLD = 100;

        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            float distanceX = e2.getX() - e1.getX();
            float distanceY = e2.getY() - e1.getY();
            if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                if (distanceX > 0)
                    onSwipeRight();
                else
                    onSwipeLeft();
                return true;
            }
            return false;
        }



    }

}
公共类OnSwipeTouchListener实现OnTouchListener{
私人最终手势检测器手势检测器;
私有静态最终整数最大点击持续时间=1000;
专用静态最终整数最大点击距离=15;
静态语境;
私人长按开始时间;
私有浮点数;
私人浮动压力;
私有布尔stayedWithinClickDistance;
通货膨胀观;
public int getLocationx(){
返回位置X;
}
公共无效设置位置X(内部位置X){
位置X=位置X;
}
公共国际位置X;
public int getLocationy(){
返回位置;
}
公共无效设置位置Y(内部位置Y){
Locationy=Locationy;
}
公共场所;
@抑制警告(“静态访问”)
公共OnSwipeTouchListener(上下文){
gestureDetector=new gestureDetector(上下文,new GestureListener());
this.mcontext=上下文;
}
公共void onswitpeleft(){
}
公共权利{
}
公共无效新触摸(){
}
公共布尔onTouch(视图v,运动事件){
这个.inflationView=v;
手势检测器。onTouchEvent(事件);
if(event.getAction()==MotionEvent.ACTION\u MOVE)
{
如果(包括ICKD距离和距离的静止距离(按X、按Y、event.getX()、event.getY())>最大点击距离){
stayedWithinClickDistance=false;
}
返回true;
}
else if(event.getAction()==MotionEvent.ACTION\u DOWN){
按StartTime=System.currentTimeMillis();
pressedX=event.getX();
pressedY=event.getY();
stayedWithinClickDistance=真;
返回v.onTouchEvent(事件);
}
else if(event.getAction()==MotionEvent.ACTION\u UP){
长按持续时间=System.currentTimeMillis()-按开始时间;
如果(按持续时间<最大值>单击持续时间和停留时间(包括持续时间和停留时间)){
newTouch();
}
setLocationx((int)event.getX());
setLocationy((int)event.getY());
返回v.onTouchEvent(事件);
}
否则{
返回v.onTouchEvent(事件);
}
}
专用静态浮动距离(浮动x1、浮动y1、浮动x2、浮动y2){
浮点数dx=x1-x2;
浮动dy=y1-y2;
浮点距离inpx=(float)Math.sqrt(dx*dx+dy*dy);
返回pxToDp(距离inpx);
}
专用静态浮点pxToDp(浮点px){
返回px/mcontext.getResources().getDisplayMetrics().density;
}
私有最终类GestureListener扩展了SimpleOnGestureListener{
专用静态最终整数滑动距离阈值=100;
专用静态最终整数滑动速度阈值=100;
@凌驾
公共布尔onDown(运动事件e){
返回true;
}
@凌驾
公共布尔onFling(MotionEvent e1、MotionEvent e2、float-velocityX、float-velocityY){
浮点距离x=e2.getX()-e1.getX();
浮点距离y=e2.getY()-e1.getY();
if(Math.abs(distanceX)>Math.abs(distanceY)&&Math.abs(distanceX)>滑动距离(SWIPE\u DISTANCE\u THRESHOLD)&&Math.abs(velocityX)>滑动速度(SWIPE\u THRESHOLD){
如果(距离X>0)
onswipright();
其他的
onswipleft();
返回true;
}
返回false;
}
}
}

您正在使用epub reader吗?是的,我正在使用epub reader请参见下面的答案,我正在使用epub reader tooadded on SwipeTouchListner what is PresentPage如何计算当前页面是用户当前所在的页面,最初它将为1,当用户向右滑动时,它将递增1,当用户向左滑动时,它将递减1,还要确保它的值不低于1且不大于总页数。它从四面八方都有填充,但我们不能删除填充吗
 public class OnSwipeTouchListener implements OnTouchListener  {

private final GestureDetector gestureDetector;
private static final int MAX_CLICK_DURATION = 1000;
private static final int MAX_CLICK_DISTANCE = 15;
 static Context mcontext;
private long pressStartTime;
private float pressedX;
private float pressedY;
private boolean stayedWithinClickDistance;
View inflationView;




public  int getLocationx() {
    return Locationx;
}

public void setLocationx(int locationx) {
    Locationx = locationx;
}

public int Locationx;

public int getLocationy() {
    return Locationy;
}

public void setLocationy(int locationy) {
    Locationy = locationy;
}

public int Locationy;

@SuppressWarnings("static-access")
public OnSwipeTouchListener(Context context) {
    gestureDetector = new GestureDetector(context, new GestureListener());
    this.mcontext=context;

}

public void onSwipeLeft() {
}

public void onSwipeRight() {
}
public void newTouch(){

 }

public boolean onTouch(View v, MotionEvent event) {


      this.inflationView=v;
        gestureDetector.onTouchEvent(event);


     if(event.getAction()== MotionEvent.ACTION_MOVE)
     {
          if (stayedWithinClickDistance && distance(pressedX, pressedY, event.getX(), event.getY()) > MAX_CLICK_DISTANCE) {
              stayedWithinClickDistance = false;
          }
         return true;
     }

     else if (event.getAction()== MotionEvent.ACTION_DOWN) {
         pressStartTime = System.currentTimeMillis();                
         pressedX = event.getX();
         pressedY = event.getY();
         stayedWithinClickDistance = true;

         return v.onTouchEvent(event);
     }
     else if(event.getAction()== MotionEvent.ACTION_UP) {

         long pressDuration = System.currentTimeMillis() - pressStartTime;
         if (pressDuration < MAX_CLICK_DURATION && stayedWithinClickDistance) {
            newTouch();
         }
         setLocationx((int)event.getX());
         setLocationy((int)event.getY());
         return v.onTouchEvent(event);
     }
     else{
         return v.onTouchEvent(event);
     }

}
private static float distance(float x1, float y1, float x2, float y2) {
    float dx = x1 - x2;
    float dy = y1 - y2;
    float distanceInPx = (float) Math.sqrt(dx * dx + dy * dy);
    return pxToDp(distanceInPx);
}

private static float pxToDp(float px) {
    return px / mcontext.getResources().getDisplayMetrics().density;
}






 private final class GestureListener extends SimpleOnGestureListener {

        private static final int SWIPE_DISTANCE_THRESHOLD = 100;
        private static final int SWIPE_VELOCITY_THRESHOLD = 100;

        @Override
        public boolean onDown(MotionEvent e) {
            return true;
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            float distanceX = e2.getX() - e1.getX();
            float distanceY = e2.getY() - e1.getY();
            if (Math.abs(distanceX) > Math.abs(distanceY) && Math.abs(distanceX) > SWIPE_DISTANCE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                if (distanceX > 0)
                    onSwipeRight();
                else
                    onSwipeLeft();
                return true;
            }
            return false;
        }



    }

}