关于此方法百度上有很多解决方案,但大多数都是使用的getDrawingCache()
这个方法,但是此方法已经被废弃,官方推荐使用PixelCopy
来代替。
关于这个类有此描述:
Provides a mechanisms to issue pixel copy requests to allow for copy operations from {@link Surface} to {@link Bitmap}
方法签名如下:
public static void request(@NonNull SurfaceView source, @NonNull Bitmap dest, @NonNull OnPixelCopyFinishedListener listener, @NonNull Handler listenerThread)
public static void request(@NonNull SurfaceView source, @Nullable Rect srcRect, @NonNull Bitmap dest, @NonNull OnPixelCopyFinishedListener listener, @NonNull Handler listenerThread)
public static void request(@NonNull Surface source, @NonNull Bitmap dest, @NonNull OnPixelCopyFinishedListener listener, @NonNull Handler listenerThread)
public static void request(@NonNull Surface source, @Nullable Rect srcRect, @NonNull Bitmap dest, @NonNull OnPixelCopyFinishedListener listener, @NonNull Handler listenerThread)
public static void request(@NonNull Window source, @NonNull Bitmap dest, @NonNull OnPixelCopyFinishedListener listener, @NonNull Handler listenerThread)
-
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()));
}