Android将View转为Drawable

来源:互联网 发布:js模拟鼠标轨迹 编辑:程序博客网 时间:2024/04/29 10:00

参考文章:http://blog.csdn.net/jokers_i/article/details/39549633

将View转为Drawable是在做和GIS相关的项目时候遇到的,这里有两种View,一种是已经显示在界面中的,一种是没有显示在界面中需要通过LayoutInflate去加载的。

1.已经显示出来的:

 //在将View转为BitMap的时候,View有一个私有变量mDrawingCache,就是所谓的cache
 //清空缓存,释放资源,mDrawingCache将调用recycle
 mListView.destroyDrawingCache();
 //设置视图是否开启缓存
 mListView.setDrawingCacheEnabled(true);
 //会调用buildDrawingCache,将View转换为bitmap并赋值给mDrawingCache
 Bitmap bitmap = mListView.getDrawingCache(true);
 //bitmap转为Drawable对象
 Drawable drawable=new BitmapDrawable(null,bitmap);
 mImageView.setBackground(drawable);
 这里有一点需要注意的是:被转为Drawable的View不能被隐藏,一旦被隐藏,它刚刚创建的Bitmap缓存将被回收,后面的setBackground也就会 
 报错。如果想隐藏该View,可以通过另外一种方式,将刚才的bitmap拷贝一份给一个新的bitmap对象就可以了:
 Bitmap bitmap=Bitmap.createBitmap(mListView.getDrawingCache(true));
 这样就可以隐藏View了。如果使用这种方式,那么以下两个方法也就可以调用了:
 mListView.destroyDrawingCache();
 mListView.setDrawingCacheEnabled(false);


2.将未显示的View转为Drawable对象
就是我们通过LayoutInflate加载的视图,他还没有在界面中展示的,所以在转换之前需要设置宽和高,代码大致如下:
mListView.measure(
                  View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
                  View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
mListView.layout(0, 0, mListView.getMeasuredWidth(), mListView.getMeasuredHeight());
//下面的代码和上面的是一样的
mListView.setDrawingCacheEnabled(true);
Bitmap bitmap=Bitmap.createBitmap(mListView.getDrawingCache(true));
Drawable drawable=new BitmapDrawable(null,bitmap);
mListView.destroyDrawingCache();
mListView.setDrawingCacheEnabled(false);
mImageView.setBackground(drawable);
对于这种未显示的View,如果View的宽和高在布局文件中设置,在一些Android版本上getDrawingCache获取的可能为null,可以通过下面的方式解决,在代码中设置View的宽和高参数:
RelativeLayout.LayoutParams layoutParams=new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.MATCH_PARENT);
layoutParams.setMargins(0, 0, 0, 0);
view.setLayoutParams(layoutParams);
这里有一篇文章给出了另外一种解决方式:
http://blog.csdn.net/huangbiao86/article/details/9053429



0 0
原创粉丝点击