Android:将View的内容映射成Bitmap

   最近在做一个类似于游标的东西,由一个类似于seekbar的view来控制下端view内容的显示位置。所以需要将view中的内容映射成一张图片,设为seekbar的背景。所以就做了一些尝试,不过还有一些遗漏的小问题。

      在Android中自有获取view中的cache内容,然后将内容转换成bitmap,方法名是:getDrawingCache(),返回结果为Bitmap,但是刚开始使用的时候,得到的结果都是null,所以在一个论坛里查到了正确的使用方法.代码如下:

 

Java代码   收藏代码
  1. contentLayout.setDrawingCacheEnabled(true);  
  2.         contentLayout.measure(  
  3.                 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),  
  4.                 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));  
  5.         contentLayout.layout(00, contentLayout.getMeasuredWidth(),  
  6.                 contentLayout.getMeasuredHeight());  
  7.   
  8.         contentLayout.buildDrawingCache();  
  9.           
  10.         Bitmap bitmap= contentLayout.getDrawingCache();  
 

      最后就可以调用:Bitmap bitmap = view.getDrawingCache();就可以得到图片了。

 

      为了测试这个功能,我使用了两种方式来创建LinerLayout中的内容,一种是在xml文件中就将view的内容添加了,只需在代码中添加对应ImageView中的图片就行了;另一种是动态添加LinerLayout中的View。

      项目的主界面为:

 

Android:将View的内容映射成Bitmap_第1张图片

接下来是SET_VIEW的代码:

 

Java代码   收藏代码
  1. public void onCreate(Bundle savedInstanceState) {  
  2.     super.onCreate(savedInstanceState);  
  3.     setContentView(R.layout.set_view);  
  4.     contentLayout = (LinearLayout) findViewById(R.id.content);  
  5.     imgSource1 = (ImageView) findViewById(R.id.imgSource1);  
  6.     imgSource2 = (ImageView) findViewById(R.id.imgSource2);  
  7.     imgCache = (ImageView) findViewById(R.id.imgCache);  
  8.   
  9.     imgSource1.setImageResource(R.drawable.source1);  
  10.     imgSource2.setImageResource(R.drawable.source2);  
  11.       
  12.     contentLayout.setDrawingCacheEnabled(true);  
  13.     contentLayout.measure(  
  14.             MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),  
  15.             MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));  
  16.     contentLayout.layout(00, contentLayout.getMeasuredWidth(),  
  17.             contentLayout.getMeasuredHeight());  
  18.   
  19.     contentLayout.buildDrawingCache();  
  20.       
  21.     Bitmap bitmap= contentLayout.getDrawingCache();  
  22.     if(bitmap!=null){  
  23.         imgCache.setImageBitmap(bitmap);  
  24.     }else{  
  25.         Log.i("CACHE_BITMAP""DrawingCache=null");  
  26.     }  
  27. }  

 

 set_view.xml布局文件为:

 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical" android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent">  
  5.     <TextView android:text="set_view" android:layout_width="fill_parent"  
  6.         android:layout_height="wrap_content"></TextView>  
  7.     <LinearLayout android:id="@+id/content"  
  8.         android:orientation="vertical" android:layout_width="wrap_content"  
  9.         android:layout_height="wrap_content">  
  10.         <ImageView android:id="@+id/imgSource1"  
  11.             android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView>  
  12.         <ImageView android:id="@+id/imgSource2"  
  13.             android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView>  
  14.     </LinearLayout>  
  15.   
  16.     <LinearLayout android:id="@+id/cache"  
  17.         android:layout_width="wrap_content" android:layout_height="wrap_content">  
  18.         <ImageView android:id="@+id/imgCache" android:layout_width="wrap_content"  
  19.             android:layout_height="wrap_content">  
  20.         </ImageView>  
  21.     </LinearLayout>  
  22. </LinearLayout>  

 

 运行效果为:


Android:将View的内容映射成Bitmap_第2张图片

第一种情况比较简单,不会出现问题,接下来是第二种情况,这种情况有个需要注意的地方:

 

