前言 很多人覺得Xamarin的開源少,沒法用來開發項目。 但,實際上Xamarin已經有很多開源代碼了;只要不是特別特殊的項目,基本上是都可以滿足開發。 下麵我們來看一下Xamarin中利用開源代碼ZXing.Net.Mobile進行掃碼。 引用ZXing.Net.Mobile 在Xamarin中 ...
前言
很多人覺得Xamarin的開源少,沒法用來開發項目。
但,實際上Xamarin已經有很多開源代碼了;只要不是特別特殊的項目,基本上是都可以滿足開發。
下麵我們來看一下Xamarin中利用開源代碼ZXing.Net.Mobile進行掃碼。
引用ZXing.Net.Mobile
在Xamarin中進行掃碼,需要先引用開源代碼ZXing.Net.Mobile。
下麵我們先打開Nuget,搜索ZXing.Net.Mobile,如下圖:
然後我們點擊右側安裝。
接著VisualStudio可能會提示我們這樣的錯誤。
錯誤 檢測到 Xamarin.Android.Support.Compat 存在版本衝突。直接從項目引用包可解決此問題。
SalesApp -> Xamarin.Android.Support.Design 25.4.0.2 -> Xamarin.Android.Support.Compat (= 25.4.0.2)
SalesApp -> ZXing.Net.Mobile 2.4.1 -> Xamarin.Android.Support.v4 25.4.0.1 -> Xamarin.Android.Support.Compat (= 25.4.0.1).
這是因為我們選擇安裝的ZXing.Net.Mobile依賴的DLL和我們項目的DLL對應不上。
解決辦法很簡單,選擇下右側ZXing.Net.Mobile的其他版本安裝。
----------------------------------------------------------------------------------------------------
但在VisualStudio2017中有個非常坑的地方,就是nuget的引用會將相關dll都組織成一個包,然後一起引用,如下圖:
看上去引用更簡潔,按理說應該是好事,但這裡有個問題就是,你引用的dll並沒有被下載到本地。
也就是說,如果你網不好,或者斷網,就別想調試了。
所以最終我還是選擇把相關dll都下載下來,然後直接引用,相關dll如下圖:
使用MobileBarcodeScanner掃碼
本項目里,我們使用ZXing.Net.Mobile下的MobileBarcodeScanner類進行掃碼。
下麵簡單介紹下MobileBarcodeScanner的使用方法。
首先,MobileBarcodeScanner類的實例需要調用Scan方法才會進行掃碼。
而Scan方法被調用後,會自己打開了一個Activity。
而這個被打開的Activity的UI,就是,他對應的axml也是可以被自定義的。
自定義的方法就是Scan方法被調用前,為MobileBarcodeScanner類的CustomOverlay屬性賦值。
有興趣的同學可以查看下MobileBarcodeScanner的【源代碼】,更深入的瞭解一些。
MobileBarcodeScanner的Scan方法有兩個參數。
第一個參數是當前調用掃碼的Activity,也可以傳Null,傳Null的話,MobileBarcodeScanner類里自己找Context為他賦值。
第二個參數是當前掃描的配置屬性;為MobileBarcodeScanningOptions類型。
下麵我們看調用代碼。
View zxingOverlay; MobileBarcodeScanner scanner; protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); SetContentView(Resource.Layout.MainActivity); Button btnScan = this.FindControl<Button>("btnScan"); btnScan.Click += (s, e) => { scanner = new MobileBarcodeScanner(); Task t = new Task(AutoScan); t.Start(); }; } async void AutoScan() { scanner.UseCustomOverlay = true; zxingOverlay = LayoutInflater.FromContext(this).Inflate(Resource.Layout.ZxingOverlay, null); ImageView ivScanning = zxingOverlay.FindViewById<ImageView>(Resource.Id.ivScanning); Button btnCancelScan = zxingOverlay.FindViewById<Button>(Resource.Id.btnCancelScan); btnCancelScan.Click += (s, e) => { if (scanner != null) { scanner.Cancel(); } }; zxingOverlay.Measure(MeasureSpecMode.Unspecified.GetHashCode(), MeasureSpecMode.Unspecified.GetHashCode()); int width = zxingOverlay.MeasuredWidth; int height = zxingOverlay.MeasuredHeight; // 從上到下的平移動畫 Animation verticalAnimation = new TranslateAnimation(0, 0, 0, height); verticalAnimation.Duration = 3000; // 動畫持續時間 verticalAnimation.RepeatCount = Animation.Infinite; // 無限迴圈 // 播放動畫 ivScanning.Animation = verticalAnimation; verticalAnimation.StartNow(); scanner.CustomOverlay = zxingOverlay; var mbs = MobileBarcodeScanningOptions.Default; mbs.AssumeGS1 = true; mbs.AutoRotate = true; mbs.DisableAutofocus = false; mbs.PureBarcode = false; mbs.TryInverted = true; mbs.TryHarder = true; mbs.UseCode39ExtendedMode = true; mbs.UseFrontCameraIfAvailable = false; mbs.UseNativeScanning = true; var result = await scanner.Scan(this, mbs); HandleScanResult(result); } void HandleScanResult(ZXing.Result result) { if (result != null && !string.IsNullOrEmpty(result.Text)) { if (result.Text != null && result.Text.Trim().Length > 5) { this.RunOnUi(() => { this.ShowToast(result.Text); }); } else { this.RunOnUi(() => { this.ShowToast("掃描無數據"); }); } } else { this.RunOnUi(() => { this.ShowToast("掃描取消"); }); } scanner.Cancel(); }
如上代碼所示,我們把項目中寫好的ZxingOverlay.axml賦值給了MobileBarcodeScanner的CustomOverlay屬性。
並且在賦值前,我們為頁面內的btnCancelScan按鈕定義了取消事件;同時還定義了一個掃描動畫。
因為定義動畫時,頁面還沒載入出來,所以要取高度進行動畫移動的話,需要先進行下預測。
代碼中調用了Measure方法進行預測,然後再取出預測的高度和寬度MeasuredHeight,MeasuredWidth進行動畫操作。
----------------------------------------------------------------------------------------------------
最終掃描界面如下圖所示:
----------------------------------------------------------------------------------------------------
到此掃碼使用就介紹完了。
框架代碼已經傳到Github上了,歡迎大家下載。
相關文章:
C#-Xamarin的Android項目開發(三)——發佈、部署、打包
C#-Xamarin的Android項目開發(二)——控制項應用
C#-Xamarin的Android項目開發(一)——創建項目
Github地址:https://github.com/kiba518/KibaApp
----------------------------------------------------------------------------------------------------
註:此文章為原創,歡迎轉載,請在文章頁面明顯位置給出此文鏈接!
若您覺得這篇文章還不錯,請點擊下右下角的【推薦】,非常感謝!