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,截屏
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
基于java枚举类综合应用的说明
2023-02-16 09:39:25
简单实现Android学生管理系统(附源码)
2022-06-12 05:59:04
![](https://img.aspxhome.com/file/2023/0/137430_0s.png)
C# 泛型字典 Dictionary的使用详解
2022-01-19 23:48:17
![](https://img.aspxhome.com/file/2023/8/102258_0s.png)
java抛出异常的几种情况小结
2022-01-11 05:46:40
![](https://img.aspxhome.com/file/2023/4/68214_0s.jpg)
Java面试题冲刺第十八天--Spring框架3
2023-04-17 22:44:29
![](https://img.aspxhome.com/file/2023/4/96124_0s.jpg)
一篇文章看懂Java异常处理
2023-10-07 12:08:37
![](https://img.aspxhome.com/file/2023/0/116830_0s.png)
Entity Framework映射TPH、TPT、TPC与继承类
2022-10-18 04:52:52
Java四位电话号码的加密方法
2022-08-20 16:04:29
![](https://img.aspxhome.com/file/2023/9/89629_0s.jpg)
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
![](https://img.aspxhome.com/file/2023/9/96259_0s.jpg)
Swing常用组件之多行文本区JTextArea
2023-11-08 14:16:49
flutter中使用流式布局示例详解
2023-08-24 23:49:06
![](https://img.aspxhome.com/file/2023/5/86765_0s.jpg)
Java超详细讲解抽象类的原理与用法
2022-10-31 20:51:42
![](https://img.aspxhome.com/file/2023/6/80306_0s.png)
分享Java常用开发编辑器工具
2023-11-06 07:35:37
![](https://img.aspxhome.com/file/2023/6/58896_0s.png)
JavaCV实现照片马赛克效果
2023-04-27 15:55:14
![](https://img.aspxhome.com/file/2023/4/66624_0s.jpg)
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
![](https://img.aspxhome.com/file/2023/2/106832_0s.png)
详解C#之委托
2021-12-12 00:17:49
![](https://img.aspxhome.com/file/2023/0/79100_0s.png)