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類。