源码截取View为图片"/>
仿抖音短视频APP源码截取View为图片
截取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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//我们要截取的Viewtempview = (LinearLayout) findViewById(R.id.gone_view);//用于展示我们已截取View的承载视图mView = (ImageView) findViewById(R.id.img);//点击事件findViewById(R.id.changeviewtobitmap).setOnClickListener(new OnClickListener() {@Overridepublic 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;}
}
MainActivity Xml
<LinearLayoutandroid: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"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginTop="10dp"android:text="你是我患得患失的梦,我是你可有可无的人~~"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginTop="10dp"android:text="毕竟这穿越山河的箭,刺的都是用情致疾的人~~"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginTop="10dp"android:text="毕竟这穿越山河的箭,刺的都是用情致疾的人~~"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:layout_marginTop="10dp"android:text="就让这牵肠挂肚的酒,硫酸一样刺激在你我的心头~~"/>
</LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="50dp"android:gravity="center"android:orientation="vertical"android:padding="4dp"><Buttonandroid:id="@+id/changeviewtobitmap"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="截View视图"/>
</LinearLayout><ImageViewandroid:id="@+id/img"android:layout_width="match_parent"android:layout_height="wrap_content"/>
项目代码
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>() {@Overridepublic void onSubscribe(Disposable d) {}@Overridepublic 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() {@Overridepublic void onStart(SHARE_MEDIA shareMedia) {}@Overridepublic void onResult(SHARE_MEDIA shareMedia) {ToastUtils.shortShow("分享成功!");}@Overridepublic void onError(SHARE_MEDIA shareMedia, Throwable throwable) {}@Overridepublic void onCancel(SHARE_MEDIA shareMedia) {}}).share();} else {ToastUtils.shortShow("请安装QQ客户端");}}//无权限的状态else {Toast.makeText(InviteAwardActivity.this, getString(R.string.picture_jurisdiction), Toast.LENGTH_SHORT).show();}}@Overridepublic void onError(Throwable e) {}@Overridepublic void onComplete() {}});
扩展方法
以下内容 : 我认为可以先行忽略,不过也可以看看,毕竟是看了十几篇类似博文的产物 ~
方式一 :
图片压缩、View转换
/*** 压缩图片** @param bgimage* @param newWidth* @param newHeight* @return*/public static Bitmap zoomImage(Bitmap bgimage, double newWidth, double newHeight) {// 获取这个图片的宽和高float width = bgimage.getWidth();float height = bgimage.getHeight();// 创建操作图片用的matrix对象Matrix matrix = new Matrix();// 计算宽高缩放率float scaleWidth = ((float) newWidth) / width;float scaleHeight = ((float) newHeight) / height;// 缩放图片动作//matrix.postScale(scaleWidth, scaleHeight);//TODO 因为宽高不确定的因素,所以不缩放Bitmap bitmap = Bitmap.createBitmap(bgimage, 0, 0, (int) width,(int) height, matrix, true);return bitmap;}/*** 截取指定View为图片** @param view* @return* @throws Throwable*/public static Bitmap captureView(View view) throws Throwable {Bitmap bm = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);view.draw(new Canvas(bm));return bm;}
压缩使用
Bitmap bitmap = null;try {bitmap = captureView(mShareBackgroundSign);} catch (Throwable throwable) {throwable.printStackTrace();}//图片压缩,加快使用速度~zoomImage(bitmap, 720, 1280);
图片保存到本地 (若要保存,务必记得权限申请)
public static void savePhotoToSDCard(Bitmap photoBitmap, String path, String photoName) {if (checkSDCardAvailable()) {File dir = new File(path);if (!dir.exists()) {dir.mkdirs();}File photoFile = new File(path, photoName + ".png");FileOutputStream fileOutputStream = null;try {fileOutputStream = new FileOutputStream(photoFile);if (photoBitmap != null) {if (photoBitmappress(Bitmap.CompressFormat.PNG, 100, fileOutputStream)) {fileOutputStream.flush();}}} catch (FileNotFoundException e) {photoFile.delete();e.printStackTrace();} catch (IOException e) {photoFile.delete();e.printStackTrace();} finally {try {fileOutputStream.close();} catch (IOException e) {e.printStackTrace();}}}}
方式二 (有人说截取view转bitmap后为null~ 用这种方式清理缓存) :
public static Bitmap getViewBp(View v) {if (null == v) {return null;}v.setDrawingCacheEnabled(true);v.buildDrawingCache();if (Build.VERSION.SDK_INT >= 11) {v.measure(View.MeasureSpec.makeMeasureSpec(v.getWidth(),View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(v.getHeight(), View.MeasureSpec.EXACTLY));v.layout((int) v.getX(), (int) v.getY(),(int) v.getX() + v.getMeasuredWidth(),(int) v.getY() + v.getMeasuredHeight());} else {v.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());}Bitmap b = Bitmap.createBitmap(v.getDrawingCache(), 0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());v.setDrawingCacheEnabled(false);v.destroyDrawingCache();return b;
}
方式三 (有人说截取view转bitmap后为null~ 用这种方式清理缓存):
public static Bitmap convertViewToBitmap(View view) {view.setDrawingCacheEnabled(true);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.buildDrawingCache();Bitmap bitmap = view.getDrawingCache();view.setDrawingCacheEnabled(false);return bitmap;}
更多推荐
仿抖音短视频APP源码截取View为图片
发布评论