WebView加載Html文本圖片自適應手機屏幕鲫剿,圖片可查(三方依賴)

WebView加載Html文本圖片自適應手機屏幕,圖片可查(三方依賴)

前言:我們在開發(fā)的時候稻轨,后臺有時候會給我們Html的文本灵莲,和圖片,但Html一般是電腦端的澄者,放在手機端圖片會特別大笆呆,所以我們要進行一些適配

先看一下效果


這里因為要用到圖片查看器请琳,所以加上以下依賴 ,支持手勢雙擊赠幕,單機

//圖片選擇控件

implementation'com.github.chrisbanes.photoview:library:1.2.4'

先獲取到布局里面的WebView進行一些設置俄精,此webview是你自己布局里面的


WebSettings webSettings = webview.getSettings();//獲取webview設置屬性

webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);//把html中的內容放大webview等寬的一列中

webSettings.setJavaScriptEnabled(true);//支持js

webSettings.setBuiltInZoomControls(true); // 顯示放大縮小

webSettings.setSupportZoom(true); // 可以縮放


此用法設計到js,所以代碼中一定要添加這句話


webSettings.setJavaScriptEnabled(true);//支持js


因為要實現點擊圖片查看功能榕堰,給webview重新設置WebViewClient

loadDataWithBaseURL要解析的Html文本


webview.setWebViewClient(new MyWebViewClient());

//這個是給圖片設置點擊監(jiān)聽的竖慧,如果你項目需要webview中圖片,點擊查看大圖功能逆屡,可以這么添加

webview.addJavascriptInterface(new JavaScriptInterface(this), "imagelistner");

webview.loadDataWithBaseURL(null, result.getContent(), "text/html", "utf-8", null);

重寫WebViewClient的onPageFinished方法

此類直接可直接寫成activity的內部類方便使用

private class MyWebViewClientextends WebViewClient {

@Override

? ? public void onPageFinished(WebView view, String url) {

super.onPageFinished(view, url);

imgReset(view);//重置webview中img標簽的圖片大小

// html加載完成之后圾旨,添加監(jiān)聽圖片的點擊js函數

? ? ? ? addImageClickListner(view);

}

@Override

? ? public boolean shouldOverrideUrlLoading(WebView view, String url) {

//? view.loadUrl(url);

? ? ? ? return true;

}

/**

* 對圖片進行重置大小,寬度就是手機屏幕寬度魏蔗,高度根據寬度比便自動縮放

*

? ? * @param view

? ? */

? ? private void imgReset(WebView view) {

view.loadUrl("javascript:(function(){" +

"var objs = document.getElementsByTagName('img'); " +

"for(var i=0;i<objs.length;i++)? " +

"{"

? ? ? ? ? ? ? ? +"var img = objs[i];? " +

"? ? img.style.maxWidth = '100%'; img.style.height = 'auto';? " +

"}" +

"})()");

}

/**

* 這段js函數的功能就是砍的,遍歷所有的img節(jié)點,并添加onclick函數莺治,

? ? * <p>* 函數的功能是在圖片點擊的時候調用本地java接口并傳遞url過去

*

? ? * @param view

? ? */

? ? private void addImageClickListner(WebView view) {

view.loadUrl("javascript:(function(){" +

"var objs = document.getElementsByTagName(\"img\"); " +

"for(var i=0;i<objs.length;i++)? " +

"{"

? ? ? ? ? ? ? ? +"window.imagelistner.readImageUrl(objs[i].src);"

? ? ? ? ? ? ? ? +"? ? objs[i].onclick=function()? " +

"? ? {? "

? ? ? ? ? ? ? ? +"? ? ? ? window.imagelistner.openImage(this.src);? " +

"? ? }? " +

"}" +

"})()");

}

}

實現監(jiān)聽(內部類)

class JavaScriptInterface {

private Contextcontext;

private Listimages =new ArrayList<>();

public JavaScriptInterface(Context context) {

this.context = context;

}

@JavascriptInterface

? ? public void readImageUrl(String img) {//把所有圖片的url保存在ArrayList中

? ? ? ? images.add(img);

}

//點擊圖片回調方法

//必須添加注解,否則無法響應

? ? @JavascriptInterface

? ? public void openImage(String img) {

Log.i("TAG","響應點擊事件!");

int index =0;

ArrayList list = addImages();

for (String url : list)

if (url.equals(img)) index = list.indexOf(img);//獲取點擊圖片在整個頁面圖片中的位置

? ? ? ? Intent intent =new Intent();

Bundle bundle =new Bundle();

bundle.putStringArrayList("list_image", list);

bundle.putInt("index", index);

intent.putExtra("bundle", bundle);//將所有圖片的url以及點擊圖片的位置作為參數傳給啟動的activity

? ? ? ? intent.setClass(DetailActivity.this, ShowWebImageActivity.class);

startActivity(intent);//啟動ViewPagerActivity,用于顯示圖片

? ? }

//去重復

? ? private ArrayList addImages() {

ArrayList list =new ArrayList<>();

Set set =new HashSet();

for (String cd :images) {

if (set.add(cd)) {

list.add(cd);

}

}

return list;

}

}

接下來展示ShowWebImageActivity中的代碼,因為ShowWebImageActivity需要進行圖片的滑動瀏覽,所以需?

要用ViewPager,所以自定義了一個ViewPager,在里面處理了觸摸事件,接下來就貼下代碼:

public class ShowWebImageActivity extends AppCompatActivity {

private ArrayListimages;

@Override

? ? protected void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_showwebimage);

