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

Android截屏实现——亲测有效代码_第1张图片

将截取到的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之解决ViewPager2+PhotoView滑动图片花屏问题
  2. Android Studio中图片的格式转换
  3. Android获取点击屏幕的位置坐标
  4. 屏幕切换时Activity重启问题
  5. Android方法数超出限定的问题(multiDex,jumboMode)
  6. Android原生方法和Web JS互相调用-两种写法
  7. 2014-7-23 Android ImageViwe自适应屏幕宽高
  8. android 访问网络不能在主线程中进行以及在线程中操作UI的解决方

随机推荐

  1. android bitmap 缓存实现(OOM)
  2. Android中的服务有几种,具体实现步骤,这几
  3. 傻瓜式建立数据库,高效数据库操作代码的编
  4. 深入探索 Android 内存优化(炼狱级别)
  5. android音频系统音量控制探讨
  6. 在android状态栏上添加多个图标
  7. Android网络收音机项目(源码实例分享)
  8. android 标题栏下拉选择控件(下拉菜单宽度
  9. Unity3d报错:Error building Player: Win3
  10. android 主界面 底部菜单 DEMO