Java代码   收藏代码
  1. protected void onCreate(Bundle savedInstanceState) {  
  2.         // TODO Auto-generated method stub  
  3.         super.onCreate(savedInstanceState);  
  4.         setContentView(R.layout.add_view);  
  5.         addViewContent = (LinearLayout) findViewById(R.id.addViewContent);  
  6.         imgAddViewCache = (ImageView) findViewById(R.id.imgAddViewCache);  
  7.         // addImgSource();  
  8.         addRelativeLayout();  
  9.   
  10.         addViewContent.setDrawingCacheEnabled(true);  
  11.         addViewContent.measure(  
  12.                 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),  
  13.                 MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));  
  14.         addViewContent.layout(00, addViewContent.getMeasuredWidth(),  
  15.                 addViewContent.getMeasuredHeight());  
  16.   
  17.         addViewContent.buildDrawingCache();  
  18.         int color = addViewContent.getDrawingCacheBackgroundColor();  
  19.   
  20.         Bitmap cacheBitmap = addViewContent.getDrawingCache();  
  21.         Bitmap bitmap = Bitmap.createBitmap(cacheBitmap);//注意:这地方必须特别注意  
  22.         if (bitmap != null) {  
  23.             imgAddViewCache.setImageBitmap(bitmap);  
  24.             imgAddViewCache.setDrawingCacheBackgroundColor(color);  
  25.         } else {  
  26.             Log.i("CACHE_BITMAP""DrawingCache=null");  
  27.         }  
  28.     }  
  29.   
  30.     private void addRelativeLayout() {  
  31.         // TODO Auto-generated method stub  
  32.         RelativeLayout.LayoutParams layoutpare = new RelativeLayout.LayoutParams(  
  33.                 LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);  
  34.   
  35.         RelativeLayout relativeLayout = new RelativeLayout(this);  
  36.         relativeLayout.setLayoutParams(layoutpare);  
  37.   
  38.         ImageView imgView1 = new ImageView(this);  
  39.         ImageView imgView2 = new ImageView(this);  
  40.         imgView1.setImageResource(R.drawable.source1);  
  41.         imgView2.setImageResource(R.drawable.source2);  
  42.         RelativeLayout.LayoutParams img1 = new RelativeLayout.LayoutParams(38,  
  43.                 38);  
  44.         img1.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);  
  45.         RelativeLayout.LayoutParams img2 = new RelativeLayout.LayoutParams(38,  
  46.                 38);  
  47.         img2.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);  
  48.   
  49.         relativeLayout.addView(imgView1, img1);  
  50.         relativeLayout.addView(imgView2, img2);  
  51.         addViewContent.addView(relativeLayout);  
  52.     }  
  53.   
  54.     /** 
  55.      * 添加图片源 
  56.      */  
  57.     private void addImgSource() {  
  58.         ImageView imgView1 = new ImageView(this);  
  59.         ImageView imgView2 = new ImageView(this);  
  60.         imgView1.setImageResource(R.drawable.source1);  
  61.         imgView2.setImageResource(R.drawable.source2);  
  62.         addViewContent.addView(imgView1, new LayoutParams(  
  63.                 LinearLayout.LayoutParams.WRAP_CONTENT,  
  64.                 LinearLayout.LayoutParams.WRAP_CONTENT));  
  65.         addViewContent.addView(imgView2, new LayoutParams(  
  66.                 LinearLayout.LayoutParams.WRAP_CONTENT,  
  67.                 LinearLayout.LayoutParams.WRAP_CONTENT));  
  68.     }  

 

 对于上面的代码,需要说明一下:一种我是直接添加ImageView到页面中,这种情况没有问题,后来我又尝试了新建一个RelativeLayout中添加布局文件,

发现如果没有“代码中注释:注意”的一行时,混出现运行时的异常:trying to use a recycled bitmap android.graphics.Bitmap.这个问题我debug了很久,

也没有找到很彻底的方法来解决,不过用“注意”的一行代码就能够实现。但是显示的时候会出现意想不到的结果,关于出现的问题可以看下面的图:


Android:将View的内容映射成Bitmap_第3张图片

布局添加的图片没有全部显示出来,只显示了一个,这个原因我还没有解决,最近几天我会试着解决。

add_view.xml:

 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:orientation="vertical" android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent">  
  5.     <TextView android:text="add_view" android:layout_width="fill_parent"  
  6.         android:layout_height="wrap_content"></TextView>  
  7.     <LinearLayout android:id="@+id/addViewContent"  
  8.         android:orientation="vertical" android:layout_width="fill_parent"  
  9.         android:layout_height="wrap_content">  
  10.     </LinearLayout>  
  11.   
  12.     <LinearLayout android:id="@+id/addViewCache"  
  13.         android:layout_width="wrap_content" android:layout_height="wrap_content">  
  14.         <ImageView android:id="@+id/imgAddViewCache"  
  15.             android:layout_width="fill_parent" android:layout_height="wrap_content">  
  16.         </ImageView>  
  17.     </LinearLayout>  
  18.   
  19. </LinearLayout>  

 

同时推荐一篇国外文章

http://www.brighthub.com/mobile/google-android/articles/30676.aspx

你可能感兴趣的:(Android:将View的内容映射成Bitmap)