HackyViewPager hackyViewPager = (HackyViewPager) findViewById(R.id.view_pager);

Bundle bundle = getIntent().getBundleExtra("bundle");

images = bundle.getStringArrayList("list_image");

int index = bundle.getInt("index");

hackyViewPager.setAdapter(new ViewPagerAdapter());

hackyViewPager.setCurrentItem(index);

}

class ViewPagerAdapter extends PagerAdapter {

@Override

? ? ? ? public int getCount() {

return images.size();

}

@Override

? ? ? ? public boolean isViewFromObject(View view, Object object) {

return view == object;

}

@Override

? ? ? ? public Object instantiateItem(ViewGroup container,int position) {

View view = View.inflate(ShowWebImageActivity.this, R.layout.view_pager_item,null);

PhotoView photoView = (PhotoView) view.findViewById(R.id.photoview);

photoView.setOnPhotoTapListener(new PhotoViewAttacher.OnPhotoTapListener() {

@Override

? ? ? ? ? ? ? ? public void onPhotoTap(View view,float v,float v1) {

finish();

}

});

photoView.setBackgroundColor(Color.TRANSPARENT);

TextView indicator = (TextView) view.findViewById(R.id.indicator);

//用Glide加載圖片

? ? ? ? ? ? Glide.with(ShowWebImageActivity.this).load(images.get(position)).into(photoView);

CharSequence text = getString(R.string.viewpager_indicator, position +1,images.size());

//設置indicator

? ? ? ? ? ? indicator.setText(text);

container.addView(view, ViewPager.LayoutParams.MATCH_PARENT, ViewPager.LayoutParams.MATCH_PARENT);

return view;

}

@Override

? ? ? ? public void destroyItem(ViewGroup container,int position, Object object) {

container.removeView((View) object);

}

}

}

自定義ViewPager:

public class HackyViewPager extends ViewPager {

private boolean isLocked;

public HackyViewPager(Context context) {

super(context);

isLocked =false;

}

public HackyViewPager(Context context, AttributeSet attrs) {

super(context, attrs);

isLocked =false;

}

@Override

? ? public boolean onInterceptTouchEvent(MotionEvent ev) {//用于處理Touch事件

? ? ? ? if (!isLocked) {

try {

return super.onInterceptTouchEvent(ev);

}catch (IllegalArgumentException e) {

e.printStackTrace();

return false;

}

}

return false;

}

@Override

? ? public boolean onTouchEvent(MotionEvent event) {

return !isLocked &&super.onTouchEvent(event);

}

}

相關布局文件:?

MainActivity布局中只有一個簡單的webView;?

ViewPagerActivity布局中也只是一個HackViewPager;?

HackViewPager中每一個View的布局:?

view_pager_item.xml:

<?xmlversion="1.0"encoding="utf-8"?>

<RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"

?android:layout_width="match_parent"

?android:layout_height="match_parent"

?>

?<uk.co.senab.photoview.PhotoView

??android:id="@+id/photoview"

??android:layout_width="match_parent"

??android:layout_height="match_parent"/>

?<TextView

??android:id="@+id/indicator"

??android:layout_width="match_parent"

??android:layout_height="wrap_content"

??android:layout_alignParentBottom="true"

??android:gravity="center"

??android:textSize="18sp"

??android:textColor="@android:color/black"

??android:text="@string/viewpager_indicator"

??android:background="@android:color/transparent"/>

</RelativeLayout>

用到了一個@string/viewpager_indicator為

這個文件里定義

<string name="viewpager_indicator">%1$d/%2$d</string>

以上是借用的這兩篇文章

https://blog.csdn.net/smileiam/article/details/72123227

https://www.jb51.net/article/130645.htm

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末廓鞠,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子谣旁,更是在濱河造成了極大的恐慌床佳,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榄审,死亡現場離奇詭異砌们,居然都是意外死亡,警方通過查閱死者的電腦和手機搁进,發(fā)現死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門浪感,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拷获,你說我怎么就攤上這事篮撑。” “怎么了匆瓜?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長未蝌。 經常有香客問我驮吱,道長,這世上最難降的妖魔是什么萧吠? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任左冬,我火速辦了婚禮,結果婚禮上纸型,老公的妹妹穿的比我還像新娘拇砰。我一直安慰自己梅忌,他們只是感情好,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布除破。 她就那樣靜靜地躺著牧氮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瑰枫。 梳的紋絲不亂的頭發(fā)上踱葛,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天,我揣著相機與錄音光坝,去河邊找鬼尸诽。 笑死,一個胖子當著我的面吹牛盯另,可吹牛的內容都是我干的性含。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鸳惯,長吁一口氣:“原來是場噩夢啊……” “哼胶滋!你這毒婦竟也來了?” 一聲冷哼從身側響起悲敷,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤究恤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后后德,有當地人在樹林里發(fā)現了一具尸體部宿,經...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年瓢湃,在試婚紗的時候發(fā)現自己被綠了理张。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡绵患,死狀恐怖雾叭,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情落蝙,我是刑警寧澤织狐,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站筏勒,受9級特大地震影響移迫,放射性物質發(fā)生泄漏。R本人自食惡果不足惜管行,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一厨埋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捐顷,春花似錦荡陷、人聲如沸雨效。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽徽龟。三九已至,卻和暖如春蛹头,著一層夾襖步出監(jiān)牢的瞬間顿肺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工渣蜗, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屠尊,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓耕拷,卻偏偏與公主長得像讼昆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子骚烧,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355