下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
【移動應(yīng)用開發(fā)技術(shù)】Android開發(fā)中怎么實(shí)現(xiàn)一個長按將文章生成圖片的功能
這篇文章將為大家詳細(xì)講解有關(guān)Android開發(fā)中怎么實(shí)現(xiàn)一個長按將文章生成圖片的功能,文章內(nèi)容質(zhì)量較高,因此在下分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。長按菜單實(shí)現(xiàn)WebView可以如下實(shí)現(xiàn):mWebView.setOnCreateContextMenuListener(new
View.OnCreateContextMenuListener()
{
@Override
public
void
onCreateContextMenu(ContextMenu
menu,
View
v,
ContextMenu.ContextMenuInfo
menuInfo)
{
genImg.setVisibility(View.VISIBLE);
T.showSToast(mContext,
"再次點(diǎn)擊文章可隱藏圖片分享");
}
});
//
點(diǎn)擊隱藏底部按鈕
mWebView.setOnTouchListener(new
View.OnTouchListener()
{
@Override
public
boolean
onTouch(View
v,
MotionEvent
event)
{
switch
(event.getAction())
{
case
MotionEvent.ACTION_DOWN:
lastTime
=
SystemClock.uptimeMillis();
break;
case
MotionEvent.ACTION_UP:
if
(SystemClock.uptimeMillis()
-
lastTime
<
300)
{
genImg.setVisibility(View.GONE);
}
break;
}
return
false;
}
});這里通過監(jiān)聽WebView的ContextMenu監(jiān)聽何時(shí)顯示底部按鈕;同時(shí)在onTouch方法中隱藏底部按鈕。genImg.setOnClickListener(new
View.OnClickListener()
{
@Override
public
void
onClick(View
v)
{
genImg.setVisibility(View.INVISIBLE);
Intent
intent
=
new
Intent(FakeJianShuActivity.this,
GenScreenShotActivity.class);
intent.putExtra("data",
mHtmlBean);
startActivity(intent);
}
});點(diǎn)擊底部的Button就會跳轉(zhuǎn)到生成長圖的界面,同時(shí)將之前獲取到的HTMLBean對象傳遞過去。長圖效果實(shí)現(xiàn)這里首先說一下實(shí)現(xiàn)思路(思路來源于此)。?首先通過WebView加載一個本地的Html頁面,這個頁面包含一些固定,定義了一些標(biāo)簽。然后根據(jù)傳遞過來的mHtmlBean對象中的信息,通過執(zhí)行JavaScript動態(tài)的替換靜態(tài)HTML頁面中的內(nèi)容;?關(guān)于黑白兩種風(fēng)格的實(shí)現(xiàn),同樣是WebView執(zhí)行Js,動態(tài)替換HTML中CSS樣式,修改WebView的背景色呈現(xiàn)出兩種不同的UI效果。?通過WebView的capturePicture和Canvas可以生成出當(dāng)前WebView的Bitmap對象,有了這個Bitmap就可以圖片保存的功能了。好了,下面就通過代碼分別實(shí)現(xiàn)上述步驟。Html頁面<html>
<head>
<meta
charset="utf-8"/>
</head>
<body>
<img
src="mark.png"
width="13px"
height="20px"
/>
<article
id="content"
></article>
<script
type="text/javascript">
function
changeContent(content)
{
document.getElementById('content').innerHTML
=
content;
}
</script>
</body>
</html>這個HTML頁面的內(nèi)容很簡單,在整個文檔左上角放置了一個小角標(biāo),就是簡書APP生成長圖時(shí)的那個mark.同時(shí)定義了一個JavaScript方法,功能也很簡單,就是用傳遞的參數(shù)content替換article標(biāo)簽中的文檔內(nèi)容。自定義WebView為了方便,我們自定義WebView,這里看一下核心邏輯:public
class
FakeWebView
extends
WebView
{
private
boolean
isFirstLoad
=
false;
public
void
loadData(HtmlBean
bean)
{
assembleData(bean);
if
(Build.VERSION.SDK_INT
>=
21)
{
isFirstLoad
=
true;
webView.setWebChromeClient(new
WebChromeClient()
{
@Override
public
void
onProgressChanged(WebView
view,
int
newProgress)
{
if
(newProgress
==
100)
{
if
(isFirstLoad)
{
isFirstLoad
=
false;
Log.e("TAG",
"onProgressChanged");
updateView();
}
}
}
});
}
else
{
isFirstLoad
=
true;
webView.setVisibility(View.INVISIBLE);
webView.setWebChromeClient(new
WebChromeClient()
{
@Override
public
void
onProgressChanged(WebView
view,
int
newProgress)
{
if
(newProgress
==
100)
{
updateView();
if
(!isFirstLoad)
webView.setVisibility(View.VISIBLE);
}
}
});
}
webView.loadUrl("file:///android_asset/JianShu.html");
}
private
void
assembleData(HtmlBean
bean)
{
final
String
data
=
bean.getContent();
final
String
title
=
bean.getTitle();
final
String
username
=
bean.getUsername();
final
String
publishTime
=
bean.getPublishTime();
String
Title
=
"<h3>"
+
title
+
"</h3>";
String
Footer
=
"<p>"
+
username
+
"</p><p>"
+
publishTime
+
"</p>";
content
=
Title
+
data
+
Footer;
}
public
void
updateView()
{
if
(mode
==
MODE_DAY)
{
webView.setBackgroundColor(Color.WHITE);
}
else
{
webView.setBackgroundColor(Color.parseColor("#263238"));
content
=
"<div
style=\"color:
gray;display:
inline;\">"
+
content
+
"</div>";
}
webView.loadUrl("javascript:changeContent(\""
+
content.replace("\n",
"\\n").replace("\"",
"\\\"").replace("'",
"\\'")
+
"\")");
}
}這幾個方法是生成長圖最核心的方法。在loadData方法中首先調(diào)用了assembleData,這個方法會根據(jù)mHtmlBean這個對象中的數(shù)據(jù)拼接出一段HTML文檔。在webView的loadUrl方法中會從本地加載之前定義好的JianShu.html這個頁面。然后在頁面加載完成,即onProgressChanged回調(diào)方法中newProgress的值等于100時(shí)調(diào)用updateView方法;這個方法會根據(jù)當(dāng)前設(shè)置的模式,設(shè)置WebView的背景,如果是夜間模式,則會對assembleData中生成的文檔外部在添加一個灰色風(fēng)格的div標(biāo)簽,將整個內(nèi)容包在這個div標(biāo)簽中,最后WebView執(zhí)行JS方法changeContent,傳遞的參數(shù)就是之前我們拼接好的內(nèi)容。這樣整個WebView又會刷新一次,整個WebView的內(nèi)容就是文章內(nèi)容了。GenScreenShotActivity
mFakeWebView
=
(FakeWebView)
findViewById(R.id.fakeWebView);
bean
=
(HtmlBean)
getIntent().getSerializableExtra("data");
RadioGroup
changeMode
=
(RadioGroup)
findViewById(R.id.changeMode);
changeMode.setOnCheckedChangeListener(new
RadioGroup.OnCheckedChangeListener()
{
@Override
public
void
onCheckedChanged(RadioGroup
group,
@IdRes
int
checkedId)
{
if
(checkedId
==
R.id.rb_day)
{
mFakeWebView.setMode(FakeWebView.MODE_DAY);
}
else
{
mFakeWebView.setMode(FakeWebView.MODE_NIGHT);
}
}
});
mFakeWebView.loadData(bean);
/**
*
@param
mode
*/
public
void
setMode(@ViewMode
int
mode)
{
this.mode
=
mode;
updateView();
}這樣在Activity中,mFakeWebView對象通過上一個頁面(文章頁)傳遞的mHtmlBean對象就可以更新當(dāng)前視圖了,同時(shí)可以通過RadioButton實(shí)現(xiàn)頁面風(fēng)格的切換。保存圖片距離我們最后的目標(biāo)生成長圖片,前面的工作可以說只是完成了50%,因?yàn)榈侥壳盀橹刮覀冎徊贿^是在WebView中把整個文章內(nèi)容加載出來而已;長圖還沒有呢。因此,下面的工作就是通過WebView生成長圖。public
Bitmap
getScreenView(){
Picture
snapShot
=
webView.capturePicture();
Bitmap
bmp
=
Bitmap.createBitmap(snapShot.getWidth(),snapShot.getHeight(),
Bitmap.Config.ARGB_8888);
Canvas
canvas
=
new
Canvas(bmp);
snapShot.draw(canvas);
return
bmp;
}WebVeiw很人性化,通過這個方法,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度公益崗位用工合作協(xié)議3篇
- 2025年度電商平臺會員消費(fèi)返利協(xié)議3篇
- 2025年度廢塑料瓶回收與環(huán)保瓶蓋生產(chǎn)合同樣板3篇
- 二零二五年度農(nóng)機(jī)智能化作業(yè)合同書3篇
- 二零二五年度電子信息產(chǎn)品開發(fā)合作協(xié)議書2篇
- 二零二五年度消防安全風(fēng)險(xiǎn)評估與整改方案協(xié)議3篇
- 農(nóng)村土地經(jīng)營權(quán)抵押貸款擔(dān)保合同
- 2025年度醫(yī)藥研發(fā)人員競業(yè)禁止勞動合同書3篇
- 2025年度餐飲業(yè)食品安全責(zé)任書3篇
- 二零二五年度歷史文化名城拆遷房產(chǎn)分割與文物保護(hù)合同3篇
- 手術(shù)室發(fā)生地震應(yīng)急預(yù)案演練
- 配合、協(xié)調(diào)、服務(wù)方案
- 市政工程監(jiān)理大綱
- 2023-2024學(xué)年廣東省廣州市黃埔區(qū)六年級(上)期末數(shù)學(xué)試卷(A卷)
- 初中數(shù)學(xué)新課程標(biāo)準(zhǔn)(2024年版)
- 2024年北京市學(xué)業(yè)水平合格性地理試卷(第一次)
- 黑龍江哈爾濱六中2025屆高三第六次模擬考試數(shù)學(xué)試卷含解析
- GB/T 36547-2024電化學(xué)儲能電站接入電網(wǎng)技術(shù)規(guī)定
- 會議記錄培訓(xùn)教材課件幻燈片
- 期末測試卷(一)2024-2025學(xué)年 人教版PEP英語五年級上冊(含答案含聽力原文無聽力音頻)
- 2024-2030年中國薯?xiàng)l行業(yè)發(fā)展趨勢及投資盈利預(yù)測報(bào)告
評論
0/150
提交評論