Android实现长截屏功能

作者:凉城424 时间:2022-03-02 15:20:27 

本文实例为大家分享了Android实现长截屏功能的具体代码,供大家参考,具体内容如下

1、MainActivity


public class MainActivity extends AppCompatActivity {
 ScrollView scrollView;
 String sdRoot = Environment.getExternalStorageDirectory().getPath();
 @Override
 protected void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_main);
   scrollView = (ScrollView) findViewById(R.id.scroll);
   //权限
   int permission_write= ContextCompat.checkSelfPermission(this,
       Manifest.permission.WRITE_EXTERNAL_STORAGE);
   int permission_read=ContextCompat.checkSelfPermission(this,
       Manifest.permission.READ_EXTERNAL_STORAGE);
   if(permission_write!= PackageManager.PERMISSION_GRANTED
       || permission_read!=PackageManager.PERMISSION_GRANTED){
     Toast.makeText(this, "正在请求权限", Toast.LENGTH_SHORT).show();
     //申请权限,特征码自定义为1,可在回调时进行相关判断
     ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE},1);
   }
 }

@Override
 public void onWindowFocusChanged(boolean hasFocus) {
   shootScrollView(scrollView, "sdRoot");

//    takeScreenshot();
   super.onWindowFocusChanged(hasFocus);
 }

@Override
 protected void onResume() {
   super.onResume();
 }

/**
  * 截取scrollview的屏幕
  * **/
 public static Bitmap getScrollViewBitmap(ScrollView scrollView, String picpath) {
   int h = 0;
   Bitmap bitmap;
   // 获取listView实际高度
   for (int i = 0; i < scrollView.getChildCount(); i++) {
     h += scrollView.getChildAt(i).getHeight();
     scrollView.getChildAt(i).setBackgroundColor(Color.parseColor("#ffffff"));
   }
   Log.d(TAG, "实际高度:" + h);
   Log.d(TAG, " 高度:" + scrollView.getHeight());
   // 创建对应大小的bitmap
   bitmap = Bitmap.createBitmap(scrollView.getWidth(), h,
       Bitmap.Config.ARGB_8888);
   final Canvas canvas = new Canvas(bitmap);
   scrollView.draw(canvas);
   // 测试输出
   FileOutputStream out = null;
   try {
     out = new FileOutputStream(picpath);
   } catch (FileNotFoundException e) {
     e.printStackTrace();
   }
   try {
     if (null != out) {
       bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
       out.flush();
       out.close();
     }
   } catch (IOException e) {
   }
   Log.d("TAG", "getScrollViewBitmap() returned: " + bitmap.getHeight());
   return bitmap;
 }

private static String TAG = "Listview and ScrollView item 截图:";

/**
  * 截图listview
  * **/
 public static Bitmap getListViewBitmap(ListView listView, String picpath) {
   int h = 0;
   Bitmap bitmap;
   // 获取listView实际高度
   for (int i = 0; i < listView.getChildCount(); i++) {
     h += listView.getChildAt(i).getHeight();
   }
   Log.d(TAG, "实际高度:" + h);
   Log.d(TAG, "list 高度:" + listView.getHeight());
   // 创建对应大小的bitmap
   bitmap = Bitmap.createBitmap(listView.getWidth(), h,
       Bitmap.Config.ARGB_8888);
   final Canvas canvas = new Canvas(bitmap);
   listView.draw(canvas);
   // 测试输出
   FileOutputStream out = null;
   try {
     out = new FileOutputStream(picpath);
   } catch (FileNotFoundException e) {
     e.printStackTrace();
   }
   try {
     if (null != out) {
       bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
       out.flush();
       out.close();
     }
   } catch (IOException e) {
   }
   return bitmap;
 }

// 程序入口 截取ScrollView
 public static void shootScrollView(ScrollView scrollView, String picpath) {
//    ScreenShot.savePic(getScrollViewBitmap(scrollView, picpath), picpath);
   ScreenShot.saveMyBitmap(getScrollViewBitmap(scrollView, picpath), picpath);
 }

// 程序入口 截取ListView
 public static void shootListView(ListView listView, String picpath) {
   ScreenShot.savePic(getListViewBitmap(listView,picpath), picpath);
 }

private void takeScreenshot() {
   Date now = new Date();
   android.text.format.DateFormat.format("yyyy-MM-dd_hh:mm:ss", now);

try {
     // image naming and path to include sd card appending name you choose for file
     String mPath = Environment.getExternalStorageDirectory().toString() + "/" + now + ".jpg";

// create bitmap screen capture
     View v1 = getWindow().getDecorView().getRootView();
     v1.setDrawingCacheEnabled(true);
     Bitmap bitmap = Bitmap.createBitmap(v1.getDrawingCache());
     v1.setDrawingCacheEnabled(false);

File imageFile = new File(mPath);

FileOutputStream outputStream = new FileOutputStream(imageFile);
     int quality = 100;
     bitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream);
     outputStream.flush();
     outputStream.close();

openScreenshot(imageFile);
   } catch (Throwable e) {
     // Several error may come out with file handling or OOM
     e.printStackTrace();
   }
 }

private void openScreenshot(File imageFile) {
   Intent intent = new Intent();
   intent.setAction(Intent.ACTION_VIEW);
   Uri uri = Uri.fromFile(imageFile);
   intent.setDataAndType(uri, "image/*");
   startActivity(intent);
 }
}

