仿抖音短视频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;

    @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;
    }
}

MainActivity Xml

<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"
    />

项目代码

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() {

                }
            });

扩展方法
以下内容 : 我认为可以先行忽略,不过也可以看看,毕竟是看了十几篇类似博文的产物 ~

方式一 :

图片压缩、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 (photoBitmap.compress(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;
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章