仿抖音短视频APP源码截取View为图片

编程入门 行业动态 更新时间:2024-10-23 07:24:02

仿抖音短视频APP<a href=https://www.elefans.com/category/jswz/34/1770099.html style=源码截取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为图片

本文发布于:2024-02-04 20:23:59,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1673310.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:源码   图片   视频   仿抖音短   View

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!