android 实现截图和图片裁剪

我们可以通过view的 view.getRootView();得到包含这个view的最顶层(最外层)的view布局

View rootView = view.getRootView();
		rootView.setDrawingCacheEnabled(true);
		rootView.buildDrawingCache();
		
		Bitmap bitmap = rootView.getDrawingCache();
这样我们就得到了刚才我们截图的内容了,当然这样的截图方法只适合在本应用已经跑起来的情况下

而且这个方法实现的截图还有一点需要注意的是,屏幕上方的信号 时间 电池那些东西是无法获取到的,而且截图留下来的文件也显示是空白,然后我们需要对这个文件进行

裁剪


public static Bitmap ImageCrop(Bitmap bitmap) {
        int w = bitmap.getWidth(); // 得到图片的宽,高
        int h = bitmap.getHeight();
        //下面这句是关键
        return Bitmap.createBitmap(bitmap, 0, 40, w, h-40, null, false);
    }

这样就会把上面的那40个像素给干掉


也许我们还需要把该图像存储到文件中

FileOutputStream outputStream = new FileOutputStream(filename);
				bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
这个写入需要添加权限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
这样文件就保存在自己指定的路径下了


我自己的demo

package com.example.handlescreen;


import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;


import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;


public class Main extends Activity {


// 这个截图就是传入一个view参数,获取这个view的rootview
// 然后rootview getDrawingCache就会得到一个当前屏幕的截图bitmap
// 也可以对这个bitmap进行文件的存储,通过流的方式
// 记得要写sd卡的读写权限
private Button handleButton;
private ImageView screen;


@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main);
initView();
}


private void initView() {
// TODO Auto-generated method stub
handleButton = (Button) findViewById(R.id.btn_handle);
screen = (ImageView) findViewById(R.id.iv_resouce);


handleButton.setOnClickListener(new OnClickListener() {


@Override
public void onClick(View v) {
// TODO Auto-generated method stub
handleScrenPath(v);
}
});
}


/**

* @param view
*            传入需要截图的那个控件,函数会获取到父界面,进行截图保存
* @return
*/
public String handleScrenPath(View view) {
String path = "";


SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss", Locale.US);
// 定义一个文件的路径,包含文件名
String filename = "/sdcard/" + sdf.format(new Date()) + ".png";
View rootView = view.getRootView();
rootView.setDrawingCacheEnabled(true);
rootView.buildDrawingCache();


Bitmap bitmap = rootView.getDrawingCache();
screen.setImageBitmap(ImageCrop(bitmap));
if (bitmap != null) {
Toast.makeText(Main.this, "截图已经获取到", Toast.LENGTH_SHORT).show();


try {
FileOutputStream outputStream = new FileOutputStream(filename);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream);
Toast.makeText(Main.this, "截图已经成功保存", Toast.LENGTH_SHORT)
.show();


} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


} else {
Toast.makeText(Main.this, "截图已经获取到", Toast.LENGTH_SHORT).show();
}
return path;
}


/**
* 因为上面的截图方法会有上面的电池栏的空白,所以我们需要裁剪一下 按正方形裁切图片
*/
public static Bitmap ImageCrop(Bitmap bitmap) {
int w = bitmap.getWidth(); // 得到图片的宽,高
int h = bitmap.getHeight();


System.out.println(w + ":" + h);
// int wh = w > h ? h : w;// 裁切后所取的正方形区域边长


// int retX = w > h ? (w - h) / 2 : 0;//基于原图,取正方形左上角x坐标
// int retY = w > h ? 0 : (h - w) / 2;


int retX = w > h ? (w - h) / 2 : 0;// 基于原图,取正方形左上角x坐标
int retY = w > h ? 0 : (h - w) / 2;
// 下面这句是关键
return Bitmap.createBitmap(bitmap, 0, 40, w, h - 100, null, false);
}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值