Android XzingScanner : 如何自定义 ZxingScanner 布局? (添加按钮)
Android XzingScanner : How to customise ZxingScanner layout ? (add button)
我正在使用 Zxing Scanner 实现条码扫描器,这部分一切正常,但现在我想在布局上添加一个按钮(切换 on/off 手电筒)。我在互联网上到处查看,但一无所获。
所以,这是我的问题:
是否可以修改 .xml 以添加按钮?如果是,如何找到这个文件?
是否已经在某个地方实现了在布局中添加一些元素的功能?
这就是我调用 ZXingScannerView 的方式:
scannerView = new ZXingScannerView(this);
setContentView(scannerView);
这很好用 ZXing 库自定义 QR/Barcode 扫描器
https://github.com/journeyapps/zxing-android-embedded
您可以在那里看到示例应用程序项目并自行自定义(添加按钮、设置 flash on/off)。
还有另一个库,但它没有使用 ZXing。
https://github.com/googlesamples/android-vision
它已被弃用,现在是 ML Kit 的一部分,但仍然可以使用。
希望对您有所帮助。谢谢。
[更新]
请将此库导入您的项目。 (你可以看到如何从下面导入它 link。)
https://github.com/journeyapps/zxing-android-embedded#adding-aar-dependency-with-gradle
导入后,您可以更新条码扫描仪的 activity。layout.xml。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/topLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true">
<com.journeyapps.barcodescanner.DecoratedBarcodeView
android:id="@+id/barcode_scanner"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
<Button
android:id="@+id/btn_flash"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center"
android:text="Flash"/>
</FrameLayout>
com.journeyapps.barcodescanner.DecoratedBarcodeView 是 BarcodeScanner 视图。而Button只是为了转on/off flash.
这是 BarcodeScanner 的 Activity。
public class ScanQRActivity extends BaseActivity {
private static final String TAG = "ScanQRActivity";
private DecoratedBarcodeView barcodeView;
private boolean isFlashOn;
/**
* Initializes the UI and creates the detector pipeline.
*/
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_scan_qr);
isFlashOn = false;
barcodeView = findViewById(R.id.barcode_scanner);
Collection<BarcodeFormat> formats = Arrays.asList(BarcodeFormat.CODE_39); // Set barcode type
barcodeView.getBarcodeView().setDecoderFactory(new DefaultDecoderFactory(formats));
barcodeView.initializeFromIntent(getIntent());
barcodeView.decodeContinuous(callback);
Button btnFlash = findViewById(R.id.btn_flash);
if (!hasFlash()) {
btnFlash.setVisibility(View.GONE);
}
btnFlash.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switchFlashlight();
}
});
}
private BarcodeCallback callback = new BarcodeCallback() {
@Override
public void barcodeResult(BarcodeResult result) {
Log.e(TAG, result.getText()); // QR/Barcode result
}
@Override
public void possibleResultPoints(List<ResultPoint> resultPoints) {
}
};
/**
* Check if the device's camera has a Flashlight.
*
* @return true if there is Flashlight, otherwise false.
*/
private boolean hasFlash() {
return getApplicationContext().getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
}
public void switchFlashlight() {
if (isFlashOn) {
isFlashOn = false;
barcodeView.setTorchOff();
} else {
isFlashOn = true;
barcodeView.setTorchOn();
}
}
@Override
protected void onResume() {
super.onResume();
barcodeView.resume();
}
@Override
protected void onPause() {
super.onPause();
barcodeView.pause();
}
}
扫描QR/Barcode时,可以从BarcodeCallback.barcodeResult函数得到结果。
希望对您有所帮助。
如果您有任何问题,请在这里评论。
我正在使用 Zxing Scanner 实现条码扫描器,这部分一切正常,但现在我想在布局上添加一个按钮(切换 on/off 手电筒)。我在互联网上到处查看,但一无所获。
所以,这是我的问题:
是否可以修改 .xml 以添加按钮?如果是,如何找到这个文件?
是否已经在某个地方实现了在布局中添加一些元素的功能?
这就是我调用 ZXingScannerView 的方式:
scannerView = new ZXingScannerView(this);
setContentView(scannerView);
这很好用 ZXing 库自定义 QR/Barcode 扫描器
https://github.com/journeyapps/zxing-android-embedded
您可以在那里看到示例应用程序项目并自行自定义(添加按钮、设置 flash on/off)。
还有另一个库,但它没有使用 ZXing。
https://github.com/googlesamples/android-vision
它已被弃用,现在是 ML Kit 的一部分,但仍然可以使用。
希望对您有所帮助。谢谢。
[更新]
请将此库导入您的项目。 (你可以看到如何从下面导入它 link。)
https://github.com/journeyapps/zxing-android-embedded#adding-aar-dependency-with-gradle
导入后,您可以更新条码扫描仪的 activity。layout.xml。
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/topLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true">
<com.journeyapps.barcodescanner.DecoratedBarcodeView
android:id="@+id/barcode_scanner"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center" />
<Button
android:id="@+id/btn_flash"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center"
android:text="Flash"/>
</FrameLayout>
com.journeyapps.barcodescanner.DecoratedBarcodeView 是 BarcodeScanner 视图。而Button只是为了转on/off flash.
这是 BarcodeScanner 的 Activity。
public class ScanQRActivity extends BaseActivity {
private static final String TAG = "ScanQRActivity";
private DecoratedBarcodeView barcodeView;
private boolean isFlashOn;
/**
* Initializes the UI and creates the detector pipeline.
*/
@Override
public void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.activity_scan_qr);
isFlashOn = false;
barcodeView = findViewById(R.id.barcode_scanner);
Collection<BarcodeFormat> formats = Arrays.asList(BarcodeFormat.CODE_39); // Set barcode type
barcodeView.getBarcodeView().setDecoderFactory(new DefaultDecoderFactory(formats));
barcodeView.initializeFromIntent(getIntent());
barcodeView.decodeContinuous(callback);
Button btnFlash = findViewById(R.id.btn_flash);
if (!hasFlash()) {
btnFlash.setVisibility(View.GONE);
}
btnFlash.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
switchFlashlight();
}
});
}
private BarcodeCallback callback = new BarcodeCallback() {
@Override
public void barcodeResult(BarcodeResult result) {
Log.e(TAG, result.getText()); // QR/Barcode result
}
@Override
public void possibleResultPoints(List<ResultPoint> resultPoints) {
}
};
/**
* Check if the device's camera has a Flashlight.
*
* @return true if there is Flashlight, otherwise false.
*/
private boolean hasFlash() {
return getApplicationContext().getPackageManager()
.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
}
public void switchFlashlight() {
if (isFlashOn) {
isFlashOn = false;
barcodeView.setTorchOff();
} else {
isFlashOn = true;
barcodeView.setTorchOn();
}
}
@Override
protected void onResume() {
super.onResume();
barcodeView.resume();
}
@Override
protected void onPause() {
super.onPause();
barcodeView.pause();
}
}
扫描QR/Barcode时,可以从BarcodeCallback.barcodeResult函数得到结果。
希望对您有所帮助。 如果您有任何问题,请在这里评论。