Android截屏实现——亲测有效代码
16lz
2021-01-23
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销毁。void setChildrenDrawingCacheEnabled(boolean enabled)
setChildrenDrawnWithCacheEnabled(boolean enabled)
setChildrenDrawingCacheEnabled方法可以使viewgroup里所有的子view开启cache, setChildrenDrawnWithCacheEnabled使在绘制子view时,若该子view开启了cache, 则使用它的cache进行绘制,从而节省绘制时间。
获取cache通常会占用一定的内存,所以通常不需要的时候有必要对其进行清理,通过destroyDrawingCache或setDrawingCacheEnabled(false)实现。
更多相关文章
- Android之解决ViewPager2+PhotoView滑动图片花屏问题
- Android Studio中图片的格式转换
- Android获取点击屏幕的位置坐标
- 屏幕切换时Activity重启问题
- Android方法数超出限定的问题(multiDex,jumboMode)
- Android原生方法和Web JS互相调用-两种写法
- 2014-7-23 Android ImageViwe自适应屏幕宽高
- android 访问网络不能在主线程中进行以及在线程中操作UI的解决方