Android自定義原生分享界面以及View轉(zhuǎn)Bitmap的問題

前言

前幾天設(shè)計(jì)師說要把APP里的一個(gè)界面轉(zhuǎn)成圖片分享出去畜疾,本來想隨意寫個(gè)Dialog算了肚豺,不過看到知乎里面的分享界面覺得還不錯(cuò),反正無聊自己也寫成這樣算了谷异,現(xiàn)在記錄下分尸。

效果圖:
Screenshot_20180120-114048.jpg

1、界面

據(jù)觀察知乎的分享界面就是用BottomSheetDialog或者BottomSheetDialogFragment寫的歹嘹,所以這里我就用BottomSheetDialogFragment箩绍,具體界面就是

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/share_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="@dimen/dip_fifty_six"
        android:layout_marginStart="@dimen/dip_sixteen"
        android:gravity="center_vertical"
        android:text="@string/share_out_to"
        android:textColor="@color/text_black_474c59"
        android:textSize="@dimen/sp_sixteen"/>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/share_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

RecyclerView的LayoutManager就用GridLayoutManager,設(shè)置一行三個(gè)填充尺上。

2材蛛、數(shù)據(jù)

現(xiàn)在來獲取手機(jī)里具有分享功能的APP,在我們的手機(jī)中安裝了的應(yīng)用支持ACTION_SEND的Activity都會(huì)被列入可選列表怎抛。

由于我們需要顯示的內(nèi)容為APP的Icon卑吭、Label就可以了,所以通過PackageManager來獲取ResolveInfo列表就行马绝。具體代碼為:

List<ResolveInfo> resolveList = packageManager.queryIntentActivities(intent, 0);

由于公司項(xiàng)目已經(jīng)集成了微信SDK豆赏,而且由原生分享出去的圖片在微信里并不會(huì)顯示來自哪個(gè)APP,所以在獲取到resolveList后我需要對(duì)獲取到的列表進(jìn)行篩選處理富稻,去掉分享到微信的原生分享Activity數(shù)據(jù)掷邦,這里直接通過微信的包名鑒別,去掉即可椭赋。然后再單獨(dú)在ResolveInfo集合的前面插入自己的數(shù)據(jù)抚岗,這樣還能確保分享到朋友和分享到朋友圈始終在顯示的最前面兩個(gè)。

    /**
     * 得到支持分享的應(yīng)用
     *
     * @return 返回支持分享的app集合
     */
    public List<ShareItem> scanShreaApp() {
        mShareIntent = new Intent(Intent.ACTION_SEND);
        mShareIntent.setType("image/*");
        PackageManager packageManager = mContext.getPackageManager();
        mResolveInfos.clear();
        for (ResolveInfo resolveInfo : packageManager.queryIntentActivities(mShareIntent, 0)) {
            if (!resolveInfo.activityInfo.packageName.contains("com.tencent.mm")) {
                mResolveInfos.add(resolveInfo);
            }
        }
        ArrayList<ShareItem> shareItems = new ArrayList<>();
        for (ResolveInfo resolveInfo : mResolveInfos) {
            ShareItem shareItem = new ShareItem(resolveInfo.loadLabel(packageManager),
                    resolveInfo.loadIcon(packageManager));
            shareItems.add(shareItem);
        }
        return shareItems;
    }

然后在使用時(shí)將分享給朋友和分享到朋友圈加進(jìn)去:

shareItems.add(new ShareItem("發(fā)送給朋友",
                ContextCompat.getDrawable(getContext(), R.drawable.share_icon_wechat)));
shareItems.add(new ShareItem("發(fā)送到朋友圈",
                ContextCompat.getDrawable(getContext(), R.drawable.share_icon_moments)));
shareItems.addAll(mShare.scanShreaApp());
mShareItemAdapter.setShareItems(shareItems);

做點(diǎn)擊事件時(shí)單獨(dú)區(qū)分調(diào)用微信分享還是原生分享

mShareItemAdapter.setItmClickListener(new ShareItemAdapter.OnShareItmClickListener() {
            @Override
            public void onClick(int position) {
                mViewBitmap = generateShareImg(time, mArticleTitle, mArticleContent);
                mShareUri = BitmapUtil.saveBitmap(mViewBitmap);
                if (position == 0) {
                    shareToWX(SendMessageToWX.Req.WXSceneSession);
                } else if (position == 1) {
                    shareToWX(SendMessageToWX.Req.WXSceneTimeline);
                } else {
                    mShare.share(position - 2, mShareUri);
                }
                dismiss();
            }
        });

3哪怔、View轉(zhuǎn)Bitmap

