Android 屏幕截图并用WindowManager显示

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

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

感性认识:

抛砖引玉,详见注释:

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,如需转载请自行联系原作者

相关文章
|
JavaScript Android开发
使用贝叶斯曲线滑动安卓屏幕(autojsPro7)
使用贝叶斯曲线滑动安卓屏幕(autojsPro7)
510 0
|
编解码 开发工具 Android开发
Android平台RTSP轻量级服务|RTMP推送摄像头或屏幕之音频接口设计
好多开发者在做Android平台录像或者RTSP轻量级服务、RTMP推送相关模块时,对需要设计哪些常用接口会心存疑惑,本文主要以大牛直播SDK(官方)为例,简单介绍下Android平台直播推送SDK所有音频相关的接口,感兴趣的开发者可以看看。
218 0
|
XML Java Android开发
Android Studio App开发之捕获屏幕的变更事件实战(包括竖屏与横屏切换,回到桌面与切换到任务列表)
Android Studio App开发之捕获屏幕的变更事件实战(包括竖屏与横屏切换,回到桌面与切换到任务列表)
464 0
|
4月前
|
机器学习/深度学习 Android开发 数据安全/隐私保护
手机脚本录制器, 脚本录制器安卓,识图识色屏幕点击器【autojs】
完整的UI界面,包含录制控制按钮和状态显示 屏幕点击动作录制功能,记录点击坐标和时间间隔
|
开发工具 Android开发
rk平台Android12屏幕永不休眠
rk平台Android12屏幕永不休眠
443 1
|
编解码 开发工具 Android开发
Android平台实现屏幕录制(屏幕投影)|音频播放采集|麦克风采集并推送RTMP或轻量级RTSP服务
Android平台屏幕采集、音频播放声音采集、麦克风采集编码打包推送到RTMP和轻量级RTSP服务的相关技术实现,做成高稳定低延迟的同屏系统,还需要有配套好的RTMP、RTSP直播播放器
308 1
|
API Android开发 数据安全/隐私保护
Android经典实战之窗口和WindowManager
本文介绍了Android开发中“窗口”的基本概念及其重要性。窗口是承载用户界面的基础单位,而`WindowManager`系统服务则负责窗口的创建、更新和移除等操作。了解这些概念有助于开发复杂且用户体验良好的应用。
334 2
|
Android开发 UED 开发者
Android经典实战之WindowManager和创建系统悬浮窗
本文详细介绍了Android系统服务`WindowManager`,包括其主要功能和工作原理,并提供了创建系统悬浮窗的完整步骤。通过示例代码,展示了如何添加权限、请求权限、实现悬浮窗口及最佳实践,帮助开发者轻松掌握悬浮窗开发技巧。
2116 1
|
数据采集 开发工具 Android开发
Android平台如何实现屏幕数据采集并推送至RTMP服务器
随着无纸化、智慧教室等场景的普及,好多企业或者开发者开始寻求更高效稳定低延迟的RTMP同屏方案,本文以大牛直播SDK(Github)的同屏demo(对应工程:SmartServicePublisherV2)为例,介绍下如何采集编码推送RTMP数据到流媒体服务器。
341 0
|
Shell Android开发
ADB更改Android设备屏幕显示方向
ADB更改Android设备屏幕显示方向
966 5

热门文章

最新文章