實現(xiàn)仿簡書選取內(nèi)容生成分享圖片效果

前幾天腦子里忽然閃過簡書的圖片分享效果昂验,感覺很簡潔也很漂亮,想著能不能用自己方式實現(xiàn)一下呢蟹演,于是今天就有了這篇文章抄瑟。好了凡泣,先看下效果圖吧:

GeneratePicture

項目地址:** https://github.com/zhangke3016/GeneratePicture **歡迎star、issues~

實現(xiàn)這個效果皮假,首先要弄明白幾個問題:

一、如何獲取選取的網(wǎng)頁內(nèi)容
二骂维、獲取的網(wǎng)頁內(nèi)容如何加載顯示

GeneratePicture

一惹资、如何獲取選取的網(wǎng)頁內(nèi)容

獲取選取的網(wǎng)頁內(nèi)容,通過Java來獲取選取的網(wǎng)頁內(nèi)容很困難航闺,而實現(xiàn)效果又必須要得到選取的網(wǎng)頁內(nèi)容褪测,我們可以轉(zhuǎn)換下思路,既然通過Java層不容易得到那通過JavaScript是不是要容易點呢潦刃,之后的實現(xiàn)確定這個思路是正確的侮措,JavaScript很容易獲取選取的網(wǎng)頁內(nèi)容。

那我們的思路就是:當用戶點擊生成圖片分享按鈕后乖杠,我們調(diào)用JavaScript方法獲取選取的網(wǎng)頁內(nèi)容同時回調(diào)Java的獲取內(nèi)容方法分扎,將獲取的網(wǎng)頁內(nèi)容回傳到Java層,我們就可以拿到網(wǎng)頁的內(nèi)容了胧洒。
簡單看下代碼:

mWebView.addJavascriptInterface(new WebAppInterface(onGetDataListener), "JSInterface");

public void getSelectedData(WebView webView) {
        String js = "(function getSelectedText() {" +
                "var txt;" +
                "if (window.getSelection) {" +
                "var range=window.getSelection().getRangeAt(0);" +
                "var container = window.document.createElement('div');" +
                "container.appendChild(range.cloneContents());" +
                "txt = container.innerHTML;" +
                "} else if (window.document.getSelection) {" +
                "var range=window.getSelection().getRangeAt(0);" +
                "var container = window.document.createElement('div');" +
                "container.appendChild(range.cloneContents());" +
                "txt = container.innerHTML;" +
                "} else if (window.document.selection) {" +
                "txt = window.document.selection.createRange().htmlText;" +
                "}" +
                "JSInterface.getText(txt);" +
                "})()";

        // calling the js function
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            webView.evaluateJavascript("javascript:" + js, null);
        } else {
            webView.loadUrl("javascript:" + js);
        }
        webView.clearFocus();
    }
 static class WebAppInterface {
        WebViewHelper.OnGetDataListener onGetDataListener;
        WebAppInterface(WebViewHelper.OnGetDataListener onGetDataListener) {
            this.onGetDataListener = onGetDataListener;
        }
        @JavascriptInterface
        public void getText(String text) {
            onGetDataListener.getDataListener(text);
        }
    }
    public interface OnGetDataListener{
        void getDataListener(String text);
    }

上面的實現(xiàn)思路就是當我們要獲取選取的網(wǎng)頁內(nèi)容時畏吓,給WebView注入一段自己寫的JavaScript腳本,這段JavaScript代碼的含義就是獲取當前頁面選取的內(nèi)容包含html標簽卫漫,調(diào)用JSInterface.getText(txt)方法將內(nèi)容回傳給Java的getText(String text)方法菲饼,我們設(shè)置onGetDataListener.getDataListener(text)回調(diào)方法,由需要的地方調(diào)用獲取內(nèi)容列赎。

二宏悦、獲取的網(wǎng)頁內(nèi)容如何加載顯示

我們已經(jīng)獲取到了網(wǎng)頁內(nèi)容,按道理其實調(diào)用TextView的setText(Html.fromHtml())這個方法就可以顯示我們選取的效果,但考慮到美觀性以及截圖保存功能饼煞、圖片的正常顯示源葫,我選取用WebView來加載獲取的網(wǎng)頁內(nèi)容。

這里我是這樣處理的:首先在本地assets文件夾下創(chuàng)建一個html頁面派哲,在頁面里加載基本的顯示內(nèi)容并添加css標簽修飾加載的內(nèi)容臼氨,當獲取到網(wǎng)頁內(nèi)容時,用JavaScript動態(tài)替換本地html頁面指定的對應(yīng)標簽內(nèi)容為獲取的網(wǎng)頁內(nèi)容芭届,并在本地html頁面里對顯示內(nèi)容進行修飾储矩。

看下代碼:

webView.loadUrl("file:///android_asset/generate_pic.html");

public void changeDay(String strData,String userInfo,String userName,String other) {
        if(userInfo == null)
            userInfo ="";
        if(strData == null)
            strData ="";
        if(userName == null)
            userName ="";
        if(other == null)
            other ="";
        strData+="<br /><br />\n" +
                "\t\t<span style=\"font-size: small;color: gray;line-height:150%;\">"+userInfo+"</span>\n" +
                "\t\t<br /><br />\n" +
                "\t\t<hr style=\"margin: auto;border:0;background-color:gray;height:1px;\"/>\n" +
                "\t\t<br />\n" +
                "\t\t<p style=\"color: orangered;font-size: x-small;text-align: center;letter-spacing: 0.5px;\">由<strong>"+userName+"</strong>發(fā)送 "+other+"</p>";
        webView.loadUrl("javascript:changeContent(\"" + strData.replace("\n", "\\n").replace("\"", "\\\"").replace("'", "\\'") + "\")");
        webView.setBackgroundColor(Color.WHITE);
    }

