Android截屏实现——亲测有效代码

将截取到的Bitmap赋给Dialog上的ImageView,并对Dialog加了弹出和收起的动画,实现截屏效果。

1.弹出Dialog方法(截屏+弹出Dialog):

private void popShotSrceenDialog(){  final AlertDialog cutDialog = new AlertDialog.Builder(this).create();  View dialogView = View.inflate(this, R.layout.show_cut_screen_layout, null);  ImageView showImg = (ImageView) dialogView.findViewById(R.id.show_cut_screen_img);  dialogView.findViewById(R.id.share_cancel).setOnClickListener(new View.OnClickListener() {  @Override  public void onClick(View v) {  cutDialog.dismiss();  }  });  dialogView.findViewById(R.id.share_img).setOnClickListener(new View.OnClickListener() {  @Override  public void onClick(View v) {  Toast.makeText(ShotSrceenActivity.this,"点击了share按钮",Toast.LENGTH_SHORT).show();  }  });  //获取当前屏幕的大小  int width = getWindow().getDecorView().getRootView().getWidth();  int height = getWindow().getDecorView().getRootView().getHeight();  //生成相同大小的图片  Bitmap temBitmap = Bitmap.createBitmap( width, height, Bitmap.Config.ARGB_8888 );  //找到当前页面的跟布局  View view = getWindow().getDecorView().getRootView();  //设置缓存  view.setDrawingCacheEnabled(true);  view.buildDrawingCache();  //从缓存中获取当前屏幕的图片  temBitmap = view.getDrawingCache();  showImg.setImageBitmap(temBitmap);    cutDialog.setView(dialogView);  Window window = cutDialog.getWindow();  window.setBackgroundDrawableResource(android.R.color.transparent);  WindowManager m = window.getWindowManager();  Display d = m.getDefaultDisplay(); // 获取屏幕宽、高用  WindowManager.LayoutParams p = window.getAttributes(); // 获取对话框当前的参数值  p.height = (int) (d.getHeight() * 0.8); // 高度设置为屏幕的0.6  p.gravity = Gravity.CENTER;//设置弹出框位置  window.setAttributes(p);  window.setWindowAnimations(R.style.dialogWindowAnim);  cutDialog.show();  }  

2.Dialog布局(图片+按钮):

<?xml version="1.0" encoding="utf-8"?>                    

3.弹出对话框style:

   

4.弹出动画:

<?xml version="1.0" encoding="utf-8"?>       

5.收起动画:

<?xml version="1.0" encoding="utf-8"?>        

截取屏幕用上面的方法所得到的图片状态栏位置是白色的一片。测试的时候我认为应该是透明的,解决方式是将状态栏设置为透明,然后再主布局中的最上面加上一个View来改变状态栏颜色,这样截取的Bitmap最上方状态栏就不会是白色的了。



注:

当在一个Activity中需要多次截取不同图片时,要注意用到

//销毁当前屏幕图片的缓存view.destroyDrawingCache();view.setDrawingCacheEnabled(false)

View组件显示的内容可以通过cache机制保存为bitmap, 使用到的api有

void  setDrawingCacheEnabled(boolean flag)

Bitmap  getDrawingCache(boolean autoScale)

void  buildDrawingCache(boolean autoScale)

void  destroyDrawingCache()

我们要获取它的cache先要通过setDrawingCacheEnable方法把cache开启,然后再调用getDrawingCache方法就可 以获得view的cache图片了。buildDrawingCache方法可以不用调用,因为调用getDrawingCache方法时,若果 cache没有建立,系统会自动调用buildDrawingCache方法生成cache。若果要更新cache, 必须要调用destoryDrawingCache方法把旧的cache销毁,才能建立新的。当调用setDrawingCacheEnabled方法设置为false, 系统也会自动把原来的cache销毁。


ViewGroup在绘制子view时,而外提供了两个方法
void setChildrenDrawingCacheEnabled(boolean enabled)
setChildrenDrawnWithCacheEnabled(boolean enabled)

setChildrenDrawingCacheEnabled方法可以使viewgroup里所有的子view开启cache, setChildrenDrawnWithCacheEnabled使在绘制子view时,若该子view开启了cache, 则使用它的cache进行绘制,从而节省绘制时间。

获取cache通常会占用一定的内存,所以通常不需要的时候有必要对其进行清理,通过destroyDrawingCache或setDrawingCacheEnabled(false)实现。


更多相关文章

  1. Android实现定时刷新
  2. Android中用到了哪些设计模式?
  3. [置顶] 我的Android进阶之旅------>android异步加载图片显示,并且
  4. Android(安卓)webkit 事件传递流程
  5. Android(安卓)SnackBar
  6. Android使用腾讯X5内核替换原生webview
  7. android和html交互--动态注入方法
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. ios与android的比较
  2. android上gdb coredump步骤
  3. android 中java编程的意外事件处理
  4. Android 应用程序发布流程注意事项(整理)
  5. Android 自定义组件02
  6. Android(安卓)开发源码分享
  7. Android 自定义View 解耦框架
  8. Android(安卓)string.xml 显示特殊符号
  9. 22. Android中的AIDL
  10. android开源代码