現(xiàn)在來說下View轉(zhuǎn)Bitmap遇到的問題宣蔚,這個(gè)東西還是可以用到很多地方的,比如之前寫彈底部彈窗认境,設(shè)計(jì)師要求彈窗顯示的時(shí)候胚委,背景是當(dāng)前界面的高斯模糊后的效果,在Android里面寫高斯模糊可沒有iOS那么方便元暴,人家直接就是系統(tǒng)提供的一個(gè)控件篷扩,咱們就得把當(dāng)前界面截屏然后轉(zhuǎn)為Bitmap,然后再給它高斯模糊下茉盏,再作為背景鉴未。

其實(shí)一般View轉(zhuǎn)Bitmap就兩個(gè)套路枢冤,

套路一

Bitmap shareBitmap = Bitmap.createBitmap(view.getMeasuredWidth(),
                view.getMeasuredHeight(),
                Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(shareBitmap);
        view.draw(c);
        

或者

套路二

view.setDrawingCacheEnabled(true);
Bitmap shareBitmap = Bitmap.createBitmap(view.getDrawingCache());
view.setDrawingCacheEnabled(false);

在使用中,如果view是已經(jīng)顯示在界面上了铜秆,那么直接使用時(shí)沒什么問題的淹真,但如果是一個(gè)未曾顯示的界面,想要轉(zhuǎn)換成Bitmap就需要先創(chuàng)建并計(jì)算大小连茧,代碼如下:

View view = View.inflate(this, R.layout.share_out_layout, null);
view.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
view.setDrawingCacheEnabled(true);
Bitmap shareBitmap = Bitmap.createBitmap(view.getDrawingCache());
view.setDrawingCacheEnabled(false);
return shareBitmap;

到這里其實(shí)已經(jīng)差不多了核蘸,但是!Pパ薄客扎! 我在Activity中這樣使用一切正常,放在Fragment中用的時(shí)候就GG了罚斗,報(bào)錯(cuò)信息:java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference 查看Google搜索出來的結(jié)果徙鱼,有人說測(cè)量view的時(shí)候,如果你的布局中包含有 RelativeLayout )API 為17 或者 低于17 會(huì)報(bào)空指針異常针姿。
但是我去掉RelativeLayout后還是有問題袱吆,再把measure時(shí)的參數(shù)改成int + View.MeasureSpec.EXACTLY ,就確實(shí)不會(huì)報(bào)錯(cuò)了距淫,但是由于view的大小被設(shè)置為固定數(shù)值绞绒,效果太差了。后面試了下套路一榕暇,一切正常E詈狻!拐揭!

所以文章到此結(jié)束.....

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末撤蟆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子堂污,更是在濱河造成了極大的恐慌,老刑警劉巖龄砰,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盟猖,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡换棚,警方通過查閱死者的電腦和手機(jī)式镐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來固蚤,“玉大人娘汞,你說我怎么就攤上這事∠ν妫” “怎么了你弦?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵惊豺,是天一觀的道長。 經(jīng)常有香客問我禽作,道長尸昧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任旷偿,我火速辦了婚禮烹俗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘萍程。我一直安慰自己幢妄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布茫负。 她就那樣靜靜地躺著蕉鸳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪朽褪。 梳的紋絲不亂的頭發(fā)上置吓,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音缔赠,去河邊找鬼衍锚。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嗤堰,可吹牛的內(nèi)容都是我干的戴质。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼踢匣,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼告匠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起离唬,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤后专,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后输莺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體戚哎,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年嫂用,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了型凳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嘱函,死狀恐怖甘畅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤疏唾,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布蓄氧,位于F島的核電站,受9級(jí)特大地震影響荸实,放射性物質(zhì)發(fā)生泄漏匀们。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一准给、第九天 我趴在偏房一處隱蔽的房頂上張望泄朴。 院中可真熱鬧,春花似錦露氮、人聲如沸祖灰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽局扶。三九已至,卻和暖如春叁扫,著一層夾襖步出監(jiān)牢的瞬間三妈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工莫绣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畴蒲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓对室,卻偏偏與公主長得像模燥,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子掩宜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,506評(píng)論 25 707
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程蔫骂,因...
    小菜c閱讀 6,358評(píng)論 0 17
  • 原文鏈接:https://github.com/opendigg/awesome-github-android-u...
    IM魂影閱讀 32,901評(píng)論 6 472
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,708評(píng)論 22 664
  • 今天是開始復(fù)習(xí)生理學(xué)的第三天,今天也剛好背到第三章牺汤。說實(shí)話辽旋,我有點(diǎn)焦躁。焦躁的原因有好幾個(gè):1 1月6號(hào)考生理檐迟,1...
    12d051326acc閱讀 183評(píng)論 0 0