WebView

package com.yyq.today_news.activity;

import java.io.InputStream;
import java.net.URL;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup.LayoutParams;
import android.webkit.JsResult;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebView.HitTestResult;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.PopupWindow;
import android.widget.Toast;

import com.umeng.socialize.bean.SHARE_MEDIA;
import com.umeng.socialize.controller.UMServiceFactory;
import com.umeng.socialize.controller.UMSocialService;
import com.umeng.socialize.media.UMImage;
import com.umeng.socialize.sso.QZoneSsoHandler;
import com.umeng.socialize.sso.UMQQSsoHandler;
import com.yyq.nowday.bean.Beijing_NewsData;
import com.yyq.nowday.db.DataEdit_Recommend;
import com.yyq.nowday.tools.HttpUtils;
import com.yyq.nowday.tools.LoadImageUtils;
import com.yyq.nowday.view.TouchImageView;
import com.yyq.today_news.R;


public class WebView_Activity extends Activity {

	private WebView webview;
	private Document doc;
	//	private String url;
	private String html;
	private String replaceAll;
	private ImageView iv_right_return;
	private Beijing_NewsData beijing_NewsData;
	private CheckBox collect;
	private DataEdit_Recommend dataEdit_Recommend;
	private ImageButton btn_web_share;
	Handler handler=new Handler(){
		@Override
		public void handleMessage(Message msg) {
			//			webview.loadData(html, "text/html;charset=utf-8", null); //加载截取网页内容并设置编码格式
			setWebView(beijing_NewsData.getTitle(),beijing_NewsData.getPtime(), html);
		}
	};
	private UMSocialService mController;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_webview);
		init();
		initData();
		// 1,快速集成了jar包,修改了menifest文件
		// 2,加入分享代码

		// 首先在您的Activity中添加如下成员变量
		mController = UMServiceFactory.getUMSocialService("com.umeng.share");
		// 设置分享内容
		mController
		.setShareContent("友盟社会化组件(SDK)让移动应用快速整合社交分享功能,"+beijing_NewsData.getUrl());
		// 设置分享图片, 参数2为图片的url地址
		//		 mController.setShareMedia(new UMImage(this,beijing_NewsData.getImgsr()));
		// 设置分享图片,参数2为本地图片的资源引用
		mController.setShareMedia(new UMImage(this, R.drawable.ic_launcher));
		// 设置分享图片,参数2为本地图片的路径(绝对路径)
		// mController.setShareMedia(new UMImage(getActivity(),
		// BitmapFactory.decodeFile("/mnt/sdcard/icon.png")));

		// 设置分享音乐
		// UMusic uMusic = new
		// UMusic("http://sns.whalecloud.com/test_music.mp3");
		// uMusic.setAuthor("GuGu");
		// uMusic.setTitle("天籁之音");
		// 设置音乐缩略图
		// uMusic.setThumb("http://www.umeng.com/images/pic/banner_module_social.png");
		// mController.setShareMedia(uMusic);

		// 设置分享视频
		// UMVideo umVideo = new UMVideo(
		// "http://v.youku.com/v_show/id_XNTE5ODAwMDM2.html?f=19001023");
		// 设置视频缩略图
		// umVideo.setThumb("http://www.umeng.com/images/pic/banner_module_social.png");
		// umVideo.setTitle("友盟社会化分享!");
		// mController.setShareMedia(umVideo);
		addplatform();
		Listeners();
	}
	public void addplatform(){
		//qq
		addqq();
		//qqzone
		addqqzone();
	}
	/**
	 * 监听设置
	 */
	private void Listeners() {
		iv_right_return.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				finish();
			}
		});
		collect.setOnCheckedChangeListener(new OnCheckedChangeListener() {
			@Override
			public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
				if (isChecked) {
					if (dataEdit_Recommend.selectItem(beijing_NewsData.getDocid())!=null) {
						Toast.makeText(WebView_Activity.this, "已经收藏", Toast.LENGTH_SHORT).show();
					}else {
						dataEdit_Recommend.collectData(beijing_NewsData, isChecked);
						Toast.makeText(WebView_Activity.this, "收藏成功", Toast.LENGTH_SHORT).show();
					}
				} else {
					if (dataEdit_Recommend.deleteData(beijing_NewsData.getDocid())) {
						Toast.makeText(WebView_Activity.this, "取消收藏", Toast.LENGTH_SHORT).show();
					}
				}
			}
		});
		btn_web_share.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				mController.getConfig().removePlatform( SHARE_MEDIA.RENREN, SHARE_MEDIA.DOUBAN);
				mController.openShare(WebView_Activity.this, false);
			}
		});
	}
	private void init() {
		webview=(WebView) findViewById(R.id.wv_window);
		btn_web_share=(ImageButton) findViewById(R.id.btn_web_share);
		iv_right_return=(ImageView) findViewById(R.id.iv_right_return);
		collect=(CheckBox) findViewById(R.id.cb_web_collect);
	}
	/**
	 * 接受intent的数据
	 */
	private void initData() {
		Intent intent=getIntent();
		//		url = intent.getStringExtra("url");
		beijing_NewsData = (Beijing_NewsData) intent.getSerializableExtra("beijing_NewsData");
		dataEdit_Recommend = new DataEdit_Recommend(WebView_Activity.this);
		WebSettings set = webview.getSettings();//webview设置编码格式
		set.setDatabasePath("utf-8");
		set.setJavaScriptEnabled(true);
		new Thread() {
			public void run() {
				load(beijing_NewsData.getUrl());//网页加载
			}
		}.start();
		webview.setWebChromeClient(new MychromClient());
		webview.setOnTouchListener(new OnTouchListener() {
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				// TODO Auto-generated method stub
				HitTestResult hitTestResult = ((WebView) v).getHitTestResult();
				if (null == hitTestResult) {
					System.out.println("非图片");
					return false;
				}else{
					if (hitTestResult.getType() == HitTestResult.IMAGE_TYPE) {
						try {
							System.out.println("点击到了图片。。。。。。。。。。。。。");
							showpopup(hitTestResult.getExtra().toString()); //图片URL
						} catch (Exception e) {
							e.printStackTrace();
						}  
					}
					return false;
				}
			}
		});
		WebSettings webSetting = webview.getSettings();
		webSetting.setBuiltInZoomControls(true); // 设置显示缩放按钮
		webSetting.setSupportZoom(true); // 支持缩放
	}
	/**
	 * 截取需要的网页信息
	 */
	protected void load(String url) {
		try {
			doc = Jsoup.parse(new URL(url), 5000);
			Elements e = doc.getElementsByClass("content");
			html = e.html();
			replaceAll = html.replaceAll("<img [^>]*/>", "");
			System.out.println(replaceAll);
			handler.sendEmptyMessage(1);
		} catch (Exception e1) {
			e1.printStackTrace();
		}
	}

	/**
	 * 将信息显示到WebView上
	 */
	private void setWebView(String title,String date,String value) {
		String htmlContent = "";
		try {
			InputStream in = getAssets().open("context.html");
			byte[] tmp = HttpUtils.readInputStream(in);
			htmlContent = new String(tmp);
			//checkParams(); // 最后校验属性,防止异常标签引发的异常
			webview.loadData(htmlContent.replace("@title", title)
					.replace("@pubdate", date)
					.replace("@content", value), "text/html;charset=utf-8",null);
		} catch (Exception e) {
			e.printStackTrace();
		}
	} 

	public void showpopup(String url) throws Exception{

		TouchImageView img = new TouchImageView(this);
		img.setMaxZoom(4f);
		img.setScaleType(ScaleType.FIT_XY);
		LoadImageUtils.loadImageFromNet(url, img);
		final PopupWindow popupWindow = new PopupWindow(img,
				LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT, true);

		// popupWindow.setTouchable(false);

		// popupWindow.setOutsideTouchable(false);

		// 如果不设置PopupWindow的背景,无论是点击外部区域还是Back键都无法dismiss弹框
		// 我觉得这里是API的一个bug
		ColorDrawable dw = new ColorDrawable(-00000);
		popupWindow.setBackgroundDrawable(dw);
		img.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				popupWindow.dismiss();
			}
		});
		// 设置好参数之后再show
		popupWindow.showAsDropDown(img);

	}

	class MychromClient extends WebChromeClient{
		@Override
		public boolean onJsAlert(WebView view, String url, String message,
				JsResult result) {
			result.cancel();
			AlertDialog.Builder builder=new AlertDialog.Builder(WebView_Activity.this);
			builder.setTitle("提示窗口");
			builder.setMessage(message);
			builder.create().show();
			return true;
		}
		@Override
		public boolean onJsConfirm(WebView view, String url, String message,
				final JsResult result) {
			AlertDialog.Builder dialog = new AlertDialog.Builder(WebView_Activity.this);
			dialog.setIcon(R.drawable.ic_launcher)
			.setTitle("确认提示框")
			.setMessage(message)
			.setPositiveButton("确认", new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface dialog, int which) {
					result.confirm();//用户选择了对话框的确认,表示继续向下走代码,把系统的确认框给确认了
				}
			} )
			.setNegativeButton("取消", new DialogInterface.OnClickListener() {
				@Override
				public void onClick(DialogInterface dialog, int which) {
					result.cancel();//用户选择了对话框的取消,表示不再向下走代码,把系统的确认框给取消了
				}
			}).create().show();
			return true;
		}
	}
	/**
	 * 后退键操作设置
	 */
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		// TODO Auto-generated method stub
		if (keyCode==KeyEvent.KEYCODE_BACK&&webview.canGoBack()) {
			webview.goBack();
		}else{
			super.onKeyDown(keyCode, event);
		}
		return true;
	}
	public void addqq(){
		//参数1为当前Activity,参数2为开发者在QQ互联申请的APP ID,参数3为开发者在QQ互联申请的APP kEY.
		UMQQSsoHandler qqSsoHandler = new UMQQSsoHandler(this, "100424468",
				"c7394704798a158208a74ab60104f0ba");
		qqSsoHandler.addToSocialSDK();  
	}
	public void addqqzone(){
		//参数1为当前Activity,参数2为开发者在QQ互联申请的APP ID,参数3为开发者在QQ互联申请的APP kEY.
		QZoneSsoHandler qZoneSsoHandler = new QZoneSsoHandler(this, "100424468",
				"c7394704798a158208a74ab60104f0ba");
		qZoneSsoHandler.addToSocialSDK();
	}
}

