在项目开发中需向三方平台实时分享当前界面截图,所以需要截图当前某些view控件,从而保存将其保存本地后,进行三方分享,最终造就了此篇来源

  • 案例实现
  • 项目实现

起由

因需分享图片到微信、QQ等三方平台 ; 同时不可展现View在当前分享一级视图内;

解决方式

使用相对布局进行布局覆盖,需要分享的View设置为Invisible状态,点击分享时截取View转为图片,然后进行分享

Effect

android studdio 如何给手机截图_截取View进行分享

注意

  • 虽然已经工作了很久,我依旧喜欢复杂的事情简单化~ 能直接Copy的决不自己写~能写一行的代码绝不写俩行(内心独白:毕竟我还要去学更多的东西嘛 ~ ~)
  • 所截View,按理不应展示在一级视图内!但是为了效果,故进行了显示;
  • 在我的真实项目场景中,所截View我们需要设置 android:visibility=“invisible” ,这样既在一级表现页进行了展示,又不会报出空指针
  • 因为只是截取View变成图片进行分享,并没有保存在本地,所以不需要申请权限!
  • 最后有一些扩展方法,包含图片压缩、保存图片、友盟分享使用

特别注意

因为我截取View转为Bitmap主要作用于三方分享!

但是QQ分享时多次点击,多次无效 ;

经过Debug查看后~

首先发现原因是bitmap返回为null

然后我用了文章末尾的扩展方法(大多都是返回为null,使用缓存处理)
但是根本无效!!!

然后耗费了一下午时间,我发现QQ分享竟然要申请存储权限!竟然要申请存储权限!竟然要申请存储权限!

好吧, 哥们或许你截取View转bitmap并不是为空!因为View传入之后Debug发现是可以获取图片的,只是到了return的时候发现bitmap为空!!!

Look Here :截取View转为图片的方法

private static Bitmap convertViewToBitmap(View tempView) {
      /**
       * 创建一个bitmap放于画布之上进行绘制 (简直如有神助)
       */
        Bitmap bitmap = Bitmap.createBitmap(tempView.getWidth(),
                tempView.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        tempView.draw(canvas);
        return bitmap;
    }
案例实现
  • MainActivity
package com.example.viewtobitmap;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.os.Bundle;
import android.view.Display;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;

/**
 * @author Mr.Liu
 * */
public class MainActivity extends Activity {
    private LinearLayout tempview;
    private ImageView mView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //我们要截取的View
        tempview = (LinearLayout) findViewById(R.id.gone_view);
        //用于展示我们已截取View的承载视图
        mView = (ImageView) findViewById(R.id.img);

        //点击事件
        findViewById(R.id.changeviewtobitmap).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //屏幕参数
                //Display disPlay = getWindowManager().getDefaultDisplay();
                mView.setImageBitmap(convertViewToBitmap(tempview, null));
            }
        });
    }

    /**
     * 主要方法:创建一个bitmap放于画布之上进行绘制 (简直如有神助)
     */
    private static Bitmap convertViewToBitmap(View tempView, Display disPlay) {
        Bitmap bitmap = Bitmap.createBitmap(tempView.getWidth(),
                tempView.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        tempView.draw(canvas);
        return bitmap;
    }
}
  • activity_main
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:tools="http://schemas.android.com/tools"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:background="#ffffff"
              android:orientation="vertical">

    <LinearLayout
        android:id="@+id/gone_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#ff0"
        android:orientation="vertical"
        android:paddingBottom="10dp"
        android:visibility="visible">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="10dp"
            android:text="你是我患得患失的梦,我是你可有可无的人~~"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="10dp"
            android:text="毕竟这穿越山河的箭,刺的都是用情致疾的人~~"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="10dp"
            android:text="毕竟这穿越山河的箭,刺的都是用情致疾的人~~"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_marginTop="10dp"
            android:text="就让这牵肠挂肚的酒,硫酸一样刺激在你我的心头~~"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:gravity="center"
        android:orientation="vertical"
        android:padding="4dp">

        <Button
            android:id="@+id/changeviewtobitmap"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="截View视图"/>
    </LinearLayout>

    <ImageView
        android:id="@+id/img"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
</LinearLayout>
项目实现

主要是QQ分享,所以只贴出关键部分!

RxPermissions rxPermissions = new RxPermissions(this);
                //Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA 文件存储权限、相机权限
                rxPermissions.request(Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.CAMERA).subscribe(new Observer<Boolean>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(Boolean aBoolean) {
                        //有权限的状态
                        if (aBoolean) {
                            Display displayQQ = getWindowManager().getDefaultDisplay();
                            UMImage umImageQQ = new UMImage(InviteAwardActivity.this, convertViewToBitmap(mSharePicture, displayQQ));
                           /* 便于找到自身错误
                            if (thumbImage == null) {
                                ToastUtils.shortShow("分享图片为空");
                            }*/
                            umImageQQ.setThumb(umImageQQ);
                            boolean qqClientAvailable = PlatformUtil.isQQClientAvailable(InviteAwardActivity.this);
                            if (qqClientAvailable) {
                                new ShareAction(InviteAwardActivity.this)
                                        .setPlatform(SHARE_MEDIA.QQ)
                                        .withMedia(umImageQQ)
                                        .setCallback(new UMShareListener() {
                                            @Override
                                            public void onStart(SHARE_MEDIA shareMedia) {

                                            }

                                            @Override
                                            public void onResult(SHARE_MEDIA shareMedia) {
                                                ToastUtils.shortShow("分享成功!");
                                            }

                                            @Override
                                            public void onError(SHARE_MEDIA shareMedia, Throwable throwable) {

                                            }

                                            @Override
                                            public void onCancel(SHARE_MEDIA shareMedia) {

                                            }
                                        }).share();
                            } else {
                                ToastUtils.shortShow("请安装QQ客户端");
                            }
                        }
                        //无权限的状态
                        else {
                            Toast.makeText(InviteAwardActivity.this, getString(R.string.picture_jurisdiction), Toast.LENGTH_SHORT).show();
                        }
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {

                    }
                });