2.ScreenShot


public class ScreenShot{
 // 获取指定Activity的截屏,保存到png文件
 public static Bitmap takeScreenShot(Activity activity) {
   // View是你需要截图的View
   View view = activity.getWindow().getDecorView();
   view.setDrawingCacheEnabled(true);
   view.buildDrawingCache();
   Bitmap b1 = view.getDrawingCache();

// 获取状态栏高度
   Rect frame = new Rect();
   activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
   int statusBarHeight = frame.top;
   System.out.println(statusBarHeight);

// 获取屏幕长和高
   int width = activity.getWindowManager().getDefaultDisplay().getWidth();
   int height = activity.getWindowManager().getDefaultDisplay()
       .getHeight();
   // 去掉标题栏
   // Bitmap b = Bitmap.createBitmap(b1, 0, 25, 320, 455);
   Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height
       - statusBarHeight);
   view.destroyDrawingCache();
   return b;
 }

// 保存到sdcard
 public static void savePic(Bitmap b, String strFileName) {
   FileOutputStream fos = null;
   Log.d("TAG", "savePic() returned: " );
   try {
     fos = new FileOutputStream(strFileName);
     if (null != fos) {
       b.compress(Bitmap.CompressFormat.PNG, 90, fos);
       Log.d("TAG", "savePic() returned:  " + b.getHeight());
       fos.flush();
       fos.close();
     }
   } catch (FileNotFoundException e) {
     e.printStackTrace();
   } catch (IOException e) {
     e.printStackTrace();
   }
 }

// 程序入口 截取当前屏幕
 public static void shootLoacleView(Activity a, String picpath) {
   ScreenShot.savePic(ScreenShot.takeScreenShot(a), picpath);
 }

/**
  * 保存bitmap到SD卡
  * @param bitName 保存的名字
  * @param mBitmap 图片对像
  * return 生成压缩图片后的图片路径
  */
 @SuppressLint("SdCardPath")
 public static String saveMyBitmap(Bitmap mBitmap, String bitName) {
   String path = Environment.getExternalStorageDirectory()+"/"+bitName+".png";
   File f = new File(path);

try {
     f.createNewFile();
   } catch (IOException e) {
     System.out.println("在保存图片时出错:" + e.toString());
   }
   FileOutputStream fOut = null;
   try {
     fOut = new FileOutputStream(f);
   } catch (FileNotFoundException e) {
     e.printStackTrace();
   }
   try {
     mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
   } catch (Exception e) {
     return "create_bitmap_error";
   }
   try {
     fOut.flush();
   } catch (IOException e) {
     e.printStackTrace();
   }
   try {
     fOut.close();
   } catch (IOException e) {
     e.printStackTrace();
   }
//    File file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis()+".jpg");
//    FileOutputStream out = null;
//    try {
//      out = new FileOutputStream(file);
//      mBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
//      System.out.println("___________保存的__sd___下_______________________");
//    } catch (FileNotFoundException e) {
//      e.printStackTrace();
//    }
//    try {
//      out.flush();
//      out.close();
//    } catch (IOException e) {
//      e.printStackTrace();
//    }
   return path;
 //  Toast.makeText(HahItemActivity.this,"保存已经至"+Environment.getExternalStorageDirectory()+"下", Toast.LENGTH_SHORT).show();
 }
}

3.xml


<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:id="@+id/scroll"
 tools:context=".MainActivity">

<LinearLayout
   android:orientation="vertical"
   android:layout_width="match_parent"
   android:layout_height="wrap_content">
 </LinearLayout>

</ScrollView>

来源:https://blog.csdn.net/qq_46237697/article/details/112186930

标签:Android,截屏
0
投稿

猜你喜欢

  • 基于java枚举类综合应用的说明

    2023-02-16 09:39:25
  • 简单实现Android学生管理系统(附源码)

    2022-06-12 05:59:04
  • C# 泛型字典 Dictionary的使用详解

    2022-01-19 23:48:17
  • java抛出异常的几种情况小结

    2022-01-11 05:46:40
  • Java面试题冲刺第十八天--Spring框架3

    2023-04-17 22:44:29
  • 一篇文章看懂Java异常处理

    2023-10-07 12:08:37
  • Entity Framework映射TPH、TPT、TPC与继承类

    2022-10-18 04:52:52
  • Java四位电话号码的加密方法

    2022-08-20 16:04:29
  • C#执行Javascript代码的几种方法总结

    2023-06-12 10:06:14
  • 解析Java中如何获取Spring中配置的bean

    2023-07-20 13:35:26
  • idea导入工程时不能导入maven项目不能加入tomcatServer的原因

    2023-06-13 05:35:11
  • Swing常用组件之多行文本区JTextArea

    2023-11-08 14:16:49
  • flutter中使用流式布局示例详解

    2023-08-24 23:49:06
  • Java超详细讲解抽象类的原理与用法

    2022-10-31 20:51:42
  • 分享Java常用开发编辑器工具

    2023-11-06 07:35:37
  • JavaCV实现照片马赛克效果

    2023-04-27 15:55:14
  • Spring Security入门demo案例

    2023-07-01 18:57:30
  • Java中的3种输入方式实现解析

    2021-10-04 00:16:47
  • Android仿一点资讯收藏Toast动画效果

    2022-01-15 18:42:33
  • 详解C#之委托

    2021-12-12 00:17:49
  • asp之家 软件编程 m.aspxhome.com