内容概要:本文介绍了一个基于冠豪猪优化算法(CPO)的无人机三维路径规划项目,利用Python实现了在复杂三维环境中为无人机规划安全、高效、低能耗飞行路径的完整解决方案。项目涵盖空间环境建模、无人机动力学约束、路径编码、多目标代价函数设计以及CPO算法的核心实现。通过体素网格建模、动态障碍物处理、路径平滑技术和多约束融合机制,系统能够在高维、密集障碍环境下快速搜索出满足飞行可行性、安全性与能效最优的路径,并支持在线重规划以适应动态环境变化。文中还提供了关键模块的代码示例,包括环境建模、路径评估和CPO优化流程。; 适合人群:具备一定Python编程基础和优化算法基础知识,从事无人机、智能机器人、路径规划或智能优化算法研究的相关科研人员与工程技术人员,尤其适合研究生及有一定工作经验的研发工程师。; 使用场景及目标:①应用于复杂三维环境下的无人机自主导航与避障;②研究智能优化算法(如CPO)在路径规划中的实际部署与性能优化;③实现多目标(路径最短、能耗最低、安全性最高)耦合条件下的工程化路径求解;④构建可扩展的智能无人系统决策框架。; 阅读建议:建议结合文中模型架构与代码示例进行实践运行,重点关注目标函数设计、CPO算法改进策略与约束处理机制,宜在仿真环境中测试不同场景以深入理解算法行为与系统鲁棒性。
05-07
### Webview 技术介绍 Webview 是一种嵌入式浏览器组件,允许开发者在其应用中加载并渲染网页内容。它广泛应用于移动开发领域(如 Android 和 iOS),同时也支持桌面端的应用场景(如 Windows)。以下是关于 Webview 的详细介绍: #### 1. **Webview 的基本概念** Webview 提供了一种简单的方式来集成 HTML、CSS 和 JavaScript 到原生应用程序中。通过这种方式,开发者可以在同一界面中实现本地功能和网络资源的无缝交互[^2]。 #### 2. **主要特点** - **跨平台能力** Webview 基于 WebKit 引擎或其他现代浏览器引擎构建,能够运行在多个操作系统上,从而减少重复编码的工作量[^2]。 - **动态更新** 应用程序可以通过 Webview 实现即时的内容刷新,这对于新闻客户端或社交媒体类应用尤为重要[^2]。 - **安全性保障** 大多数 Webview 都内置了沙箱机制,有效隔离外部网站与宿主环境之间的数据交换,降低潜在风险[^2]。 #### 3. **不同平台下的 Webview** ##### (1) **Windows 平台上的 Flutter WebView** 对于希望利用 Dart 编程语言创建跨平台 GUI 应用的开发者来说,“flutter-webview-windows”是一个不错的选择。该项目基于 Microsoft Edge 的 WebView2 控件开发而成,提供了高性能以及良好的兼容性[^1]。 示例代码如下: ```dart import 'package:flutter_webview_windows/flutter_webview_windows.dart'; void main() { final webView = FlutterWebviewWindows(); webView.createWindow( title: "Example", width: 800, height: 600, url: Uri.parse('https://www.example.com'), ); } ``` ##### (2) **Android 上的 WebView** 在 Android 中,`android.webkit.WebView` 类被用来处理页面加载逻辑。除了常规操作外,还可以自定义设置来增强用户体验,比如启用 JavaScript 支持或者调整缩放比例[^4]。 配置样例: ```java WebView myWebView = findViewById(R.id.webview); myWebView.getSettings().setJavaScriptEnabled(true); // 启动 JS 功能 myWebView.setWebViewClient(new WebViewClient()); // 确保链接点击不会跳转到默认浏览器 myWebView.loadUrl("http://developer.android.com"); ``` ##### (3) **Unity 游戏引擎中的 WebView 插件** 如果目标是将互联网服务引入 Unity 构建的游戏里,则可以选择 “gree/unity-webview”。此插件经过优化后更加稳定可靠,并且易于集成至现有项目之中[^3]。 安装方法提示: ```bash git clone https://gitcode.com/gh_mirrors/uni/Unity-Webview.git cd Unity-Webview open YourProjectInUnity/ ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值