Skip to content

Commit

Permalink
补充提交
Browse files Browse the repository at this point in the history
  • Loading branch information
k committed Aug 10, 2023
1 parent bcdec34 commit 9512bca
Show file tree
Hide file tree
Showing 5 changed files with 247 additions and 337 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
package com.hyq.hm.test.greenscreen;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.Surface;
import android.view.View;
import android.widget.FrameLayout;

public class Camera2GreenScreenLayout extends FrameLayout {

private Camera2TextureView cameraView;
private PointView pointView;

public Camera2GreenScreenLayout(Context context) {
super(context);
}

public Camera2GreenScreenLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}

public Camera2GreenScreenLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}

public Camera2GreenScreenLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}

public void initCamera2TextureView(Context context, int rotation) {
if (cameraView == null && pointView == null) {
// cameraView = new Camera2SurfaceView(this);
cameraView = new Camera2TextureView(context);
pointView = new PointView(context);
cameraView.setSmooth(50f);
pointView.setVisibility(View.INVISIBLE);
addView(cameraView);
addView(pointView);
cameraView.init(
getBackgroundBitmap(cameraView),
pointView,
rotation);
}
}

public void move(int witchDirection) {
//1是往左边移动,2是往上边移动,3是往右边移动,4是往下边移动
switch (witchDirection) {
case 1: layout(getLeft() - 30, getTop(), getRight() - 30, getBottom());break;
case 2: layout(getLeft(), getTop() - 30, getRight(), getBottom() - 30);break;
case 3: layout(getLeft() + 30, getTop(), getRight() + 30, getBottom());break;
case 4: layout(getLeft(), getTop() + 30, getRight(), getBottom() + 30);break;
}
isRect();
pointView.postDelayed(new Runnable() {
@Override
public void run() {
Bitmap tmp = getBackgroundBitmap(cameraView);
cameraView.setBitmap(tmp);
}
},100);
}

@Override
public void removeAllViews() {
super.removeAllViews();
cameraView.stop();
cameraView = null;
pointView = null;
}

private Bitmap getBackgroundBitmap(View measureView) {
View screenView = ((Activity)getContext()).getWindow().getDecorView();
if (!screenView.isDrawingCacheEnabled())
screenView.setDrawingCacheEnabled(true);
screenView.buildDrawingCache();

//获取屏幕整张图片
Bitmap bitmap = screenView.getDrawingCache();

if (bitmap != null) {
//需要截取的长和宽 暂用正方形
int outWidth = getWidth();
int outHeight = getHeight();

//获取需要截图部分的在屏幕上的坐标(view的左上角坐标)
int[] viewLocationArray = new int[2];
measureView.getLocationOnScreen(viewLocationArray);

//从屏幕整张图片中截取指定区域
bitmap = Bitmap.createBitmap(bitmap, viewLocationArray[0], viewLocationArray[1], outWidth, outHeight);

// return bitmap;
return adjustPhotoRotation(bitmap, Surface.ROTATION_90);
}
return bitmap;
}



private void isRect(){
Rect rect = cameraView.getRect();
if(rect.width() > 0 && rect.height() > 0){
pointView.setRect(rect);
}else {
isRect();
}
}

private Bitmap adjustPhotoRotation(Bitmap bm, final int rotation) {
Matrix matrix = new Matrix();

if (Surface.ROTATION_90 == rotation || Surface.ROTATION_270 == rotation) {
matrix.postRotate(90 * (rotation - 2),(float) bm.getWidth() / 2, (float) bm.getHeight() / 2);
}else if (Surface.ROTATION_180 == rotation) {
matrix.postRotate(180, (float) bm.getWidth() / 2, (float) bm.getHeight() / 2);
}

Bitmap bm1 = Bitmap.createBitmap(bm.getHeight(), bm.getWidth(), Bitmap.Config.ARGB_8888);

Paint paint = new Paint();
Canvas canvas = new Canvas(bm1);
canvas.drawBitmap(bm, matrix, paint);

return bm1;
}
}
141 changes: 74 additions & 67 deletions app/src/main/java/com/hyq/hm/test/greenscreen/Camera2TextureView.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
import java.util.Comparator;
import java.util.List;

