C# Xamarin利用ZXing.Net.Mobile進(jìn)行掃碼的方法
前言
很多人覺得Xamarin的開源少,沒法用來開發(fā)項(xiàng)目。
但,實(shí)際上Xamarin已經(jīng)有很多開源代碼了;只要不是特別特殊的項(xiàng)目,基本上是都可以滿足開發(fā)。
下面我們來看一下Xamarin中利用開源代碼ZXing.Net.Mobile進(jìn)行掃碼。
引用ZXing.Net.Mobile
在Xamarin中進(jìn)行掃碼,需要先引用開源代碼ZXing.Net.Mobile。
下面我們先打開Nuget,搜索ZXing.Net.Mobile,如下圖:

然后我們點(diǎn)擊右側(cè)安裝。
接著VisualStudio可能會(huì)提示我們這樣的錯(cuò)誤。
錯(cuò)誤 檢測(cè)到 Xamarin.Android.Support.Compat 存在版本沖突。直接從項(xiàng)目引用包可解決此問題。
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).
這是因?yàn)槲覀冞x擇安裝的ZXing.Net.Mobile依賴的DLL和我們項(xiàng)目的DLL對(duì)應(yīng)不上。
解決辦法很簡(jiǎn)單,選擇下右側(cè)ZXing.Net.Mobile的其他版本安裝。
----------------------------------------------------------------------------------------------------
但在VisualStudio2017中有個(gè)非??拥牡胤剑褪莕uget的引用會(huì)將相關(guān)dll都組織成一個(gè)包,然后一起引用,如下圖:

看上去引用更簡(jiǎn)潔,按理說應(yīng)該是好事,但這里有個(gè)問題就是,你引用的dll并沒有被下載到本地。
也就是說,如果你網(wǎng)不好,或者斷網(wǎng),就別想調(diào)試了。
所以最終我還是選擇把相關(guān)dll都下載下來,然后直接引用,相關(guān)dll如下圖:

使用MobileBarcodeScanner掃碼
本項(xiàng)目里,我們使用ZXing.Net.Mobile下的MobileBarcodeScanner類進(jìn)行掃碼。
下面簡(jiǎn)單介紹下MobileBarcodeScanner的使用方法。
首先,MobileBarcodeScanner類的實(shí)例需要調(diào)用Scan方法才會(huì)進(jìn)行掃碼。
而Scan方法被調(diào)用后,會(huì)自己打開了一個(gè)Activity。
而這個(gè)被打開的Activity的UI,就是,他對(duì)應(yīng)的axml也是可以被自定義的。
自定義的方法就是Scan方法被調(diào)用前,為MobileBarcodeScanner類的CustomOverlay屬性賦值。
有興趣的同學(xué)可以查看下MobileBarcodeScanner的【源代碼】,更深入的了解一些。
MobileBarcodeScanner的Scan方法有兩個(gè)參數(shù)。
第一個(gè)參數(shù)是當(dāng)前調(diào)用掃碼的Activity,也可以傳Null,傳Null的話,MobileBarcodeScanner類里自己找Context為他賦值。
第二個(gè)參數(shù)是當(dāng)前掃描的配置屬性;為MobileBarcodeScanningOptions類型。
下面我們看調(diào)用代碼。
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;
// 從上到下的平移動(dòng)畫
Animation verticalAnimation = new TranslateAnimation(0, 0, 0, height);
verticalAnimation.Duration = 3000; // 動(dòng)畫持續(xù)時(shí)間
verticalAnimation.RepeatCount = Animation.Infinite; // 無限循環(huán)
// 播放動(dòng)畫
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("掃描無數(shù)據(jù)"); });
}
}
else
{
this.RunOnUi(() => { this.ShowToast("掃描取消"); });
}
scanner.Cancel();
}
如上代碼所示,我們把項(xiàng)目中寫好的ZxingOverlay.axml賦值給了MobileBarcodeScanner的CustomOverlay屬性。
并且在賦值前,我們?yōu)轫撁鎯?nèi)的btnCancelScan按鈕定義了取消事件;同時(shí)還定義了一個(gè)掃描動(dòng)畫。
因?yàn)槎x動(dòng)畫時(shí),頁面還沒加載出來,所以要取高度進(jìn)行動(dòng)畫移動(dòng)的話,需要先進(jìn)行下預(yù)測(cè)。
代碼中調(diào)用了Measure方法進(jìn)行預(yù)測(cè),然后再取出預(yù)測(cè)的高度和寬度MeasuredHeight,MeasuredWidth進(jìn)行動(dòng)畫操作。
----------------------------------------------------------------------------------------------------
最終掃描界面如下圖所示:

