ScrollView中的Android WebView和recyclerview

时间:2017-03-29 09:24:43

标签: android webview scrollview parallax

我有一个带有图像和一些文字的网页,图像具有视差效果。当我在滚动视图内的Web视图中加载网页时,视差效果不起作用。滚动视图还具有回收视图和Web视图。如何实现网页中的视差效果以及整页的无缝滚动?

This video have the page i have developed with web view inside scroll view

This video is the demo screen with only web view, just to test the parallax in the web page

布局

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

    <android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true">

        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/news_detail_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

            <WebView
                android:id="@+id/web_view"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

            <RelativeLayout
                android:id="@+id/related"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:visibility="gone">

                <View
                    android:id="@+id/view"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/list_item_divider_height"
                    android:background="#dedede"
                    android:visibility="visible" />

                <TextView
                    android:id="@+id/related_title"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/view"
                    android:layout_margin="@dimen/main_margin"
                    android:text="@string/related_news"
                    android:textColor="@android:color/black"
                    android:textSize="@dimen/list_item_title"
                    android:textStyle="bold"
                    android:visibility="visible" />

                <android.support.v7.widget.RecyclerView
                    android:id="@+id/related_article"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/related_title"
                    android:layout_marginLeft="8dp"
                    android:layout_marginRight="8dp"
                    android:visibility="visible" />
            </RelativeLayout>

            <RelativeLayout
                android:id="@+id/recommendation"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:visibility="gone">

                <View
                    android:id="@+id/recommendation_seperator"
                    android:layout_width="match_parent"
                    android:layout_height="@dimen/list_item_divider_height"
                    android:background="#dedede"
                    android:visibility="visible" />

                <TextView
                    android:id="@+id/recommendation_title"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_margin="@dimen/main_margin"
                    android:text="Sponsored Stories"
                    android:textColor="@android:color/black"
                    android:textSize="@dimen/list_item_title"
                    android:textStyle="bold" />

                <LinearLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentRight="true"
                    android:layout_margin="@dimen/main_margin"
                    android:orientation="horizontal">

                    <TextView
                        android:id="@+id/drawer_title_view"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_centerVertical="true"
                        android:layout_gravity="center"
                        android:text="Recommended by "
                        android:textColor="@color/black_semi_trans"
                        android:textSize="12dp"
                        android:textStyle="bold" />

                    <ImageView
                        android:layout_width="24dp"
                        android:layout_height="24dp"
                        android:src="@drawable/ic_recommendation" />
                </LinearLayout>

                <android.support.v7.widget.RecyclerView
                    android:id="@+id/recommendation_view"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_below="@+id/recommendation_title" />
            </RelativeLayout>

        </LinearLayout>
    </android.support.v4.widget.NestedScrollView>

    <ProgressBar
        android:id="@+id/progress_bar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />
</RelativeLayout>

Java类

   public class NewsDetailFragment extends Fragment implements ViewModel.ResponseListener<News>, RecyclerViewEvents.Listener<Object>,
        View.OnKeyListener, RecommendationsListener {

    private List<NewsItem> relatedList = new ArrayList<>();
    private RelatedArticleListAdapter relatedAdapter;
    private String url;
    private ClickEvents.ListItemListener listItemListener;
    private WebView webView;
    private ProgressBar progressBar;
    private boolean isWebViewPaused;
    private List<OBRecommendation> outbrainList = new ArrayList();
    private OutbrainAdapter outbrainAdapter;

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        listItemListener = (ClickEvents.ListItemListener) activity;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        url = getArguments().getString(Constants.BundleKeys.URL);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate((Network.isConnected(getActivity())) ? R.layout.fragment_news_detail : R.layout.fragment_news_detail_offline, container, false);
        progressBar = (ProgressBar) view.findViewById(R.id.progress_bar);
        webView = (WebView) view.findViewById(R.id.web_view);
        webView.setHorizontalScrollBarEnabled(false);
        webView.getSettings().setAppCacheEnabled(false);
        webView.setScrollBarStyle(WebView.SCROLLBARS_INSIDE_INSET);
        webView.setVerticalScrollBarEnabled(false);
        webView.setOnKeyListener(this);
        webView.getSettings().setJavaScriptEnabled(true);
        int fontSize = PreferenceManager.getsInstance(getActivity()).getSharedPrefs().getInt(PreferenceManager.PreferenceKeys.SETTINGS_CURRENT_FONT_SIZE, -1);
        switch (fontSize) {
            case 0: //LARGE
                webView.getSettings().setTextZoom(160);
                break;
            case 1: // MEDIUM
                webView.getSettings().setTextZoom(130);
                break;
            case 2: //NORMAL
                webView.getSettings().setTextZoom(100);
                break;
            case 3: //SMALL
                webView.getSettings().setTextZoom(70);
                break;
            default:
                webView.getSettings().setTextZoom(100);
        }

        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (Network.isConnected(getActivity())) {
            RecyclerView relatedRecyclerView = (RecyclerView) getView().findViewById(R.id.related_article);
            RecyclerView recommendationRecyclerView = (RecyclerView) getView().findViewById(R.id.recommendation_view);
            RelativeLayout recommendationLayout = (RelativeLayout) getView().findViewById(R.id.recommendation);
            RelativeLayout relatedLayout = (RelativeLayout) getView().findViewById(R.id.related);

            webView.setWebViewClient(new WebClient(progressBar, recommendationLayout, relatedLayout));
            relatedRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false));
            relatedRecyclerView.setAdapter(relatedAdapter = new RelatedArticleListAdapter(getActivity(), relatedList, this));

            OBRequest request = new OBRequest(url, getResources().getString(R.string.outbrain_widget));
            Outbrain.fetchRecommendations(request, this);
            GridLayoutManager layoutManager = new GridLayoutManager(getActivity(), 2);
            recommendationRecyclerView.setLayoutManager(layoutManager);
            outbrainAdapter = new OutbrainAdapter(getActivity(), outbrainList, this);
            recommendationRecyclerView.setAdapter(outbrainAdapter);

            webView.loadUrl(url);
            String keywords = getArguments().getString(Constants.BundleKeys.KEYWORDS);

            if (keywords != null) {
                String newsId = getArguments().getString(Constants.BundleKeys.NEWS_ID);
                String url = ConfigManager.getsInstance().getURL(Constants.CustomApiType.RELATED_NEWS);
                StringBuilder builder = new StringBuilder(url).append("&").append(APIService.QueryKeys.EXCLUDE_ID)
                        .append("=").append(newsId)
                        .append("&").append(APIService.QueryKeys.ALL_FIELDS).append("=")
                        .append(keywords);
                NewsViewModel newsViewModel = new NewsViewModel(getActivity(), this, builder.toString());
                newsViewModel.downloadRelatedNews();
            }
        } else {
            webView.setWebViewClient(new WebClient(progressBar));
            downloadCachedHTML(url);
        }

    }

    private void downloadCachedHTML(String url) {
        boolean isBookMarkNews = getArguments().getBoolean(Constants.BundleKeys.IS_BOOKMARK, false);
        HTMLClient client = HTMLClientFactory.create(getActivity(), isBookMarkNews ? CacheInfo.BOOKMARK_NEWS : CacheInfo.NEWS_DETAIL);
        HTMLAPIService apiService = client.getAPIService(HTMLAPIService.class);
        Call<String> call = apiService.downloadHtml(url);
        call.enqueue(new Callback<String>() {
            @Override
            public void onResponse(Call<String> call, retrofit2.Response<String> response) {
                if (getActivity() == null)
                    return;
                progressBar.setVisibility(View.GONE);
                if (response.body() != null) {
                    webView.loadDataWithBaseURL("", response.body(), "text/html", "utf-8", null);
                }
            }

            @Override
            public void onFailure(Call<String> call, Throwable t) {
                progressBar.setVisibility(View.GONE);
            }
        });
    }

    @Override
    public void onItemClick(Object item, View v, int position) {
        if (item instanceof NewsItem) {
            News news = new News();
            news.newsList = relatedList;
            listItemListener.onNewsListItemClick(news, position, "",  false);
        }
        if (item instanceof OBRecommendation)
            listItemListener.onRecommendationItemClick(((OBRecommendation) item).getUrl());

    }

    @Override
    public void onResponse(News response) {
        relatedList.clear();
        relatedList.addAll(response.newsList);
        relatedAdapter.notifyDataSetChanged();
    }

    @Override
    public void onNextResponse(News response) {
    }

    @Override
    public void onNextError() {
    }

    @Override
    public void onError() {
        relatedList.clear();
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (getActivity() == null)
            return;
        if (webView == null)
            return;
        if (isVisibleToUser)
            webView.onResume();
        else webView.onPause();

    }

    @Override
    public void onPause() {
        super.onPause();
        webView.onPause();
        isWebViewPaused = true;
    }

    @Override
    public void onResume() {
        super.onResume();
        if (isWebViewPaused) {
            webView.onResume();
            isWebViewPaused = false;
        }
    }

    @Override
    public void onOutbrainRecommendationsSuccess(OBRecommendationsResponse recommendations) {
        outbrainList.clear();
        outbrainList.addAll(recommendations.getAll());
        outbrainAdapter.notifyDataSetChanged();
    }

    @Override
    public void onOutbrainRecommendationsFailure(Exception ex) {
        outbrainList.clear();
    }


    private class WebClient extends WebViewClient {
        private final ProgressBar progressBar;
        private RelativeLayout recommendation;
        private RelativeLayout related;

        public WebClient(ProgressBar progressBar, RelativeLayout recommendation, RelativeLayout related) {
            this.progressBar = progressBar;
            this.recommendation = recommendation;
            this.related = related;

        }

        public WebClient(ProgressBar progressBar) {
            this.progressBar = progressBar;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
            progressBar.setVisibility(View.VISIBLE);
            if (Network.isConnected(getActivity())) {
                recommendation.setVisibility(View.GONE);
                related.setVisibility(View.GONE);
            }
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            progressBar.setVisibility(View.GONE);
            if (Network.isConnected(getActivity())) {
                related.setVisibility(relatedList.isEmpty() ? View.GONE : View.VISIBLE);
                recommendation.setVisibility(outbrainList.isEmpty() ? View.GONE : View.VISIBLE);
            }
        }

        @SuppressWarnings("deprecation")
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
            if (!Network.isConnected(getActivity())) {
                WebResourceResponse response = getResponse(url);
                return response == null ? super.shouldInterceptRequest(view, url) : response;
            }
            return super.shouldInterceptRequest(view, url);
        }

        @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
            if (!Network.isConnected(getActivity())) {
                String url = request.getUrl().toString();
                WebResourceResponse response = getResponse(url);
                return response == null ? super.shouldInterceptRequest(view, request) : response;

            }
            return super.shouldInterceptRequest(view, request);
        }

        @Nullable
        private WebResourceResponse getResponse(String url) {
            if (url.endsWith(".png") || url.endsWith(".jpg")) {
                boolean isBookMarkNews = getArguments().getBoolean(Constants.BundleKeys.IS_BOOKMARK, false);
                HTMLClient client = HTMLClientFactory.create(getActivity(), isBookMarkNews ? CacheInfo.BOOKMARK_NEWS : CacheInfo.NEWS_DETAIL);
                File cachedFile = new File(client.getImageDir() + File.separator + HTMLInterceptor.getFileName(url));
                if (cachedFile.exists()) {
                    try {
                        return new WebResourceResponse(
                                "image/*", "utf-8", new FileInputStream(cachedFile));
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                }
            }
            return null;
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
            if (Network.isConnected(progressBar.getContext()))
                return false;
            else return true;
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return super.shouldOverrideUrlLoading(view, url);
        }
    }


    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            WebView webView = (WebView) v;
            switch (keyCode) {
                case KeyEvent.KEYCODE_BACK:
                    if (webView.canGoBack()) {
                        webView.goBack();
                        return true;
                    }
                    break;
            }
        }
        return false;

    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        webView.destroy();
    }
}

0 个答案:

没有答案