zoukankan      html  css  js  c++  java
  • android 当屏幕截图,你如何改变屏幕内容,他们俩bitmap将合并的图像被一起显示

    需求项目中遇到。需要截图。方法,如下面的截图

    使期望截图此方法activity 

    	/**
    	 * 截图 用于相应activity截图
    	 * 
    	 * @param activity
    	 * @return
    	 */
    	public Bitmap takeScreenShot(Activity activity) {
    		View rootView = activity.getWindow().getDecorView();
    		rootView.setDrawingCacheEnabled(true);
    		rootView.buildDrawingCache();
    		Bitmap bitmap = rootView.getDrawingCache();
    		// 获取状态栏高度
    		Rect frame = new Rect();
    		activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
    		int statusBarHeight = frame.top;
    		// Log.i("TAG", "" + statusBarHeight);
    		// 获取屏幕长和高
    
    		int width = activity.getWindowManager().getDefaultDisplay().getWidth();
    		int height = activity.getWindowManager().getDefaultDisplay()
    				.getHeight();
    
    		// 去掉标题栏
    
    		Bitmap b = Bitmap.createBitmap(bitmap, 0, statusBarHeight, width,
    				height - statusBarHeight - height / 3 + 100);
    		
    		rootView.setDrawingCacheEnabled(false);
    
    		
    		return b;
    	}
    

    可是发现截取的图像有些内容是须要我改动的,比方想要把截图中的标题替换成还有一个样子,原来的activity还不能改动的情况下,仅仅能又一次做一个bitmap,并将此bitmap加入到上面返回的bitmap的对应位置中;例如以下是加入的方法:

    	<span style="white-space:pre">	</span>// 这是我从资源文件里定义的长度,也可自由设置
    <span style="white-space:pre">		float dimension = getResources().getDimension(
    <span style="white-space:pre">				</span>R.dimen.activity_action_bar_height);</span>
    </pre><pre name="code" class="java">
    <span style="white-space:pre">		</span><pre name="code" class="java" style="font-size: 13.3333339691162px;"><span style="white-space:pre">		</span>//conView为自己想要增加的View 是我之前自己写的View用来生成替换的bitmap
    <span>		</span>conView.setDrawingCacheEnabled(true);
    <span>		</span>conView.buildDrawingCache();
    <span>		</span>
    <span>		</span>Bitmap bitmap3 = conView.getDrawingCache();//这种方法须要注意,往下会说
    <span>		</span>Bitmap bitmap2 = Bitmap.createBitmap(bitmap3, 0, statusBarHeight,
    <span>		</span>width, (int) dimension);
    int w = bitmap2.getWidth();int h = bitmap2.getHeight();int[] pixels = new int[w * h];bitmap2.getPixels(pixels, 0, w, 0, 0, w, h);
    
    
    <span style="white-space:pre">		</span>
    		
    		Bitmap b = Bitmap.createBitmap(bitmap, 0, statusBarHeight, width,
    				height - statusBarHeight - height / 3 + 100);
    		//
    <span style="white-space:pre">		</span>//将生成的bitmap替换原来bitmap中的位置
    		b.setPixels(pixels, 0, w, width / 5, 0, w, h);


    执行结果发现报错,自定义的View生成的bitmap为空。也就是Bitmap bitmap3 = conView.getDrawingCache();返回空。原来是计算conView的bitmap超出了系统内存限制的大小。主要原因是drawingCache的值大于系统给定的值。

    我们能够看一下buildDrawingCache()方法中的一段代码:

    <span style="line-height: 19.5px; color: rgb(75, 75, 75); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="line-height: 1.5;"></span></span><pre style="margin-top: 0px; margin-bottom: 0px; white-space: pre-wrap; word-wrap: break-word; font-size: 12px; line-height: 18px; font-family: 'Courier New' !important;"><span style="color: rgb(0, 0, 255); line-height: 1.5 !important; font-size: 12px !important;">if</span> (width <= 0 || height <= 0 ||(width * height * (opaque && !translucentWindow ? 2 : 4) ><span style="line-height: 1.5 !important; font-size: 12px !important;"> ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize())) {   
                     destroyDrawingCache();   
                     </span><span style="color: rgb(0, 0, 255); line-height: 1.5 !important; font-size: 12px !important;">return</span><span style="line-height: 1.5 !important; font-size: 12px !important;">;   
      } </span>
    上面的代码中,width和height是所要cache的view绘制的宽度和高度,所以(width * height * (opaque && !translucentWindow ?

    2 : 4) 计算的是当前所须要的cache大小。

    ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize()得到的是系统所提供的最大的DrawingCache的值。当所须要的drawingCache >系统所提供的最大DrawingCache值时,生成Bitmap就会出现故障。此时获取的Bitmap就为null。 所以在仅仅须要改动所需的cache值就能够解决这个问题了。于是我们引入另外一种方法:

    
    
    public static Bitmap convertViewToBitmap(View view){
          view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
            view.buildDrawingCache();
            Bitmap bitmap = view.getDrawingCache();


         return bitmap;
    }


    
    
    <span style="line-height: 19.5px; color: rgb(75, 75, 75); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="line-height: 1.5;">
    </span></span>
    <span style="line-height: 19.5px; color: rgb(75, 75, 75); font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px;"><span style="line-height: 1.5;">这样用此方法替换之前用View 生成bitmap的方法就可以</span></span>


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    arrayAppend.php
    C语言中一个语句太长用什么换行?
    date
    Mysql复制一条或多条记录并插入表|mysql从某表复制一条记录到另一张表
    Unable to load bean org.apache.struts2.dispatcher.multipart.MultiPartRequest
    javascript:location=location;">刷新</a>
    TestAbstract
    scanner=new Scanner(System.in); int i=scanner.nextInt();
    public static void Swap2
    JIRA 模块 bug管理工具
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4709107.html
Copyright © 2011-2022 走看看