`

webview使用及使用自定义图片查看界面

 
阅读更多

功能描述:业务需要,使用webview加载一个页面,在页面上的图片一点击时,能进行放大缩小等操作,如果我就使用webview加载页面,加载前判断如果是图片地址,则将图片URL作为参数传到自定义界面,在android界面就可以随意搞那处图片了:

1 主界面MainActivity代码:

 

 

package com.example.webviewtest;

import java.util.ArrayList;

import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ViewFlipper;

import com.example.webviewtest.utils.CLog;
import com.example.webviewtest.utils.Constant;

public class MainActivity  extends BaseActivity {

	private String TAG = "MainActivity";
	
	/**
	 * flipper主要是为了显示加载中,加载失败的状态而加入的东西
	 */
	private ViewFlipper flipper;
	
	/**
	 * 浏览器
	 */
	private WebView webview;
	
	private String mainUrl = "http://hz-chenwenbiao-91.iteye.com/blog/2038887";
//	private String mainUrl = "http://www.baidu.com";

	
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		this.setContentView(R.layout.activity_main);
		initialViews();
	}

	
	@Override
	public void initialViews() {

		
		flipper = (ViewFlipper) findViewById(R.id.class_space_detail_view_flipper);
		flipper.setDisplayedChild(0);
		
		/**
		 * 加载网页内容
		 */
		webview = (WebView) findViewById(R.id.class_space_detail_webview);
		// 设置WebView属性,能够执行Javascript脚本
		webview.getSettings().setJavaScriptEnabled(true);
		
		// 加载需要显示的网页
		CLog.d(TAG , "URL =========>" + mainUrl);
		webview.loadUrl(mainUrl);
		// 设置Web视图
		webview.setWebViewClient(new MyWebViewClient());
		
	}

	@Override
	// 设置回退
	// 覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			
			if(webview.canGoBack()){
				webview.goBack(); // goBack()表示返回WebView的上一页面
			}
			else {
				finish();
			}
			return true;
		}
		return false;
	}
	
	

	// Web视图
	private class MyWebViewClient extends WebViewClient {
		@Override
		public boolean shouldOverrideUrlLoading(WebView view, String url) {
			
			CLog.d(TAG , "url ==========>" + url);
			
			
			if(url.contains(".png")){//我们根据访问的URL的特征,如果是图片文件,就使用自己的界面来加载,使用类IOS查看图片效果的photoview开源主组实现的
				//跳转到图片查看界面
				Intent intent = new Intent(MainActivity.this , ViewImageActivity.class);
				Bundle bundle = new Bundle();
				ArrayList<String> imageList = new ArrayList<String>();
				imageList.add(url);
				bundle.putStringArrayList(Constant.TAG_CLASS_IMAGE_URL , imageList);
	            bundle.putInt(Constant.TAG_CLASS_IMAGE_INDEX , 0);
	            intent.putExtras(bundle);
	            startActivity(intent);
				
                return true;
			}
			
			/**
			 * 使用webview方式加载页面
			 */
			view.loadUrl(url);
			
			return true;
		}
		
		
		
		@Override
		public void onPageFinished(WebView view, String url) {
			super.onPageFinished(view, url);
			flipper.setDisplayedChild(1);//完成显示网页内容
		}
				
	
		@Override
		public void onReceivedError(WebView view, int errorCode,
				String description, String failingUrl) {
			super.onReceivedError(view, errorCode, description, failingUrl);
			flipper.setDisplayedChild(2);//显示失败重新加载界面
		}
	}
	
	
}

 

 

 

2 主界面布局activity_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="wrap_content"
    android:orientation="vertical" >
    
    
    

    
    
    <ViewFlipper
    	android:id="@+id/class_space_detail_view_flipper"
	    android:orientation="vertical"
	    android:layout_width="fill_parent"
	    android:layout_height="fill_parent"
		android:background="@color/gray">		
		
        
        
		<!-- (0) ProgressBar -->
		<LinearLayout
		    android:id="@+id/class_space_detail_loading_layout"
		    android:layout_width="fill_parent"
		    android:layout_height="wrap_content"
		    android:layout_gravity="center_vertical"
		    android:gravity="center"
		    android:orientation="horizontal" >

		    <ProgressBar
		        android:id="@+id/class_space_detail_pb"
		        android:layout_width="42dp"
		        android:layout_height="42dp"
		        android:layout_marginRight="8dp"
		        android:indeterminateDrawable="@drawable/loading_rotate" >
		    </ProgressBar>

		    <TextView
		        android:id="@+id/ProgressTextView"
		        android:layout_width="wrap_content"
		        android:layout_height="wrap_content"
		        android:text="@string/loading"
		        android:textColor="#000"
		        android:textSize="16sp" >
		    </TextView>
		</LinearLayout>
		
		
		<!-- (1) webview -->	    
        <ScrollView
	        android:layout_width="fill_parent"
	        android:layout_height="fill_parent"
			android:background="@color/gray"
	        android:scrollbars="vertical" >
	
	        <WebView 
			    android:id="@+id/class_space_detail_webview"
			    android:layout_width="fill_parent"
			    android:layout_height="wrap_content"
			/>
	    </ScrollView>
        
       
		 <!-- (2) Retry button -->
        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:padding="5dp"
            android:background="@drawable/get_data_failed" >

            <ImageView
                android:id="@+id/class_space_detail_retry_iv"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_centerHorizontal="true"
                android:background="@drawable/selector_once_again" />
            
        </RelativeLayout>
		
    </ViewFlipper>
    
    
    

</RelativeLayout>

上面布局里加入了加载中,加载失败等状态的控件信息. 

 

 

 

3 自定义图片查看器界面ViewImageActivity.java:

 

/*******************************************************************************
 * Copyright 2011, 2012 Chris Banes.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *******************************************************************************/
package com.example.webviewtest;

import java.util.ArrayList;

import uk.co.senab.photoview.PhotoView;
import uk.co.senab.photoview.PhotoViewAttacher.OnPhotoTapListener;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import com.example.webviewtest.utils.CLog;
import com.example.webviewtest.utils.Constant;
import com.example.webviewtest.utils.UniversalImageLoaderUtil;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;


/**
 * 
 * 查看问题图片(使用开源代码)
 * 
 * @author chenwenbiao
 * @date 2013-10-29 上午11:08:15
 * @version V1.0
 */
public class ViewImageActivity extends Activity{

	private static String TAG = "ViewImageActivity";
	public Context mContext;
	
	/**
	 * 多张图片查看器
	 */
	private ViewPager mViewPager;

	/**
	 * 当前查看的是第几张图片
	 */
	private TextView mTextViewCurrentViewPosition;
	/**
	 * 图片的路径列表
	 */
	private static ArrayList<String> imagePathList = null;
	private static int currentViewPosition = 0;//当前浏览到哪一张图片
	private static PhotoView[] photoViewList = null;//记录放进viewPager的photoview,方便进行旋转
	private static int rotateRecord[] = null;//旋转角度记录
 	
	
	
	private static DisplayImageOptions options = null;
	private static ProgressBar spinner = null;
 
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.image_view);
		mContext = this;
		findViews();
		loadData();
		
		
		UniversalImageLoaderUtil.getInstance().setContext(this);//记得注册一下
	}

	private void loadData() {
		Bundle bundle = getIntent().getExtras();
		imagePathList = bundle.getStringArrayList(Constant.TAG_CLASS_IMAGE_URL);
		if(imagePathList == null){//图片路径都没有,就算了
			Toast.makeText(this, "image path list is null!", Toast.LENGTH_SHORT).show();
			finish();
			return;
		}
		
		
		options = new DisplayImageOptions.Builder()
		.showStubImage(R.drawable.uni_img_loading_shape)
		.showImageForEmptyUri(R.drawable.uni_img_loading_shape)
		.showImageOnFail(R.drawable.uni_img_loading_shape)
		.resetViewBeforeLoading(true)
		.cacheOnDisc(true)
//		.imageScaleType(ImageScaleType.EXACTLY)
		.imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
		.bitmapConfig(Bitmap.Config.RGB_565)
//		.displayer(new FadeInBitmapDisplayer(300))
		.build();
		
		
		
		
		currentViewPosition = bundle.getInt(Constant.TAG_CLASS_IMAGE_INDEX);
		mViewPager.setCurrentItem(currentViewPosition);//设置当前显示的pager
		
		if(imagePathList.size() == 1){//只有一张图片的浏览情况
			mTextViewCurrentViewPosition.setText("");
		}
		else {//多张图片的浏览情况
			mTextViewCurrentViewPosition.setText((currentViewPosition+1)+"/"+imagePathList.size());
		}
		
		
		CLog.d(TAG, "current view position:" + currentViewPosition);
		
		/**
		 * 初始化数组
		 */
		if(imagePathList != null && imagePathList.size() > 0){
			photoViewList = new PhotoView[imagePathList.size()];
			rotateRecord = new int[imagePathList.size()];
		}
		

		mViewPager.setAdapter(new SamplePagerAdapter());
	}
	
	public void findViews(){
		
		mViewPager = (ViewPager) findViewById(R.id.image_view_vp);//使用开源的图片浏览实现方式
		mTextViewCurrentViewPosition = (TextView) findViewById(R.id.image_which);
		
		
		//删除图片
		spinner = (ProgressBar) findViewById(R.id.loading);
		
		/**
		 * 设置这个,那么viewPager会将页面缓存起来,这里要注意,当设置过大时,可能会出现内存溢出
		 */
		mViewPager.setOffscreenPageLimit(4);
		
		/**
		 * 自己加一个页面变化的监听器,可以进页面的变化作相应的处理
		 */
		mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
			
			@Override
			public void onPageSelected(int position) {//当前选择的是哪个图片
				// TODO Auto-generated method stub
				CLog.d(TAG, "currentViewPosition====>" + position);
				
				/**
				 * 更新当前图片浏览的位置
				 */
				currentViewPosition = position;
				
				mTextViewCurrentViewPosition.setText((currentViewPosition+1)+"/"+imagePathList.size());
			}
			
			@Override
			public void onPageScrolled(int arg0, float arg1, int arg2) {
				// TODO Auto-generated method stub
//				Log.d(TAG, "2");
			}
			
			@Override
			public void onPageScrollStateChanged(int arg0) {
				// TODO Auto-generated method stub
				CLog.d(TAG, "3====>" + arg0);
			}
			
		});
		
		
	};

	
	  private class SamplePagerAdapter extends PagerAdapter {
		@Override
		public int getCount() {
			if(imagePathList == null){
				return 0;
			}
			
			return imagePathList.size();
		}

		@Override
		public View instantiateItem(ViewGroup container, int position) {
			
			PhotoView photoView = new PhotoView(container.getContext());
			
			CLog.d(TAG, "picture path:" + imagePathList.get(currentViewPosition) + "\tposition:" + position);
			
			UniversalImageLoaderUtil.getInstance().display(imagePathList.get(position), photoView, options, spinner, null);

			photoView.setOnPhotoTapListener(new OnPhotoTapListener() {
				@Override
				public void onPhotoTap(View arg0, float arg1, float arg2) {
					((Activity)mContext).finish();
				}
			});
			container.addView(photoView, LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
			return photoView;
		}

		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {
			container.removeView((View) object);
		}

		@Override
		public boolean isViewFromObject(View view, Object object) {
			return view == object;
		}

	}
	

}

 

 

4 自定义图片查看器布局image_view.xml:

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

    <com.example.webviewtest.view.HackyViewPager
        android:id="@+id/image_view_vp"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:gravity="center_vertical" >
    </com.example.webviewtest.view.HackyViewPager>

    <ProgressBar
        android:id="@+id/loading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_gravity="center"
        android:visibility="gone" />

    
    <TextView
        android:id="@+id/image_which"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:gravity="center_horizontal"
        android:paddingBottom="10dip"
        android:text="1/3" />

</RelativeLayout>

 

效果图:

1加载中:

 

2 加载完,显示网页内容,内容为我一个博文http://hz-chenwenbiao-91.iteye.com/blog/2038887:

 

 

3 点击网页图片,android界面显示图片:

 

 

附件是源码.点击下载

 

  • 大小: 43.8 KB
  • 大小: 165.7 KB
  • 大小: 121.3 KB
分享到:
评论

相关推荐

    Android构建一个通用的WebView(二):自定义的错误页面、缓存数据,离线浏览

    本文将深入探讨如何构建一个通用的WebView,包括自定义错误页面、缓存数据以及支持离线浏览的功能。 一、自定义错误页面 在使用WebView加载网页时,可能会遇到网络错误、404找不到页面等问题。默认情况下,WebView...

    webview重载使用&自定义网址.zip

    6. **图片资源**:项目中的图片文件可能用于界面设计,比如网页的背景图,或者是教程中的步骤截图,帮助理解WebView的使用。 7. **Eclipse项目结构**:`.classpath`和`.project`文件是Eclipse项目的元数据,它们...

    Android中Webview与原生界面交互及二维码扫描功能实现

    总之,"Android中Webview与原生界面交互及二维码扫描功能实现"项目涵盖了Android开发中的关键技术点,包括WebView的使用、JavaScript与原生代码的交互,以及二维码扫描功能的集成。通过学习和实践这个项目,开发者...

    应用源码之webview重载使用&自定义网址.zip

    本文将深入探讨WebView的重载使用及自定义网址处理的实践方法。 首先,WebView的基本使用包括初始化、加载网页以及设置基本属性。在AndroidManifest.xml中,我们需要在对应的Activity中添加Internet权限: ```xml ...

    安卓Andriod源码——webview重载使用&自定义网址.zip

    `安卓Andriod源码——webview重载使用&自定义网址.zip`这个压缩包文件显然是一个关于如何自定义和优化WebView使用的示例项目。下面我们将深入探讨其中涉及的关键知识点。 1. **WebView组件**: WebView是Android ...

    Android应用源码之webview重载使用&自定义网址.zip

    这个压缩包“Android应用源码之webview重载使用&自定义网址”提供了一些关于如何高效且自定义地使用WebView的示例代码。让我们详细探讨一下这个主题。 1. **WebView的基本使用**: - WebView是Android SDK中的一个...

    uni-app自定义弹窗组件,支持自定义图片,文本、按钮等功能。

    uni-app自定义弹窗组件,支持自定义图片,文本、按钮等功能。

    IOS开发webview强制视频内联播放(在没有设置webview.allowsInlineMediaPlayback的情况下也有效)!

    在iOS开发中,Webview是用于展示网页内容的重要组件,而如何处理网页中的视频播放,尤其是实现内联播放,是一个常见的需求。内联播放意味着视频将在网页内容中直接播放,而不是弹出全屏播放器。通常,我们可以通过...

    WebView加载网页可查看网页中的所有图片并下载保存

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序内部加载和显示网页内容,而无需离开应用。...在这个场景中,我们要...通过深入研究和实践,你可以创建一个功能完善的WebView图片查看和下载应用。

    WebView加载失败错误处理

    然而,在实际使用中,由于网络问题、页面不存在或编码错误等原因,WebView可能会加载失败。这时,我们需要对这些错误进行妥善处理,为用户提供友好的体验。本文将详细介绍如何在WebView加载失败时,自定义错误页面。...

    Android中WebView使用

    随着HTML5技术的发展,WebView的使用愈发广泛,许多App都采用混合开发模式,利用WebView加载本地或远程的HTML资源,以实现丰富的用户界面和动态功能。 首先,我们来了解一下WebView的基本用法。在AndroidManifest....

    Android使用Html实现登录功能——重点掌握Webview js的使用

    其中,`JavaScriptInterface`是一个自定义类,继承自`Object`,并在其中定义`onLogin()`方法: ```java public class JavaScriptInterface { private Context context; JavaScriptInterface(Context context) { ...

    WebView入门小例子

    - 设置自定义的UserAgent:`webView.getSettings().setUserAgentString("自定义的UserAgent")`。 - 允许加载本地存储的内容:`webView.getSettings().setAllowFileAccess(true)`。 - 安全性:考虑启用Mixed ...

    android webView加载html 并引用本地资源(图片、字体库)

    在Android开发中,WebView是一个非常重要的组件,它允许我们在应用程序中内嵌网页内容。这篇教程将详细介绍如何在WebView中加载HTML,并引用本地的资源,如图片和字体库。 首先,让我们理解WebView的基本用法。在...

    3D WebView for Android Web Browser 3.14.1(较新)

    使用3D WebView插件,开发者可以自定义WebView的行为,例如设置网页加载的URL、控制页面的缩放、启用或禁用JavaScript执行,甚至可以通过Unity C#脚本与JavaScript进行通信,实现数据交换和用户界面的交互。...

    Android中Webview与原生界面交互及二维码扫描功能实现.zip

    这篇博客和对应的`WebViewDemo`示例代码着重讲解了如何在Android应用中使用WebView与原生界面进行交互,以及如何集成二维码扫描功能。以下是关于这两个主题的详细解释: ### 一、Android WebView的使用 1. **基本...

    在webView界面的ActionBar中显示加载进度

    "在webView界面的ActionBar中显示加载进度"这个主题就是关于如何将WebView的加载进度实时展示在应用的Action Bar(在Android KitKat及以上版本称为ToolBar)上,为用户提供更好的交互体验。 首先,我们需要创建一个...

    原生安卓使用webview在线阅读pdf文档

    7. **自定义界面**:根据需求,可以通过CSS和JavaScript对PDF预览界面进行二次开发,比如更改主题颜色、调整字体大小等。 8. **处理错误**:别忘了处理可能的加载错误,如网络问题、PDF加载失败等,可以通过重写...

Global site tag (gtag.js) - Google Analytics