【Android】获取View的截图
2015-11-19 17:44
615 查看
有时候在开发过程中可能需要通过获得View的副本来做一些处理,为了得到副本,一种方法是用另一个布局完全一样的View来拷贝目标内容,另外一种方法是直接获得这个View的截图。很显然获得截图的方式更便捷灵活。
我们可以通过View.getDrawingCache()方法来获得View的截图Bitmap,但需要经过以下几个步骤:
1.View.setDrawingCacheEnabled(true);将View缓存下来
2.View.getDrawingCache();获得缓存的bitmap
3.拷贝获得的bitmap
4.View.setDrawingCacheEnabled(false);清除缓存
可能我们会对第3步有疑惑,第2步已经得到缓存的bitmap了,为什么还要重新拷贝?在使用View.setDrawingCacheEnabled(true);缓存图片后,系统将不再自动更新View的缓存,所以在获得缓存的bitmap后,我们必须要使用View.setDrawingCacheEnabled(false)来清空缓存,以便下一次获得新的截图。而一旦使用View.setDrawingCacheEnabled(false)后,缓存的bitmap将会被释放掉,此时我们再引用到该bitmap则会报错,所以我们需要对这个bitmap再做备份。
下面是测试demo,我们需要获得包含图片和文字信息的RelativeLayout的截图。
activity_main.xml:
以下是处理逻辑,MainActivity.java:
效果图:
![](http://img.blog.csdn.net/20151119173655984?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
---------》打开应用,未截图
![](http://img.blog.csdn.net/20151119173737752?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
----------------------》成功获得截图
![](http://img.blog.csdn.net/20151119173809949?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
---------------------------》 切换图片
![](http://img.blog.csdn.net/20151119173843106?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
-----------------》 重新截图
如果把拷贝bitmap步骤去掉,如:
![](http://img.blog.csdn.net/20151119174144047?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
程序将会报错:
![](http://img.blog.csdn.net/20151119174214936?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
如果把setDrawingCacheEnabled(false)去掉,如:
![](http://img.blog.csdn.net/20151119174323761?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
则改变图片以后,获得的截图也依然是之前的:
![](http://img.blog.csdn.net/20151119174409162?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
我们可以通过View.getDrawingCache()方法来获得View的截图Bitmap,但需要经过以下几个步骤:
1.View.setDrawingCacheEnabled(true);将View缓存下来
2.View.getDrawingCache();获得缓存的bitmap
3.拷贝获得的bitmap
4.View.setDrawingCacheEnabled(false);清除缓存
可能我们会对第3步有疑惑,第2步已经得到缓存的bitmap了,为什么还要重新拷贝?在使用View.setDrawingCacheEnabled(true);缓存图片后,系统将不再自动更新View的缓存,所以在获得缓存的bitmap后,我们必须要使用View.setDrawingCacheEnabled(false)来清空缓存,以便下一次获得新的截图。而一旦使用View.setDrawingCacheEnabled(false)后,缓存的bitmap将会被释放掉,此时我们再引用到该bitmap则会报错,所以我们需要对这个bitmap再做备份。
下面是测试demo,我们需要获得包含图片和文字信息的RelativeLayout的截图。
activity_main.xml:
<ScrollView xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.ydz.test028_viewshot.MainActivity" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <RelativeLayout android:id="@+id/layout_source" android:layout_width="wrap_content" android:layout_height="wrap_content" > <ImageView android:id="@+id/image_source" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/horse" /> <TextView android:id="@+id/text_source" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:text="骏马" android:textColor="#00FF00" android:textSize="20sp" /> </RelativeLayout> <Button android:id="@+id/btn_getshot" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="GetPicture" /> <Button android:id="@+id/btn_change_picture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="ChangePicture" /> <ImageView android:id="@+id/img_result" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </ScrollView>
以下是处理逻辑,MainActivity.java:
package com.ydz.test028_viewshot; import android.app.Activity; import android.graphics.Bitmap; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ImageView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { private RelativeLayout mLayoutSource; private Button mButtonGetShot; private Button mButtonChange; private ImageView mImageResult; private ImageView mImageSource; private TextView mTextViewSource; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mLayoutSource = (RelativeLayout) findViewById(R.id.layout_source); mButtonGetShot = (Button) findViewById(R.id.btn_getshot); mButtonChange = (Button) findViewById(R.id.btn_change_picture); mImageResult = (ImageView) findViewById(R.id.img_result); mImageSource = (ImageView) findViewById(R.id.image_source); mTextViewSource = (TextView) findViewById(R.id.text_source); mButtonGetShot.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mLayoutSource.setDrawingCacheEnabled(true); Bitmap tBitmap = mLayoutSource.getDrawingCache(); // 拷贝图片,否则在setDrawingCacheEnabled(false)以后该图片会被释放掉 tBitmap = tBitmap.createBitmap(tBitmap); mLayoutSource.setDrawingCacheEnabled(false); if (tBitmap != null) { mImageResult.setImageBitmap(tBitmap); Toast.makeText(getApplicationContext(), "获取成功", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getApplicationContext(), "获取失败", Toast.LENGTH_SHORT).show(); } } }); mButtonChange.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mImageSource.setImageResource(R.drawable.light); mTextViewSource.setText("孤灯"); } }); } }
效果图:
---------》打开应用,未截图
----------------------》成功获得截图
---------------------------》 切换图片
-----------------》 重新截图
如果把拷贝bitmap步骤去掉,如:
程序将会报错:
如果把setDrawingCacheEnabled(false)去掉,如:
则改变图片以后,获得的截图也依然是之前的:
相关文章推荐
- AndroidManifest配置文件中Action和Category的各个项--有道笔记整理
- AndroidManifest.xml各个配置项的详解--有道笔记整理
- android broadcast--有道笔记整理
- Proguard混淆Android项目所遇问题及总结
- android 中OnKeyDown的事件获取顺序
- android 开发-设置控件/view的水平方向翻转
- Android开源项目整合(一)
- 《第一行代码--Android》读书笔记之广播机制
- android代码混淆后gson无法解析问题
- Android手机安装busybox
- android使用setTheme的方式实现主题切换
- Android数据库查询效率进阶篇
- Android如何捕获手机回退键(BACK)实现程序退出?
- Android Support 包里究竟有什么
- Android开发艺术探索学习-IPC之Binder(二)
- 比较强大 优秀的开源框架 :Android图片加载与缓存:Android Glide 的用法
- android canvas画图
- Android中Handler详解,线程间通信机制
- Gradle打包android 项目
- Android点住按钮同时再点击按钮外的效果