Android如何生成圖片分享

需求

有時候可能會有類似分享資產(chǎn)楼誓、戰(zhàn)績這樣的需求,產(chǎn)品需要你生成一張圖片抢肛,然后在上面某個位置加上App的二維碼狼钮,以達(dá)到引流的目的碳柱。而這個生成的圖片也許并不和當(dāng)前頁面完全一樣,這時候就需要我們單獨去進行拼接生成熬芜。

實現(xiàn)

先來模擬一個界面


monijiemian.png

這是顯示的界面莲镣,但是實際生成圖片的時候可能會讓你再加一點別的信息上去,這時候我們可以單獨定義一個類來做這件事情涎拉。

public class ShareView extends FrameLayout {

    private final int IMAGE_WIDTH = 720;
    private final int IMAGE_HEIGHT = 1280;

    private TextView tvInfo;

    public ShareView(@NonNull Context context) {
        super(context);
        init();
    }

    private void init() {
        View layout = View.inflate(getContext(), R.layout.share_view_layout, this);
        tvInfo = (TextView) layout.findViewById(R.id.tv_info);
    }

    /**
     * 設(shè)置相關(guān)信息
     *
     * @param info
     */
    public void setInfo(String info) {
        tvInfo.setText(info);
    }

    /**
     * 生成圖片
     *
     * @return
     */
    public Bitmap createImage() {

        //由于直接new出來的view是不會走測量瑞侮、布局的圆、繪制的方法的,所以需要我們手動去調(diào)這些方法半火,不然生成的圖片就是黑色的越妈。

        int widthMeasureSpec = MeasureSpec.makeMeasureSpec(IMAGE_WIDTH, MeasureSpec.EXACTLY);
        int heightMeasureSpec = MeasureSpec.makeMeasureSpec(IMAGE_HEIGHT, MeasureSpec.EXACTLY);

        measure(widthMeasureSpec, heightMeasureSpec);
        layout(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);
        Bitmap bitmap = Bitmap.createBitmap(IMAGE_WIDTH, IMAGE_HEIGHT, Bitmap.Config.ARGB_8888);

        Canvas canvas = new Canvas(bitmap);
        draw(canvas);

        return bitmap;
    }
}

定義了一個setInfo方法,可以從外部傳入相關(guān)的信息钮糖,createImage方法用于生成最終的圖片梅掠,由于直接new出來的view是不會走測量、布局店归、繪制的方法的阎抒,所以需要我們手動去調(diào)這些方法,不然生成的圖片就是黑色的消痛。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="720px"
    android:layout_height="1280px"
    android:orientation="vertical"
    android:background="#ffffff">

    <ImageView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:src="@drawable/mayday" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20px"
        android:gravity="center_horizontal"
        android:text="我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容我是內(nèi)容"
        android:textSize="40px" />

    <TextView
        android:id="@+id/tv_info"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_marginBottom="20px"
        android:layout_marginTop="20px"
        android:layout_weight="1"
        android:gravity="center_horizontal"
        android:textSize="40px" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <TextView
            android:layout_width="0dp"
            android:layout_height="150px"
            android:layout_weight="1"
            android:background="@color/colorPrimary"
            android:gravity="center"
            android:text="xxxApp就是nb"
            android:textColor="#ffffff"
            android:textSize="50px" />

        <TextView
            android:layout_width="150px"
            android:layout_height="150px"
            android:background="@android:color/darker_gray"
            android:gravity="center"
            android:text="我是二維碼"
            android:textColor="#ffffff" />
    </LinearLayout>
</LinearLayout>

在布局里面我們可以完全用ui給的px尺寸來布局且叁,這樣生成的圖片就和效果圖幾乎完全一樣了。

最后來看下調(diào)用:

    public void createShareImage(View view) {
        ShareView shareView = new ShareView(MainActivity.this);
        shareView.setInfo("其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息其他信息");
        final Bitmap image = shareView.createImage();
        final String path = saveImage(image);
        Log.e("xxx", path);

        if (image != null && !image.isRecycled()) {
            image.recycle();
        }
    }

    /**
     * 保存bitmap到本地
     *
     * @param bitmap
     * @return
     */
    private String saveImage(Bitmap bitmap) {

        File path = getCacheDir();

        String fileName = "shareImage.png";

        File file = new File(path, fileName);

        if (file.exists()) {
            file.delete();
        }

        FileOutputStream fos = null;

        try {
            fos = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
            fos.flush();
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return file.getAbsolutePath();
    }

像QQ這樣的平臺分享是不支持直接分享bitmap的秩伞,所以需要我們先把bitmap保存到本地逞带,再分享本地的路徑地址。
可以看到打印出來最終的圖片地址(不同手機可能會不一樣):/data/data/com.vice.viewshotproject/cache/shareImage.png纱新,用adb命令把它拷貝出來掰担。

//root權(quán)限
adb root
//拷貝到桌面
adb pull /data/data/com.vice.viewshotproject/cache/shareImage.png ~/Desktop/

看下最終生成的圖片:


shareImage.png

尺寸剛好720*1280。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末怒炸,一起剝皮案震驚了整個濱河市带饱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌阅羹,老刑警劉巖勺疼,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異捏鱼,居然都是意外死亡执庐,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門导梆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來轨淌,“玉大人,你說我怎么就攤上這事看尼〉蒺模” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵藏斩,是天一觀的道長躏结。 經(jīng)常有香客問我,道長狰域,這世上最難降的妖魔是什么媳拴? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任黄橘,我火速辦了婚禮,結(jié)果婚禮上屈溉,老公的妹妹穿的比我還像新娘塞关。我一直安慰自己,他們只是感情好子巾,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布描孟。 她就那樣靜靜地躺著,像睡著了一般砰左。 火紅的嫁衣襯著肌膚如雪匿醒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天缠导,我揣著相機與錄音廉羔,去河邊找鬼。 笑死僻造,一個胖子當(dāng)著我的面吹牛憋他,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播髓削,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼竹挡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了立膛?” 一聲冷哼從身側(cè)響起揪罕,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宝泵,沒想到半個月后好啰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡儿奶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年框往,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闯捎。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡椰弊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瓤鼻,到底是詐尸還是另有隱情秉版,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布娱仔,位于F島的核電站沐飘,受9級特大地震影響游桩,放射性物質(zhì)發(fā)生泄漏牲迫。R本人自食惡果不足惜耐朴,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盹憎。 院中可真熱鬧筛峭,春花似錦、人聲如沸陪每。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽檩禾。三九已至挂签,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盼产,已是汗流浹背饵婆。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留戏售,地道東北人侨核。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像灌灾,于是被迫代替她去往敵國和親搓译。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,185評論 25 707
  • ¥開啟¥ 【iAPP實現(xiàn)進入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程锋喜,因...
    小菜c閱讀 6,426評論 0 17
  • 第一次來簡書些己,說不上來它的功能,也說不上自己的目的嘿般。只是刷夠了朋友圈轴总,膩了,四處都是賣商品的博个,即使有什么想法寫...
    ALI小確幸閱讀 141評論 0 0
  • 食欲不振是由于身體過度疲勞而引起的胃腸功能低下怀樟, 所以敲胃經(jīng)為主。 另外盆佣,可以對大魚際(大魚際就是手掌大拇指方向較...
    沈姐說說閱讀 209評論 8 6
  • 最近好萊塢吹起了一陣「共同宇宙」旋風(fēng),但其實共同宇宙是早在19世紀(jì)末就已經(jīng)出現(xiàn)的文學(xué)模式痹兜,定義是「不同作品間的故事...
    老金博客閱讀 944評論 0 1