Android调用长截屏,Android实现长截屏功能
本文實例為大家分享了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
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
總結
以上是生活随笔為你收集整理的Android调用长截屏,Android实现长截屏功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 10.27 noip模拟试题
- 下一篇: ActiveMQ Cannot send