Android完成矩形區域截屏的辦法。本站提示廣大學習愛好者:(Android完成矩形區域截屏的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是Android完成矩形區域截屏的辦法正文
對屏幕停止截屏並裁剪有兩種方式:早截圖和晚截圖。早截圖,就是先截取全屏,再讓用戶對截取到的圖片停止修正;與之絕對的,晚截圖,就是先讓用戶在屏幕上劃好區域,再停止截圖和裁剪。其實兩者並沒有什麼太大的區別,這篇就說說怎樣完成晚截圖。
晚截圖可以分紅三步:
1. 在屏幕上標出截圖的矩形區域
2. 調用零碎接口截屏
3. 對截圖停止裁剪
效果圖如下:

第一步、在屏幕上標識出截圖區域
首先確定標識截圖區域所需求的功用:
1. 手指拖動構成矩形區域;
2. 可以拖動曾經劃好的矩形區域停止挪動;
3. 可以拖動矩形區域的邊框調整大小;
4. 選擇完成當前,有“確認”和“取消”功用,“確認”時可以取得選取的區域地位。需求留意的是,按鈕的地位應該可以自順應,比方選框簡直占據全屏的狀況下,應該把按鈕放到選框外部。
最復雜的方式就是寫一個自定義View,依據touch的地位執行不同的功用即可。完成很復雜,只需細心把每一種形態就行,代碼請看Bigbang項目的MarkSizeView類。
第二步、調用零碎接口截屏
截屏必需在Activity中停止,由於需求調用startActivityForResult()。不過也可以把mMediaProjectionManager傳到service中停止後續處置。
還要留意的是Activity自身在截屏的時分應該是通明的,不能對要截獲得內容有影響。
直接看代碼:
public class ScreenCaptureActivity extends Activity {
private static final String TAG = ScreenCaptureActivity.class.getName();
private MediaProjectionManager mMediaProjectionManager;
private int REQUEST_MEDIA_PROJECTION = 1;
private SimpleDateFormat dateFormat;
private String pathImage;
private WindowManager mWindowManager;
private ImageReader mImageReader;
private MediaProjection mMediaProjection;
private int mResultCode;
private Intent mResultData;
private VirtualDisplay mVirtualDisplay;
private String strDate;
private int windowWidth;
private int windowHeight;
private String nameImage;
private int mScreenDensity;
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mMediaProjectionManager = (MediaProjectionManager) getApplication().getSystemService(Context.MEDIA_PROJECTION_SERVICE);
createVirtualEnvironment();
startActivityForResult(mMediaProjectionManager.createScreenCaptureIntent(), REQUEST_MEDIA_PROJECTION);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_MEDIA_PROJECTION) {
if (resultCode != Activity.RESULT_OK) {
return;
} else if (data != null && resultCode != 0) {
mResultCode = resultCode;
mResultData = data;
startVirtual();
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
startCapture();
}
},100);
}
}
}
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
private void createVirtualEnvironment() {
dateFormat = new SimpleDateFormat("yyyy_MM_dd_hh_mm_ss");
strDate = dateFormat.format(new Date());
pathImage = Environment.getExternalStorageDirectory().getPath() + "/Pictures/";
nameImage = pathImage + strDate + ".png" />
那麼假如我們想要對截圖的後果停止保管或許裁剪,就必需要去除邊框,找出真正的內容區域,也就是在第一個不通明的像素和最後一個不通明像素之間的內容,然後才干對失掉的區域停止第三步的裁剪,代碼如下:
int[] pixel=new int[width];
bitmap.getPixels(pixel,0,width ,0,0,width,1);
int leftPadding=0;
int rightPadding=width;
for (int i=0;i<pixel.length;i++){
if (pixel[i]!=0){
leftPadding=i;
break;
}
}
for (int i=pixel.length-1;i>=0;i--){
if (pixel[i]!=0){
rightPadding=i;
break;
}
}
bitmap=Bitmap.createBitmap(bitmap,leftPadding, 0, rightPadding-leftPadding, height);
處置後的截圖如下:

你能夠會覺得既然是rowPadding!=0招致呈現邊框,而且邊框只在左邊,為什麼不直接把左邊rowPadding寬度的內容截掉呢?其實是由於假如不調整windowHeight,就會在右邊也發生框,所以才用了下面的辦法。
完好代碼可以參考Bigbang項目的MarkSizeView類、ScreenCaptureActivity類和ScreenCapture類。