View转换为Bitmap

在Android中所有的控件都是View的直接子类或者间接子类,通过它们可以组成丰富的UI界面。在窗口显示的时候Android会把这些控件都加载到内存中,形成一个以ViewRoot为根节点的控件树,然后由根节点开始逐级把控件绘制到屏幕上。

可以通过调用控件的setDrawingCacheEnabled(true)方法,开启绘图缓存功能,在绘制View的时候把图像缓存起来,然后通过getDrawingCache()方法获取这个缓存的Bitmap。需要注意的是,当不再使用这个Bitmap时,需要调用destroyDrawingCache()方法,释放Bitmap资源。由于在绘制View到屏幕时缓存图像会降低控件绘制的效率,因此只会在需要使用View的图像缓存的时候才调用setDrawingCacheEnabled(true)方法开启图像缓存功能,当不再使用图像缓存时需要调用setDrawingCacheEnabled(false) 关闭图像缓存功能。

这种方法在支持拖拽类型的应用中经常见到,在Android系统的Launcher应用中也使用了这种方法,当用户拖拽应用的快捷图标时,获取到控件对应的Bitmap,然后操作这个Bitmap随着手指移动。

下面通过一段代码来说明如何获取View对应的Bitmap。在代码中使用了两个ImageView并给它们都设置了显示的图片资源,然后把第一个ImageView对应的bitmap显示到第二个ImageView中。由于在Activity的onCreate方法中调用这个方法,当执行Activity的onCreate方法时,控件还没有准备好,所以需要使用Handler进行延迟操作,Java代码如下:

  // View转换为Bitmap
  public void getDrawingCache(final ImageView sourceImageView, final ImageView destImageView) {

    new Handler().postDelayed(new Runnable() {

      @Override
      public void run() {
        // TODO Auto-generated method stub
        // 开启bitmap缓存
        sourceImageView.setDrawingCacheEnabled(true);
        // 获取bitmap缓存
        Bitmap mBitmap = sourceImageView.getDrawingCache();
        // 显示 bitmap
        destImageView.setImageBitmap(mBitmap);

        // Bitmap mBitmap = sourceImageView.getDrawingCache();
        // Drawable drawable = (Drawable) new BitmapDrawable(mBitmap);
        // destImageView.setImageDrawable(drawable);

        new Handler().postDelayed(new Runnable() {

          @Override
          public void run() {
            // TODO Auto-generated method stub
            // 不再显示bitmap缓存
            // destImageView.setImageBitmap(null);
            destImageView.setImageResource(R.drawable.pet);

            // 使用这句话而不是用上一句话是错误的,空指针调用
            // destImageView.setBackgroundDrawable(null);

            // 关闭bitmap缓存
            sourceImageView.setDrawingCacheEnabled(false);
            // 释放bitmap缓存资源
            sourceImageView.destroyDrawingCache();
          }
        }, DELAY_TIME);
      }
    }, DELAY_TIME);
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值