Android 屏幕截图并用WindowManager显示

简介:
  • Android屏幕截图,得到截图存储在SD卡上。

  • 所截取的图,实时显示在屏幕上。用户点击图片——消失;用户不点击,指定时间后——图片自动消失。

感性认识:

011027940.gif

抛砖引玉,详见注释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
@Override
public  void  onClick(View v) {
     switch  (v.getId()) {
     case  R.id.about_me:
         //获取屏幕
         View targetView = mActivity.getWindow().getDecorView();
         targetView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN); //截全屏
         targetView.setDrawingCacheEnabled( true );
         Bitmap fullBitmap = Bitmap.createBitmap(targetView.getDrawingCache());
         /**获取状态栏高度
         Rect frame = new Rect();
         mActivity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
         int statusBarHeight = frame.top;*/
         DisplayMetrics dm = mActivity.getResources().getDisplayMetrics();
         /** 去掉标题栏
         Bitmap bitmap = Bitmap.createBitmap(fullBitmap, 0, statusBarHeight, dm.widthPixels, dm.heightPixels - statusBarHeight);
         targetView.destroyDrawingCache();*/
         OutputStream output =  null ;
         try  {
             if  (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                 String sdPath = Environment.getExternalStorageDirectory().getPath(); //sd卡路径
                 String pngPath = sdPath +  "/Remind/" ; //截图存放路径
                 File pngDir =  new  File(pngPath);
                 if  (!pngDir.exists()) {
                     pngDir.mkdir(); //make路径
                 }
                 String pngName = pngPath + System.currentTimeMillis() +  ".png" ;
                 output =  new  FileOutputStream(pngName);
                 if  (output !=  null ) {
                     fullBitmap.compress(Bitmap.CompressFormat.PNG,  100 , output); //100%高清大图
                     output.flush();
                     output.close();
                 }
                 /** WindowManager */
                 LayoutInflater inflater = LayoutInflater.from(mActivity);
                 screenShot = inflater.inflate(R.layout.screen_shot,  null );
                 wmManager =(WindowManager) mActivity.getSystemService(mActivity.WINDOW_SERVICE);
                 WindowManager.LayoutParams wmParams =  new  WindowManager.LayoutParams();
                 ImageView shotImg = (ImageView) screenShot.findViewById(R.id.screen_shot_img);
                 shotImg.setImageBitmap(targetView.getDrawingCache());
             /**
              *以下都是WindowManager.LayoutParams的相关属性
              */
                wmParams.type=WindowManager.LayoutParams.TYPE_PRIORITY_PHONE;    //这里是关键
                wmParams.format=PixelFormat.RGBA_8888;
                wmParams.flags=WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL;
                wmParams.alpha =  0 .8f;  //透明度
                //WindowManager位置
                wmParams.width = dm.widthPixels *  1  2 ;
                wmParams.height = dm.heightPixels *  1  2 ;
                wmParams.x = dm.widthPixels *  1  2 ;
                wmParams.y = - (dm.heightPixels *  1  5 );
              //添加View
                wmManager.addView(screenShot, wmParams);
                isRemoved =  false ;
                //计时器
                 timer =  new  Timer();
                 //点击图片,消失。
                 shotImg.setOnClickListener( new  OnClickListener() {
                     @Override
                     public  void  onClick(View arg0) {
                         if  (wmManager !=  null  && !isRemoved) {
                             wmManager.removeView(screenShot);
                             isRemoved =  true ;
                             if  (timer !=  null ) {
                                 timer.cancel();
                             }
                         }
                     }
                 });
                 //定时任务,显示3秒后自动消失。
                 timer.schedule( new  TimerTask() {
                     @Override
                     public  void  run() {
                         if  (wmManager !=  null  && !isRemoved) {
                             wmManager.removeView(screenShot);
                             isRemoved =  true ;
                         }
                     }
                 },  3000 );
             }
         catch  (Exception e) {
             e.printStackTrace();
         }
         break ;
     default :
         break ;
     }
}




本文转自chainli 51CTO博客,原文链接:http://blog.51cto.com/lichen/1218567,如需转载请自行联系原作者

相关文章
|
3月前
|
JavaScript Android开发
使用贝叶斯曲线滑动安卓屏幕(autojsPro7)
使用贝叶斯曲线滑动安卓屏幕(autojsPro7)
60 0
|
4月前
|
XML Java Android开发
Android Studio App开发之捕获屏幕的变更事件实战(包括竖屏与横屏切换,回到桌面与切换到任务列表)
Android Studio App开发之捕获屏幕的变更事件实战(包括竖屏与横屏切换,回到桌面与切换到任务列表)
38 0
|
7月前
|
编解码 开发工具 Android开发
Android平台RTSP轻量级服务|RTMP推送摄像头或屏幕之音频接口设计
好多开发者在做Android平台录像或者RTSP轻量级服务、RTMP推送相关模块时,对需要设计哪些常用接口会心存疑惑,本文主要以大牛直播SDK(官方)为例,简单介绍下Android平台直播推送SDK所有音频相关的接口,感兴趣的开发者可以看看。
|
1月前
|
存储 XML 编译器
【Android 从入门到出门】第二章:使用声明式UI创建屏幕并探索组合原则
【Android 从入门到出门】第二章:使用声明式UI创建屏幕并探索组合原则
47 3
|
7月前
|
数据采集 开发工具 Android开发
Android平台如何实现屏幕数据采集并推送至RTMP服务器
随着无纸化、智慧教室等场景的普及,好多企业或者开发者开始寻求更高效稳定低延迟的RTMP同屏方案,本文以大牛直播SDK(Github)的同屏demo(对应工程:SmartServicePublisherV2)为例,介绍下如何采集编码推送RTMP数据到流媒体服务器。
129 0
|
7月前
|
数据采集 编解码 开发工具
Android平台屏幕/摄像头或外部数据采集及RTMP推送接口设计描述
好多开发者提到,为什么大牛直播SDK的Android平台RTMP推送接口怎么这么多?不像一些开源或者商业RTMP推送一样,就几个接口,简单明了。
|
7月前
|
数据采集 编解码 Android开发
Android投屏(屏幕共享)设计需要考虑的关键因素
许多开发者,在做智慧教室同屏、会议同屏之类的方案时,基于Andriod平台的采集,往往遇到各种各样的问题,以下就几个点,抛砖引玉:
134 0
|
8月前
|
Android开发
Android 屏幕发生旋转对应的生命周期发生变化解析
Android 屏幕发生旋转对应的生命周期发生变化解析
122 0
|
8月前
|
传感器 Java Android开发
Android 中屏幕进行横屏显示和竖屏显示的方法
Android 中屏幕进行横屏显示和竖屏显示的方法
424 0
|
8月前
|
API Android开发
Android 中获取手机屏幕的宽度和高度(单位为像素)
Android 中获取手机屏幕的宽度和高度(单位为像素)
190 0