程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> Android完成矩形區域截屏的辦法

Android完成矩形區域截屏的辦法

編輯:MSSQL

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved