WebView中查看图片(多张图片滑动查看)

1.在WebView中存在图片,android 中的java代码调用webview里面的js脚本

// 启用javascript
webView.getSettings().setJavaScriptEnabled(true); 

webView.setWebViewClient(new WebViewClient() {

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                if (getIntent().getBooleanExtra(EXTRA_SHOW_HUD, false)) {
                }
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                //从assets目录下加载js文件"act.js"
                injectScriptFile(view, "act.js");

            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                if (url.startsWith("tel:")) {
                    Intent intent = new Intent(Intent.ACTION_DIAL,
                            Uri.parse(url));
                    startActivity(intent);
                    return true;
                }
                return false;
            }

            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                Toast.makeText(DocumentDetailsActivity.this, "Oh no! " + description, Toast.LENGTH_SHORT).show();
            }
            //加载js文件的方法
            private void injectScriptFile(WebView view, String scriptFile) {
                InputStream input;
                try {
                    input = getAssets().open(scriptFile);
                    byte[] buffer = new byte[input.available()];
                    input.read(buffer);
                    input.close();
                    String encoded = Base64.encodeToString(buffer,
                            Base64.NO_WRAP);
                    view.loadUrl("javascript:(function() {"
                            + "var parent = document.getElementsByTagName(‘head‘).item(0);"
                            + "var script = document.createElement(‘script‘);"
                            + "script.type = ‘text/javascript‘;"
                            +
                            // Tell the browser to BASE64-decode the string into
                            // your script !!!
                            "script.innerHTML = window.atob(‘" + encoded
                            + "‘);" + "parent.appendChild(script)" + "})()");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

2.对webview绑定javascriptInterface

webView.addJavascriptInterface(this, "nativeDelegate");

3.参数的传递,以及界面的跳转(图片显示)

@JavascriptInterface
    public void showImage(String src) {
        Log.d("string", src);
        try {
            //数据解析
            JSONObject o = new JSONObject(src);
            Intent intent = new Intent(this, ImageViewerActivity.class);
            String url = o.getString("src");
            //遍历JSONArray数据,加入到ArrayList中,实现数据的转换
            JSONArray jsonArray = o.getJSONArray("images");
            ArrayList<String> arrayList = new ArrayList<String>();

            int index = 0;
            for (int i = 0; i < jsonArray.length(); i++) {
                arrayList.add(jsonArray.getString(i));
                //设置当前图片的参数
                if (url.equals(jsonArray.getString(i)) ){
                    index = i;
                }
            }
            intent.putExtra("index", index);
            intent.putStringArrayListExtra("urls", arrayList);
            startActivity(intent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

4.点击某张图片的时候,需要把这个图片的参数传给一个图片查看器,图片查看器里会根据传递进来的参数去加载这张图片,那么其实图片查看器就是一个新的单独的Activity,这个Activity会包含一个ViewPager,用来管理多张图片的查看。

activity_image_viewer.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <com.example.ImageViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/black" />

</FrameLayout> 

ImageViewPager.java

public class ImageViewPager extends ViewPager {

    public ImageViewPager(Context context) {
        super(context);
    }

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

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        try {
            return super.onInterceptTouchEvent(ev);
        } catch (IllegalArgumentException e) {
            return false;
        } catch (ArrayIndexOutOfBoundsException e) {
            return false;
        }
    }
}

ImageViewActivity.java

/**
 * 图片查看器
 */
public class ImageViewerActivity extends FragmentActivity {

    private static final String STATE_POSITION = "STATE_POSITION";
    public static final String INDEX = "index";
    public static final String URLS = "urls";

    private ImageViewPager mPager;
    private int pagerPosition;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_image_viewer);

        pagerPosition = getIntent().getIntExtra(INDEX, 0);
        ArrayList<String> urlList = getIntent().getStringArrayListExtra(URLS);

        mPager = (ImageViewPager) findViewById(R.id.pager);
        ImagePagerAdapter mAdapter = new ImagePagerAdapter(
                getSupportFragmentManager(), urlList);
        mPager.setAdapter(mAdapter);

        mPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageScrollStateChanged(int arg0) {
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
            }

            @Override
            public void onPageSelected(int arg0) {
            }

        });
        if (savedInstanceState != null) {
            pagerPosition = savedInstanceState.getInt(STATE_POSITION);
        }

        mPager.setCurrentItem(pagerPosition);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        outState.putInt(STATE_POSITION, mPager.getCurrentItem());
    }

    private class ImagePagerAdapter extends FragmentStatePagerAdapter {

        public ArrayList<String> fileList;

        public ImagePagerAdapter(FragmentManager fm, ArrayList<String> fileList) {
            super(fm);
            this.fileList = fileList;
        }

        @Override
        public int getCount() {
            return fileList == null ? 0 : fileList.size();
        }

        @Override
        public Fragment getItem(int position) {
            String url = fileList.get(position);
            return ImageDetailFragment.newInstance(url);
        }
    }
}

5.已知图片查看的界面是继承自FragmentActivity的,所以支持显示的界面必须需要Fragment来实现,那么就自定义个Frangment吧,用这个Fragment来从参数中获取图片资源,显示图片。

image_detail_fragment.xml

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

    <ImageView
        android:id="@+id/image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:adjustViewBounds="true"
        android:contentDescription="@string/app_name"
        android:scaleType="centerCrop" />

</FrameLayout>

ImageDetailFragment.java

public class ImageDetailFragment extends Fragment {
    private String mImageUrl;
    private ImageView mImageView;
    private PhotoViewAttacher mAttacher;

    public static ImageDetailFragment newInstance(String imageUrl) {
        final ImageDetailFragment f = new ImageDetailFragment();

        final Bundle args = new Bundle();
        args.putString("url", imageUrl);
        f.setArguments(args);

        return f;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mImageUrl = getArguments() != null ? getArguments().getString("url")
                : null;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        final View v = inflater.inflate(R.layout.image_detail_fragment,
                container, false);
        mImageView = (ImageView) v.findViewById(R.id.image);
        mAttacher = new PhotoViewAttacher(mImageView);

        mAttacher.setOnPhotoTapListener(new PhotoViewAttacher.OnPhotoTapListener() {

            @Override
            public void onPhotoTap(View arg0, float arg1, float arg2) {
                getActivity().finish();
            }
        });

        return v;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (mImageUrl != null) {
            UrlImageViewHelper.setUrlDrawable(mImageView, mImageUrl, new UrlImageViewCallback() {

                @Override
                public void onLoaded(ImageView arg0, Bitmap arg1, String arg2, boolean arg3) {
                    mAttacher = new PhotoViewAttacher(mImageView);
                }
            });
        }
    }
}
时间: 2024-08-04 13:00:03

WebView中查看图片(多张图片滑动查看)的相关文章

ios中,长按Webview中的图片

我们所要解决的问题如题目所示:ios中,长按Webview中的图片,将图片保存到本地相册. 解决方案:对load的html网页,执行js注入,通过在webview中执行js代码,来响应点击事件,通过js代码来模拟长按事件.发现图片的位置,获得图片的url链接,通过此链接获得图片,将此图片保存到本地相册. js注入代码: static NSString* const kTouchJavaScriptString=@"document.ontouchstart=function(event){\x=

Android:WebView中对图片注册上下文菜单

前言 今天一朋友问我一个问题,就是如何在WebView控件中的图片增加上下文菜单,以便增加保存图片等功能.今天就给他简单做了一个演示Demo,现写下来,给有相同问题的朋友提供些许思路吧. 概要实现 其实这个功能很简单,没有太复杂的东西,就是对WebView的控件的使用,一是给WebView注册了上下文菜单事件,二是在响应事件中去判断事件源的类型,如果是图片类型,则把url取出来 注册上下文菜单事件 这个就比较简单了通过下面的代码即可完成. WebView vw = (WebView) findV

WebView用法与JS交互(2) 响应webview中的图片点击事件

参考:http://blog.csdn.net/wangtingshuai/article/details/8635787 js代码 // 注入js函数监听 private void addImageClickListner() { // 这段js函数的功能就是,遍历所有的img几点,并添加onclick函数,函数的功能是在图片点击的时候调用本地java接口并传递url过去 contentWebView.loadUrl("javascript:(function(){" + "

Android中通过ImageSwitcher实现相册滑动查看照片功能(附代码下载)

场景 效果 注: 博客: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将需要滚动查看的照片复制到res/drawable下 这里只准备了两张bg01.jpg和bg02.jpg 在滚动时需要用到左进右出和左出右进的动画,所以在res下新建anim目录,在目录下新建四种动画的xml文件 具体代码参照示例代码. 然后打开布局文件activity_image_switcher.xml 将布局修

win7文件夹中的图片使用“XX图标”查看模式显示时,无法正常显示图片缩略图

系统: win7 详细症状描述: 进入含有图片的文件夹,选择"查看"菜单栏中的"超大图标"."大图标"等模式进行文件显示时,无法图片文件正常显示其缩略图. 问题解决: 我的电脑>>鼠标右键中点击"属性">>"控制面板\系统和安全\系统"中点击左侧"高级系统设置">>"系统属性"中点击"高级"并点击"性能

移动端图片放大滑动查看-插件photoswipe的使用

最近在开发项目的时候,遇到一个需求,需要移动端实现放大查看图片的功能,然后我就在网上搜索了一下资料,看到了photoswipe这个插件,后来试了试,确实挺好用的,它可以实现手势放大缩小查看图片,左右滑动切换图片以及上下滑动关闭大图.现在简单分享一下. 一.需要引入的css和js文件. 页面中需要引入如下文件:photoswipe.css,default-skin.css,photoswipe.js,photoswipe-ui-default.min.js 首先可以到它的官网或者github网站上

ReactNative学习-滑动查看图片第三方组件react-native-swiper

滑动查看图片第三方组件:react-native-swiper,现在的版本为:1.4.3,该版本还不支持Android. 下面介绍的是该组件的一些用法,可能总结的不完整,希望大家一起来共同完善. 官方文档:https://github.com/leecade/react-native-swiper 效果图: 安装 npm install --save react-native-swiper 基础用法 import React, {AppRegistry,Component,StyleSheet,

减少HTTP请求之将图片转成二进制并生成Base64编码,可以在网页中通过url查看图片(大型网站优化技术)

原文:减少HTTP请求之将图片转成二进制并生成Base64编码,可以在网页中通过url查看图片(大型网站优化技术) 在网站开发过程中,对于页面的加载效率一般都想尽办法求快.那么,怎么让才能更快呢?减少页面请求 是一个优化页面加载速度很好的方法.上一篇博文我们讲解了 “利用将小图标合成一张背景图来减少HTTP请求”,那么,这一篇博文将讲解  “ 将图片转成二进制并生成Base64编码,可以在网页中通过url查看图片”. 一.为何选择将图片转成二进制并生成Base64编码,可以在网页中通过url查看

Android中的图片查看器

本案例,使用Eclipse来开发Android2.1版本的图片查看器. 1)首先,打开Eclipse,新建一个Android2.1版本的项目ShowTu,打开res/values中目录下的strings.xml,将其中代码替换成一下代码: 路径:ShowTu/res/valus/string.xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="