public class Camera2TextureView extends TextureView {
public class Camera2TextureView extends TextureView implements TextureView.SurfaceTextureListener{

private EGLUtils mEglUtils = new EGLUtils();
private GLVideoRenderer videoRenderer = new GLVideoRenderer();
Expand All @@ -53,7 +53,7 @@ public class Camera2TextureView extends TextureView {
private Handler mHandler;
private Runnable _runnable = new SurfaceRunnable();
private Runnable _stoppable = new SurfaceStoppable();

private StateListener stateListener;
private int screenWidth = -1, screenHeight,previewWidth,previewHeight;
private Rect rect = new Rect();

Expand All @@ -74,7 +74,6 @@ public Camera2TextureView(Context context, AttributeSet attrs) {
// init();
}


private PointView pointView;
private Bitmap bitmap = null;
private int rotation;
Expand All @@ -84,21 +83,83 @@ public void setBitmap(Bitmap bitmap) {
// cameraHandler.post(_stoppable);
// cameraHandler.post(_runnable);
}

public void init(Bitmap bitmap, PointView pointView, int rotation) {
this.bitmap = bitmap;
this.pointView = pointView;
this.rotation = rotation;
init();
}

public void stop() {
if (mCameraDevice != null)
{
mCameraCaptureSession.close();
mCameraDevice.close();
}
}
public void setStateListener(StateListener stateListener) {
this.stateListener = stateListener;
}

@Override
public void onSurfaceTextureAvailable(final SurfaceTexture surface, int width, int height) {
cameraHandler.post(_runnable);
final int sw = screenWidth;
screenWidth = width;
screenHeight = height;
cameraHandler.post(new Runnable() {
@Override
public void run() {
Size mPreviewSize = getPreferredPreviewSize(mSizes, screenWidth, screenHeight);
previewWidth = mPreviewSize.getHeight();
previewHeight = mPreviewSize.getWidth();

int left, top, viewWidth, viewHeight;
float sh = screenWidth * 1.0f / screenHeight;
float vh = previewWidth * 1.0f / previewHeight;
if (sh < vh) {
left = 0;
viewWidth = screenWidth;
viewHeight = (int) (previewHeight * 1.0f / previewWidth * viewWidth);
top = (screenHeight - viewHeight) / 2;
} else {
top = 0;
viewHeight = screenHeight;
viewWidth = (int) (previewWidth * 1.0f / previewHeight * viewHeight);
left = (screenWidth - viewWidth) / 2;
}
rect.left = left;
rect.top = top;
rect.right = left + viewWidth;
rect.bottom = top + viewHeight;
videoRenderer.setSize(mPreviewSize.getWidth(),mPreviewSize.getHeight());
imageRenderer.setWorld(previewWidth,previewHeight);
if(sw == -1){
openCamera2();
configureTextureViewTransform(screenWidth, screenHeight);
pointView.setRect(rect);
setCoordinate(pointView.getCoordinate(getPreviewWidth(), getPreviewHeight()), pointView.getRect());
}
}
});
if (stateListener != null)
stateListener.onSurfaceTextureReady();
}

@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}

@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
cameraHandler.post(_stoppable);
return false;
}

@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {

}


private void init(){
cameraThread = new HandlerThread("Camera2Thread");
Expand All @@ -109,67 +170,7 @@ private void init(){
bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.capture_06);

initCamera2();


setSurfaceTextureListener(new SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(final SurfaceTexture surface, int width, int height) {
cameraHandler.post(_runnable);
final int sw = screenWidth;
screenWidth = width;
screenHeight = height;
cameraHandler.post(new Runnable() {
@Override
public void run() {
Size mPreviewSize = getPreferredPreviewSize(mSizes, screenWidth, screenHeight);
previewWidth = mPreviewSize.getHeight();
previewHeight = mPreviewSize.getWidth();

int left, top, viewWidth, viewHeight;
float sh = screenWidth * 1.0f / screenHeight;
float vh = previewWidth * 1.0f / previewHeight;
if (sh < vh) {
left = 0;
viewWidth = screenWidth;
viewHeight = (int) (previewHeight * 1.0f / previewWidth * viewWidth);
top = (screenHeight - viewHeight) / 2;
} else {
top = 0;
viewHeight = screenHeight;
viewWidth = (int) (previewWidth * 1.0f / previewHeight * viewHeight);
left = (screenWidth - viewWidth) / 2;
}
rect.left = left;
rect.top = top;
rect.right = left + viewWidth;
rect.bottom = top + viewHeight;
videoRenderer.setSize(mPreviewSize.getWidth(),mPreviewSize.getHeight());
imageRenderer.setWorld(previewWidth,previewHeight);
if(sw == -1){
openCamera2();
configureTextureViewTransform(screenWidth, screenHeight);
pointView.setRect(rect);
setCoordinate(pointView.getCoordinate(getPreviewWidth(), getPreviewHeight()), pointView.getRect());
}
}
});
}

@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
}

@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
cameraHandler.post(_stoppable);
return false;
}

@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {

}
});
setSurfaceTextureListener(this);
}

private Size[] mSizes;
Expand All @@ -192,6 +193,7 @@ private void initCamera2() {
e.printStackTrace();
}
}

@SuppressLint("WrongConstant")
private void openCamera2(){
if (PermissionChecker.checkSelfPermission(getContext(), Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
Expand Down Expand Up @@ -253,6 +255,7 @@ public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession
e.printStackTrace();
}
}

private Size getPreferredPreviewSize(Size[] sizes, int width, int height) {
List<Size> collectorSizes = new ArrayList<>();
for (Size option : sizes) {
Expand All @@ -276,11 +279,11 @@ public int compare(Size s1, Size s2) {
}
return sizes[0];
}

public void setSmooth(float smooth){
drawRenderer.setSmooth(smooth/100.0f);
}


public int getPreviewWidth() {
return previewWidth;
}
Expand Down Expand Up @@ -485,4 +488,8 @@ public void run() {
isShowImage = false;
}
}

public interface StateListener {
void onSurfaceTextureReady();
}
}
Loading

0 comments on commit 9512bca

Please sign in to comment.