美文网首页
Android 将布局转换为Bitmap

Android 将布局转换为Bitmap

作者: Ggx的代码之旅 | 来源:发表于2018-11-05 13:30 被阅读170次

关于此方法百度上有很多解决方案,但大多数都是使用的getDrawingCache()这个方法,但是此方法已经被废弃,官方推荐使用PixelCopy来代替。
关于这个类有此描述:
Provides a mechanisms to issue pixel copy requests to allow for copy operations from {@link Surface} to {@link Bitmap}
方法签名如下:

  1. public static void request(@NonNull SurfaceView source, @NonNull Bitmap dest, @NonNull OnPixelCopyFinishedListener listener, @NonNull Handler listenerThread)
  2. public static void request(@NonNull SurfaceView source, @Nullable Rect srcRect, @NonNull Bitmap dest, @NonNull OnPixelCopyFinishedListener listener, @NonNull Handler listenerThread)
  3. public static void request(@NonNull Surface source, @NonNull Bitmap dest, @NonNull OnPixelCopyFinishedListener listener, @NonNull Handler listenerThread)
  4. public static void request(@NonNull Surface source, @Nullable Rect srcRect, @NonNull Bitmap dest, @NonNull OnPixelCopyFinishedListener listener, @NonNull Handler listenerThread)
  5. public static void request(@NonNull Window source, @NonNull Bitmap dest, @NonNull OnPixelCopyFinishedListener listener, @NonNull Handler listenerThread)
  6. public static void request(@NonNull Window source, @Nullable Rect srcRect, @NonNull Bitmap dest, @NonNull OnPixelCopyFinishedListener listener, @NonNull Handler listenerThread)
    这些方法只是提供针对不同的视图源,做的封装。这里我们选择第6个方法签名专门说一下使用方法。
    签名描述:
    更具public static void request(@NonNull Window source, @Nullable Rect srcRect, @NonNull Bitmap dest, @NonNull OnPixelCopyFinishedListener listener, @NonNull Handler listenerThread)可以看出此方法需要提供5个参数。
  • Window source:提供一个copy源,这里的源表示window,表示从哪个window。
  • Rect srcRect:提供一个范围
  • Bitmap dest:表示将从window中拷贝出来的图像写如到目标位图对象中。
  • OnPixelCopyFinishedListener listener :这是一个回调,当拷贝结束后会调用此方法。
  • Handler listenerThread:该参数表示指定上面的回调在哪个线程中执行。
    看一个简单的例子:

public void clickMe(){
      //这里将LinearLayout布局转换成Bitmap给ImageView显示
        final LinearLayout view=findViewById(R.id.view);
        final ImageView image=findViewById(R.id.image);
        //准备一个bitmap对象,用来将copy出来的区域绘制到此对象中
        final Bitmap bitmap=Bitmap.createBitmap(view.getWidth(),view.getHeight(),Bitmap.Config.ARGB_8888,true);
        convertLayoutToBitmap(getWindow(), view,bitmap, 
                    new PixelCopy.OnPixelCopyFinishedListener() {
            @Override
            public void onPixelCopyFinished(int copyResult) {
                //如果成功
                if(copyResult==PixelCopy.SUCCESS){
                    image.setImageBitmap(bitmap);
                }
            }
        });
 }

private void convertLayoutToBitmap(Window window,View view,Bitmap dest,
                                              PixelCopy.OnPixelCopyFinishedListener listener){
        //获取layout的位置
        final int[] location=new int[2];
        view.getLocationInWindow(location);
        //请求转换
        PixelCopy.request(window,
                  new Rect(location[0],location[1],location[0]+view.getWidth(),location[1]+view.getHeight()),
                dest,listener,new Handler(Looper.getMainLooper()));
}

相关文章

网友评论

      本文标题:Android 将布局转换为Bitmap

      本文链接:https://www.haomeiwen.com/subject/kscsxqtx.html