Skip to content

Commit a3db936

Browse files
committed
replaced SurfaceView with TextureView
1 parent f59c84c commit a3db936

File tree

2 files changed

+62
-88
lines changed

2 files changed

+62
-88
lines changed

android/src/main/java/com/reactnativecomponent/barcode/CaptureView.java

Lines changed: 58 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import android.content.res.Resources;
1111
import android.graphics.Bitmap;
1212
import android.graphics.Color;
13+
import android.graphics.SurfaceTexture;
1314
import android.hardware.Camera;
1415
import android.media.AudioManager;
1516
import android.media.MediaPlayer;
@@ -18,8 +19,7 @@
1819
import android.util.DisplayMetrics;
1920
import android.util.Log;
2021
import android.view.MotionEvent;
21-
import android.view.SurfaceHolder;
22-
import android.view.SurfaceView;
22+
import android.view.TextureView;
2323
import android.view.View;
2424
import android.view.ViewGroup;
2525
import android.widget.FrameLayout;
@@ -38,7 +38,7 @@
3838
import java.util.Vector;
3939

4040

41-
public class CaptureView extends FrameLayout implements SurfaceHolder.Callback {
41+
public class CaptureView extends FrameLayout implements TextureView.SurfaceTextureListener {
4242

4343

4444
private CaptureActivityHandler handler;
@@ -54,7 +54,7 @@ public class CaptureView extends FrameLayout implements SurfaceHolder.Callback {
5454
private Activity activity;
5555
private ViewGroup.LayoutParams param;
5656
private int ScreenWidth, ScreenHeight;
57-
private SurfaceView surfaceView;
57+
private TextureView textureView;
5858
private long beginTime;
5959
private int height;
6060
private int width;
@@ -95,7 +95,7 @@ public class CaptureView extends FrameLayout implements SurfaceHolder.Callback {
9595
private View popupWindowContent;
9696
private PopupWindow popupWindow;
9797
private LinearGradientView linearGradientView;
98-
SurfaceHolder holder;
98+
SurfaceTexture surfaceTexture;
9999
boolean autoStart = true;//是否自动启动扫描
100100
String ResultStr="";
101101

@@ -175,23 +175,6 @@ public Handler getHandler() {
175175
return handler;
176176
}
177177

178-
@Override
179-
public void surfaceChanged(SurfaceHolder holder, int format, int width,
180-
int height) {
181-
}
182-
183-
@Override
184-
public void surfaceCreated(SurfaceHolder holder) {
185-
186-
// Log.i("Test", "height:" + height + "width:" + width);
187-
initCameraManager();
188-
this.holder = holder;
189-
190-
if (autoStart) {
191-
startScan();
192-
}
193-
194-
}
195178

196179
private void initCameraManager() {
197180

@@ -215,24 +198,14 @@ public void onViewAdded(View child) {
215198
this.addView(this.viewfinderView);
216199
}
217200
}*/
218-
219-
220-
@Override
221-
public void surfaceDestroyed(SurfaceHolder holder) {
222-
223-
stopScan();
224-
225-
}
226-
201+
227202
/**
228203
* Activity onResume后调用view的onAttachedToWindow
229204
*/
230205
@Override
231206
protected void onAttachedToWindow() {
232207
init();
233208
super.onAttachedToWindow();
234-
235-
236209
}
237210

238211
/**
@@ -242,18 +215,18 @@ private void init() {
242215
if (mHandler == null) {
243216
mHandler = new Handler();
244217
}
245-
surfaceView = new SurfaceView(activity);
246-
surfaceView.setLayoutParams(param);
247-
surfaceView.getLayoutParams().height = ScreenHeight;
248-
surfaceView.getLayoutParams().width = ScreenWidth;
249-
SurfaceHolder surfaceHolder = surfaceView.getHolder();
218+
textureView = new TextureView(activity);
219+
textureView.setLayoutParams(param);
220+
textureView.getLayoutParams().height = ScreenHeight;
221+
textureView.getLayoutParams().width = ScreenWidth;
222+
SurfaceTexture surfaceTexture = textureView.getSurfaceTexture();
250223
if (hasSurface) {
251-
initCamera(surfaceHolder);
224+
initCamera(surfaceTexture);
252225
} else {
253-
surfaceHolder.addCallback(this);
226+
textureView.setSurfaceTextureListener(this);
254227

255228
}
256-
this.addView(surfaceView);
229+
this.addView(textureView);
257230
viewfinderView = new ViewfinderView(activity, scanTime, CORNER_COLOR);
258231
viewfinderView.CORNER_WIDTH = CORNER_WIDTH;
259232
viewfinderView.ShowText = Text;
@@ -388,7 +361,7 @@ public void startScan() {
388361
viewfinderView.drawLine = true;
389362
hasSurface = true;
390363
CameraManager.get().framingRectInPreview = null;
391-
initCamera(holder);
364+
initCamera(surfaceTexture);
392365

393366
CameraManager.get().initPreviewCallback();
394367
CameraManager.get().startPreview();
@@ -427,10 +400,8 @@ public void startQR() {
427400
@Override
428401
protected void onDetachedFromWindow() {
429402
this.removeView(viewfinderView);
430-
this.removeView(surfaceView);
431-
// if(popupWindow.isShowing()){
432-
// popupWindow.dismiss();
433-
// }
403+
this.removeView(textureView);
404+
434405
if (handler != null) {
435406
handler.quitSynchronously();
436407
}
@@ -439,9 +410,9 @@ protected void onDetachedFromWindow() {
439410
}
440411

441412

442-
private void initCamera(SurfaceHolder surfaceHolder) {
413+
private void initCamera(SurfaceTexture surfaceTexture) {
443414
try {
444-
CameraManager.get().openDriver(surfaceHolder);
415+
CameraManager.get().openDriver(surfaceTexture);
445416

446417

447418
} catch (IOException ioe) {
@@ -483,44 +454,12 @@ public void handleDecode(Result obj, Bitmap barcode) {
483454
} catch (InterruptedException e) {
484455
e.printStackTrace();
485456
}
486-
initCamera(surfaceView.getHolder());
457+
initCamera(textureView.getHolder());
487458
if (handler != null) {
488459
handler.restartPreviewAndDecode();
489460
}*/
490461

491462
}
492-
/* public Handler Scanhandler=new Handler() {
493-
@Override
494-
public void handleMessage(Message msg) {
495-
// TODO Auto-generated method stub
496-
super.handleMessage(msg);
497-
// 此处可以更新UI
498-
Bundle b = msg.getData();
499-
String result = b.getString("result");
500-
onEvChangeListener.getQRCodeResult(result); //观察者模式发送到RN侧
501-
}
502-
};//不加这个分号则不能自动添加代码
503-
*/
504-
/* public void DecodeFromPath(final String path){
505-
506-
507-
Runnable scan_thread =new Runnable() {
508-
@Override
509-
public void run() {
510-
String ResultStr= DecodeUtil.getStringFromQRCode(path);
511-
Message msg = new Message();
512-
Bundle b = new Bundle();// 存放数据
513-
b.putString("result",ResultStr);
514-
msg.setData(b);
515-
516-
Scanhandler.sendMessage(msg);
517-
}
518-
};
519-
520-
Scanhandler.post(scan_thread);
521-
522-
523-
}*/
524463

525464

526465
/**
@@ -687,7 +626,7 @@ public void onWindowFocusChanged(boolean hasWindowFocus) {
687626

688627
if (hasWindowFocus) {
689628
//对应onresume
690-
this.holder = surfaceView.getHolder();
629+
this.surfaceTexture = textureView.getSurfaceTexture();
691630
startScan();
692631
} else {
693632
//对应onpause
@@ -844,7 +783,7 @@ public void onAnimationEnd(Animator animation) {
844783
CameraManager.get().framingRectInPreview = null;
845784
// decodeFormats = null;
846785
viewfinderView.drawLine = true;
847-
holder = surfaceView.getHolder();
786+
surfaceTexture = textureView.getSurfaceTexture();
848787
// startScan();
849788
startQR();
850789
initProgressBar();
@@ -855,7 +794,7 @@ public void onAnimationCancel(Animator animation) {
855794
stopScan();
856795
CameraManager.get().framingRectInPreview = null;
857796
// decodeFormats = null;
858-
holder = surfaceView.getHolder();
797+
surfaceTexture = textureView.getSurfaceTexture();
859798
startScan();
860799
viewfinderView.drawLine = true;
861800
}
@@ -873,6 +812,41 @@ public void onAnimationRepeat(Animator animation) {
873812

874813
}
875814

815+
@Override
816+
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
817+
// Log.i("Test", "height:" + height + "width:" + width);
818+
819+
CameraManager.init(activity);
820+
821+
initCameraManager();
822+
823+
surfaceTexture = surface;
824+
825+
826+
textureView.setAlpha(1.0f);
827+
828+
829+
if (autoStart) {
830+
startScan();
831+
}
832+
}
833+
834+
@Override
835+
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
836+
837+
}
838+
839+
@Override
840+
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
841+
stopScan();
842+
return false;
843+
}
844+
845+
@Override
846+
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
847+
848+
}
849+
876850

877851
private final class TouchListener implements OnTouchListener {
878852

android/src/main/java/com/reactnativecomponent/barcode/camera/CameraManager.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
import android.os.Build;
2525
import android.os.Handler;
2626
import android.util.Log;
27-
import android.view.SurfaceHolder;
27+
import android.graphics.SurfaceTexture;
2828

2929
import java.io.IOException;
3030

@@ -133,16 +133,16 @@ public void initPreviewCallback() {
133133
/**
134134
* Opens the camera driver and initializes the hardware parameters.
135135
*
136-
* @param holder The surface object which the camera will draw preview frames into.
136+
* @param surfaceTexture The surface object which the camera will draw preview frames into.
137137
* @throws IOException Indicates the camera driver failed to open.
138138
*/
139-
public void openDriver(SurfaceHolder holder) throws IOException {
139+
public void openDriver(SurfaceTexture surfaceTexture) throws IOException {
140140
if (camera == null) {
141141
camera = Camera.open();
142142
if (camera == null) {
143143
throw new IOException();
144144
}
145-
camera.setPreviewDisplay(holder);
145+
camera.setPreviewTexture(surfaceTexture);
146146

147147
if (!initialized) {
148148
initialized = true;

0 commit comments

Comments
 (0)