到此掃碼使用就介紹完了。
框架代碼已經(jīng)傳到Github上了,歡迎大家下載。Github地址:https://github.com/kiba518/KibaApp
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 為Xamarin.Forms的導(dǎo)航欄增加搜索功能
- C#對(duì)Xamarin框架進(jìn)行數(shù)據(jù)綁定
- .NET?Core、Xamarin、.NET?Standard和.NET?Framework四者之間的區(qū)別介紹
- 詳解Xamarin.Android 利用Fragment實(shí)現(xiàn)底部菜單
- 詳解xamarin Android 實(shí)現(xiàn)ListView萬能適配器
- Android將Xamarin For VS升級(jí)為4.1.0.530版教程
- c#使用xamarin編寫撥打電話程序
- Xamarin.Forms在安卓機(jī)上進(jìn)行本機(jī)調(diào)試
相關(guān)文章
C#實(shí)現(xiàn)對(duì)字符串中特定詞出現(xiàn)次數(shù)的計(jì)數(shù)過程
LINQ(Language-Integrated Query)是C#和VB.NET中強(qiáng)大的查詢語言,它可以用來查詢集合、SQL數(shù)據(jù)庫(kù)、XML文檔等,在C#中,我們可以使用LINQ來簡(jiǎn)化對(duì)字符串中特定單詞出現(xiàn)次數(shù)的計(jì)數(shù)過程,需要的朋友可以參考下2024-08-08
WPF實(shí)現(xiàn)動(dòng)畫效果的入門教程
WPF是一種用于創(chuàng)建Windows客戶端應(yīng)用程序的UI框架,它讓我們能夠創(chuàng)建豐富的圖形界面,包括各種各樣的動(dòng)畫效果,下面我們就來看看如何利用wpf實(shí)現(xiàn)簡(jiǎn)單的動(dòng)畫效果吧2023-09-09
C#利用System.Threading.Thread.Sleep即時(shí)輸出信息的詳解
本篇文章是對(duì)C#利用System.Threading.Thread.Sleep即時(shí)輸出信息進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
C#使用CefSharp自定義緩存實(shí)現(xiàn)
本文介紹了如何使用C#和CefSharp自定義緩存實(shí)現(xiàn)減少Web應(yīng)用程序的網(wǎng)絡(luò)請(qǐng)求,提高應(yīng)用程序性能。首先,本文講解了CefSharp的基本知識(shí)和使用方法。然后,詳細(xì)闡述了在CefSharp中實(shí)現(xiàn)自定義緩存的步驟和技巧。最后,通過實(shí)例演示了如何使用自定義緩存功能獲取并展示網(wǎng)頁數(shù)據(jù)2023-04-04
Visual Studio C#創(chuàng)建windows服務(wù)程序
用Visual C#創(chuàng)建Windows服務(wù)不是一件困難的事,本文就將指導(dǎo)你一步一步創(chuàng)建一個(gè)Windows服務(wù)并使用它,本文主要介紹了Visual Studio C#創(chuàng)建windows服務(wù)程序,感興趣的可以了解一下2024-01-01
C#實(shí)現(xiàn)復(fù)制數(shù)據(jù)庫(kù) C#將A數(shù)據(jù)庫(kù)數(shù)據(jù)轉(zhuǎn)到B數(shù)據(jù)庫(kù)
這篇文章主要為大家詳細(xì)介紹了C#復(fù)制數(shù)據(jù)庫(kù),將數(shù)據(jù)庫(kù)數(shù)據(jù)轉(zhuǎn)到另一個(gè)數(shù)據(jù)庫(kù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11