白色和黑色不同的顯示效果實現(xiàn)可以在changeDay方法里改變css樣式來實現(xiàn),比較簡單褂乍。

但這里出現(xiàn)了一個問題:當選取的頁面內(nèi)容有圖片且圖片是以相對路徑顯示的時候就加載不到圖片了持隧。

在這種情況下圖片是相對路徑也就是在本地對應(yīng)的相對路徑下找,本地肯定是找不到的逃片,圖片也就顯示不出來屡拨。
為了讓圖片正常顯示出來,在選取內(nèi)容頁面調(diào)用onLoadResource方法對加載的資源進行判斷褥实,將圖片路徑保存下來呀狼,因為既然選取頁面圖片可以顯示處理,說明路徑是http路徑损离,可以顯示圖片哥艇。
看下代碼:

 mWebView.setWebViewClient(new WebViewClient(){
            @Override
            public void onLoadResource(WebView view, String url) {
                //Log.e("TAG","url :"+url);
                if(url.toLowerCase().contains(".jpg")
                        ||url.toLowerCase().contains(".png")
                        ||url.toLowerCase().contains(".gif")){
                    mlistPath.add(url);
                }
                super.onLoadResource(view, url);
            }

當顯示選取內(nèi)容頁面顯示時動態(tài)修改顯示的圖片路徑,讓圖片顯示出來:

 webView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                //view.loadUrl(url);
                return true;
            }
            public WebResourceResponse shouldInterceptRequest(WebView view,  String url) {
                WebResourceResponse response = null;
                for (String path:WebViewHelper.getInstance().getAllListPath()){
                    if (path.toLowerCase().contains(url.replace("file://","").toLowerCase())){
                        try {
                            response = new WebResourceResponse("image/png", "UTF-8", new URL(path).openStream());
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
                return response;
            }
        });

這樣僻澎,我們的圖片就可以顯示出來啦貌踏!
最后,實現(xiàn)我們的截圖保存功能窟勃,看下代碼:

 /**
     * 截屏
     *
     * @return
     */
    public Bitmap getScreen() {
        Bitmap bmp = Bitmap.createBitmap(webView.getWidth(), 1, Bitmap.Config.ARGB_8888);
        int rowBytes = bmp.getRowBytes();
        bmp = null;

        if (rowBytes*webView.getHeight()>=getAvailMemory()){
            return null;
        }
        bmp = Bitmap.createBitmap(webView.getWidth(), webView.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bmp);
        webView.draw(canvas);
        return bmp;
    }
   private long getAvailMemory() {
        return Runtime.getRuntime().maxMemory();
    }

這里需要對保存的圖片大小做下判斷祖乳,防止創(chuàng)建圖片過大OOM。

到這里秉氧,基本功能就已經(jīng)實現(xiàn)了眷昆。把圖片分享給好友吧~

項目地址:** https://github.com/zhangke3016/GeneratePicture **歡迎star、issues~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谬运,一起剝皮案震驚了整個濱河市隙赁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌梆暖,老刑警劉巖伞访,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異轰驳,居然都是意外死亡厚掷,警方通過查閱死者的電腦和手機弟灼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冒黑,“玉大人田绑,你說我怎么就攤上這事÷盏” “怎么了掩驱?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長冬竟。 經(jīng)常有香客問我欧穴,道長,這世上最難降的妖魔是什么泵殴? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任涮帘,我火速辦了婚禮,結(jié)果婚禮上笑诅,老公的妹妹穿的比我還像新娘调缨。我一直安慰自己,他們只是感情好吆你,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布弦叶。 她就那樣靜靜地躺著,像睡著了一般妇多。 火紅的嫁衣襯著肌膚如雪湾蔓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天砌梆,我揣著相機與錄音,去河邊找鬼贬循。 笑死咸包,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的杖虾。 我是一名探鬼主播烂瘫,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奇适!你這毒婦竟也來了坟比?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤嚷往,失蹤者是張志新(化名)和其女友劉穎葛账,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體皮仁,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡籍琳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年菲宴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片趋急。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡喝峦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出呜达,到底是詐尸還是另有隱情谣蠢,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布查近,位于F島的核電站眉踱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嗦嗡。R本人自食惡果不足惜勋锤,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侥祭。 院中可真熱鬧叁执,春花似錦、人聲如沸矮冬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胎署。三九已至吆录,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間琼牧,已是汗流浹背恢筝。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留巨坊,地道東北人撬槽。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像趾撵,于是被迫代替她去往敵國和親侄柔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,504評論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫占调、插件暂题、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,024評論 4 62
  • 今天跟甜的交集很少薪者,忙了一整天,把胃還餓壞了苦银,不想記錄啸胧,而且下班還排練赶站,一點也不開心,算了纺念,今天就這么過去吧贝椿。
    劉鵬欣閱讀 129評論 0 0
  • 母親一生勤,一生勞陷谱。這一點是有目共睹的烙博。 勤 勤能和什么字組詞呢?勤快、勤奮烟逊、勤儉........
    北朝閱讀 440評論 0 1
  • 眾所周知,中國“基建狂魔”的稱號由來已久访雪,中國基建工程的質(zhì)量和速度也常常受到中外網(wǎng)民的稱贊详瑞。近日,一段大橋空中旋轉(zhuǎn)...
    逗魚吧閱讀 343評論 0 0