zoukankan      html  css  js  c++  java
  • Android切换页面效果的实现一:WebView+ViewFlipper

    前言:

      这两周在帮学校做一个新生入学用的“新里程”的项目,要做到页面切换阅读的效果,自己百度了下,找到普遍是使用WebView+ViewFlipper的实现方法,但这种方法不能满足我的要求,因为它很难实现定位的效果,就是定位到固定某一页,不过还是贴出来,学习下。

    代码实现:

    布局很简单,只用一个ViewFlipper,main.xml

     

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    
        <ViewFlipper
            android:id="@+id/ViewFlipper"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" >
        </ViewFlipper>
    
    </RelativeLayout>

     

    自定义的WebView,MyWebView.java

    package cn.edu.stu.webview_viewflipper;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.animation.AnimationUtils;
    import android.webkit.WebView;
    import android.widget.ViewFlipper;
    
    public class MyWebView extends WebView {
    
        float downXValue;
        long downTime;
        private ViewFlipper flipper;
        private float lastTouchX, lastTouchY;
        private boolean hasMoved = false;
    
        public MyWebView(Context context) {
            super(context);
            // TODO Auto-generated constructor stub
        }
    
        public MyWebView(Context context, ViewFlipper flipper) {
            super(context);
    
            this.flipper = flipper;
        }
    
        public MyWebView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            // TODO Auto-generated constructor stub
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent evt) {
            // TODO Auto-generated method stub
            boolean consumed = super.onTouchEvent(evt);
            if (isClickable()) {
                switch (evt.getAction()) {
    
                case MotionEvent.ACTION_DOWN:
                    lastTouchX = evt.getX();
                    lastTouchY = evt.getY();
                    downXValue = evt.getX();
                    downTime = evt.getEventTime();
                    hasMoved = false;
                    break;
    
                case MotionEvent.ACTION_MOVE:
                    hasMoved = moved(evt);
                    break;
    
                case MotionEvent.ACTION_UP:
                    float currentX = evt.getX();
                    long currentTime = evt.getEventTime();
                    float difference = Math.abs(downXValue - currentX);
                    long time = currentTime - downTime;
                    Log.i("Touch Event========", "Distance: " + difference + "px Time: " + time + "ms");
    
                    if ((downXValue < currentX) && (difference > 100 && (time < 220))) {
                        /** 跳到上一页 */
                        this.flipper.setInAnimation(AnimationUtils.loadAnimation(this.getContext(), R.anim.push_right_in));
                        this.flipper
                                .setOutAnimation(AnimationUtils.loadAnimation(this.getContext(), R.anim.push_right_out));
    
                        flipper.showPrevious();
                    }
    
                    /** X轴滑动间隔大于100,并且时候小于220ms,并且向X轴左标的目标滑动 */
                    if ((downXValue > currentX) && (difference > 100) && (time < 220)) {
                        /** 跳到下一页 */
                        this.flipper.setInAnimation(AnimationUtils.loadAnimation(this.getContext(), R.anim.push_left_in));
                        this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this.getContext(), R.anim.push_left_out));
                        flipper.showNext();
                    }
                    break;
                }
    
            }
    
            return consumed || isClickable();
        }
    
        private boolean moved(MotionEvent evt) {
    
            return hasMoved || Math.abs(evt.getX() - lastTouchX) > 10.0 || Math.abs(evt.getY() - lastTouchY) > 10.0;
        }
    }

    主体Activity,MainActivity.java:

    package cn.edu.stu.webview_viewflipper;
    
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.View;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.widget.ViewFlipper;
    
    public class MainActivity extends Activity {
    
        MyWebView myWebView;
        private ViewFlipper flipper;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            // super.loadUrl("file:///android_asset/stu_for_u.html");
            // MyWebView wv=(MyWebView)findViewById(R.id.wv);
            // wv.loadUrl("file:///android_asset/stu_for_u.html");
            // wv.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
    
            flipper = (ViewFlipper) this.findViewById(R.id.ViewFlipper);
            flipper.addView(addWebView("file:///android_asset/experience/exp_article2.html"));
            flipper.addView(addWebView("file:///android_asset/experience/exp_article6.html"));
            flipper.addView(addWebView("file:///android_asset/experience/exp_article10.html"));
        }
    
        private View addWebView(String url) {
    
            myWebView = new MyWebView(this, flipper);
            // 设置WebView属性,能够执行Javascript脚本
            myWebView.getSettings().setJavaScriptEnabled(true);
            // 加载需要显示的网页
            // webview.loadUrl("file:///android_asset/index.html");
            myWebView.loadUrl(url);
            // 使WebView的网页跳转在WebView中进行,而非跳到浏览器
            myWebView.setWebViewClient(new WebViewClient() {
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    view.loadUrl(url);
                    return true;
                }
            });
            return myWebView;
        }
    }

      这个实现有两个缺点:1.不能实现定位;2.会循环切换页面;

      我没有解决这两个问题,而是采用另一个控件来解决了,如果哪位博友能够解决,分享下解决方法!

     

  • 相关阅读:
    微服务基础——厉害了!API网关
    11.11 大促背后的秘密——智能合图
    那些我们对2019技术世界趋势的预测都说准了吗?
    DevOps云翼日志服务实践
    技术沙龙|原来落地AI应用是这么回事儿!
    直击JDD | 京东开启技术服务元年:携手合作伙伴,共创产业未来
    直击JDD | 徐雷:智能化零售,以技术为驱动力的突破路径
    直击JDD | 陈生强:京东数科的底层是数字化操作系统
    干货 | Spark Streaming 和 Flink 详细对比
    持续集成与自动化部署
  • 原文地址:https://www.cnblogs.com/navyifanr/p/3226762.html
Copyright © 2011-2022 走看看