在项目开发中需向三方平台实时分享当前界面截图,所以需要截图当前某些view控件,从而保存将其保存本地后,进行三方分享,最终造就了此篇来源
关联篇
起由
因需分享图片到微信、QQ等三方平台 ; 同时不可展现View在当前分享一级视图内;
解决方式
使用相对布局进行布局覆盖,需要分享的View设置为Invisible状态,点击分享时截取View转为图片,然后进行分享
Effect
注意
- 虽然已经工作了很久,我依旧喜欢复杂的事情简单化~ 能直接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() {
}
});