2016-08-18 5 views
10

मैं ज़ेडएक्सिंग के क्यूआर रीडर के लिए एक कस्टम ओवरले लिख रहा हूं। यहां काम करने का उदाहरण दिया गया है:एक ही इंटरफ़ेस एक एमुलेटर और डिवाइस पर अलग-अलग क्यों प्रदान किया जाता है?

public partial class CustomScanPage : ContentPage 
{ 
    ZXingScannerView zxing; 
    private List<BoxView> _boxes; 


    public CustomScanPage() : base() 
    { 
     zxing = new ZXingScannerView 
     { 
      HorizontalOptions = LayoutOptions.FillAndExpand, 
      VerticalOptions = LayoutOptions.FillAndExpand 
     }; 
     zxing.OnScanResult += (result) => 
      Device.BeginInvokeOnMainThread(async() => 
      { 
       zxing.IsAnalyzing = false; 

       SetBoxesColor(Color.FromHex("#76ff03")); 
       await Task.Delay(2000); 

       await DisplayAlert("Scanned Barcode", result.Text, "OK"); 

       SetBoxesColor(Color.White); 
      }); 
     zxing.Options = new MobileBarcodeScanningOptions { 
      PossibleFormats = new List<ZXing.BarcodeFormat> { ZXing.BarcodeFormat.QR_CODE } 
     }; 
     var overlay = BuildGrid(); 

     var grid = new Grid 
     { 
      VerticalOptions = LayoutOptions.FillAndExpand, 
      HorizontalOptions = LayoutOptions.FillAndExpand, 
     }; 
     grid.Children.Add(zxing); 
     grid.Children.Add(overlay); 

     Content = grid; 
    } 

    protected override void OnAppearing() 
    { 
     base.OnAppearing(); 

     zxing.IsScanning = true; 
    } 

    protected override void OnDisappearing() 
    { 
     zxing.IsScanning = false; 

     base.OnDisappearing(); 
    } 

    private AbsoluteLayout BuildGrid() 
    { 
     var al = new AbsoluteLayout(); 
     var mask = new BoxView 
     { 
      HorizontalOptions = LayoutOptions.Fill, 
      VerticalOptions = LayoutOptions.Fill, 
      BackgroundColor = Color.Transparent 
     }; 

     var maskSide = 196; 

     var yBegin = Math.Round((App.ScreenHeight - maskSide)/2); 
     var xBegin = Math.Round((App.ScreenWidth - maskSide)/2); 
     var barLong = 40; 
     var barShort = 4; 
     var barColor = Color.White; 

     var grid = new Grid { ColumnSpacing = 0, RowSpacing = 0 }; 
     grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(yBegin, GridUnitType.Absolute) }); 
     grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(maskSide, GridUnitType.Absolute) }); 
     grid.RowDefinitions.Add(new RowDefinition { Height = new GridLength(App.ScreenHeight - yBegin, GridUnitType.Absolute) }); 
     grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(xBegin, GridUnitType.Absolute) }); 
     grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(maskSide, GridUnitType.Absolute) }); 
     grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(App.ScreenWidth - xBegin, GridUnitType.Absolute) }); 

     grid.Children.Add(new BoxView { HorizontalOptions = LayoutOptions.Fill, VerticalOptions = LayoutOptions.Fill, BackgroundColor = Color.FromHex("#80323232"), }, 0, 0); 
     grid.Children.Add(new BoxView { HorizontalOptions = LayoutOptions.Fill, VerticalOptions = LayoutOptions.Fill, BackgroundColor = Color.FromHex("#80323232") }, 0, 1); 
     grid.Children.Add(new BoxView { HorizontalOptions = LayoutOptions.Fill, VerticalOptions = LayoutOptions.Fill, BackgroundColor = Color.FromHex("#80323232") }, 0, 2); 

     grid.Children.Add(new BoxView { HorizontalOptions = LayoutOptions.Fill, VerticalOptions = LayoutOptions.Fill, BackgroundColor = Color.FromHex("#80323232") }, 1, 0); 
     grid.Children.Add(mask, 1, 1); 
     grid.Children.Add(new BoxView { HorizontalOptions = LayoutOptions.Fill, VerticalOptions = LayoutOptions.Fill, BackgroundColor = Color.FromHex("#80323232") }, 1, 2); 

     grid.Children.Add(new BoxView { HorizontalOptions = LayoutOptions.Fill, VerticalOptions = LayoutOptions.Fill, BackgroundColor = Color.FromHex("#80323232") }, 2, 0); 
     grid.Children.Add(new BoxView { HorizontalOptions = LayoutOptions.Fill, VerticalOptions = LayoutOptions.Fill, BackgroundColor = Color.FromHex("#80323232") }, 2, 1); 
     grid.Children.Add(new BoxView { HorizontalOptions = LayoutOptions.Fill, VerticalOptions = LayoutOptions.Fill, BackgroundColor = Color.FromHex("#80323232") }, 2, 2); 

     grid.HorizontalOptions = LayoutOptions.FillAndExpand; 
     grid.VerticalOptions = LayoutOptions.FillAndExpand; 

     AbsoluteLayout.SetLayoutBounds(grid, new Rectangle(0, 0, 1, 1)); 
     AbsoluteLayout.SetLayoutFlags(grid, AbsoluteLayoutFlags.All); 

     al.Children.Add(grid); 

     var b1 = new BoxView { HorizontalOptions = LayoutOptions.Fill, VerticalOptions = LayoutOptions.Fill, BackgroundColor = barColor }; 

     AbsoluteLayout.SetLayoutBounds(b1, new Rectangle(xBegin - barShort, yBegin, barShort, barLong - barShort)); 
     AbsoluteLayout.SetLayoutFlags(b1, AbsoluteLayoutFlags.None); 

     var b2 = new BoxView { HorizontalOptions = LayoutOptions.Fill, VerticalOptions = LayoutOptions.Fill, BackgroundColor = barColor }; 

     AbsoluteLayout.SetLayoutBounds(b2, new Rectangle(xBegin - barShort, yBegin - barShort, barLong, barShort)); 
     AbsoluteLayout.SetLayoutFlags(b2, AbsoluteLayoutFlags.None); 

     var b3 = new BoxView { HorizontalOptions = LayoutOptions.Fill, VerticalOptions = LayoutOptions.Fill, BackgroundColor = barColor }; 

     AbsoluteLayout.SetLayoutBounds(b3, new Rectangle(xBegin + maskSide, yBegin, barShort, barLong - barShort)); 
     AbsoluteLayout.SetLayoutFlags(b3, AbsoluteLayoutFlags.None); 

     var b4 = new BoxView { HorizontalOptions = LayoutOptions.Fill, VerticalOptions = LayoutOptions.Fill, BackgroundColor = barColor }; 

     AbsoluteLayout.SetLayoutBounds(b4, new Rectangle(xBegin - barLong + maskSide + barShort, yBegin - barShort, barLong, barShort)); 
     AbsoluteLayout.SetLayoutFlags(b4, AbsoluteLayoutFlags.None); 

     var b5 = new BoxView { HorizontalOptions = LayoutOptions.Fill, VerticalOptions = LayoutOptions.Fill, BackgroundColor = barColor }; 

     AbsoluteLayout.SetLayoutBounds(b5, new Rectangle(xBegin - barShort, yBegin + maskSide + barShort - barLong, barShort, barLong - barShort)); 
     AbsoluteLayout.SetLayoutFlags(b5, AbsoluteLayoutFlags.None); 

     var b6 = new BoxView { HorizontalOptions = LayoutOptions.Fill, VerticalOptions = LayoutOptions.Fill, BackgroundColor = barColor }; 

     AbsoluteLayout.SetLayoutBounds(b6, new Rectangle(xBegin - barShort, yBegin + maskSide, barLong, barShort)); 
     AbsoluteLayout.SetLayoutFlags(b6, AbsoluteLayoutFlags.None); 

     var b7 = new BoxView { HorizontalOptions = LayoutOptions.Fill, VerticalOptions = LayoutOptions.Fill, BackgroundColor = barColor }; 

     AbsoluteLayout.SetLayoutBounds(b7, new Rectangle(xBegin + maskSide - barLong + barShort, yBegin + maskSide, barLong, barShort)); 
     AbsoluteLayout.SetLayoutFlags(b7, AbsoluteLayoutFlags.None); 

     var b8 = new BoxView { HorizontalOptions = LayoutOptions.Fill, VerticalOptions = LayoutOptions.Fill, BackgroundColor = barColor }; 

     AbsoluteLayout.SetLayoutBounds(b8, new Rectangle(xBegin + maskSide, yBegin + maskSide - barLong + barShort, barShort, barLong - barShort)); 
     AbsoluteLayout.SetLayoutFlags(b8, AbsoluteLayoutFlags.None); 

     al.Children.Add(b1); 
     al.Children.Add(b2); 
     al.Children.Add(b3); 
     al.Children.Add(b4); 
     al.Children.Add(b5); 
     al.Children.Add(b6); 
     al.Children.Add(b7); 
     al.Children.Add(b8); 

     _boxes = new List<BoxView> { b1, b2, b3, b4, b5, b6, b7, b8 }; 

     return al; 
    } 

    private void SetBoxesColor(Color c) 
    { 
     foreach (var box in _boxes) 
     { 
      box.Color = c; 
     } 
    } 
} 

जैसा कि आप देख सकते हैं, कुछ भी जटिल नहीं है। लेकिन समस्या यह है कि यह पृष्ठ कैसे प्रस्तुत किया जाता है। मेरे Nexus 5x पर

enter image description here

लेकिन जब मैं एक ही आवेदन (ग्रिड पर गुलाबी पृष्ठभूमि के बिना) चलाएँ: Xamarin एंड्रॉयड प्लेयर उपकरणों पर (Nexus 4 किटकैट HD और नेक्सस 5 लॉलीपॉप पूर्ण HD) सब कुछ उम्मीद के रूप में लग रहा है डिवाइस (मार्शमलो, फुल एचडी), जैसा कि आप देख सकते हैं, पिक्सल सटीक नहीं हैं, ऊपरी दाएं हरे रंग के आकार पर थोड़ा विसंगति है, बाएं आकृतियों पर थोड़ा ऑफसेट है और ग्रिड पर एक पिक्सेल पारदर्शी अंतर है पंक्ति:

enter image description here

तथ्य यह है कि कोड है दो उपकरणों पर सही ढंग से प्रस्तुत किया गया मुझे विश्वास दिलाता है कि मेरा बिंदु अंकगणित सही है। मामला क्या हो सकता है? और सबसे महत्वपूर्ण बात यह है कि इसे हल करने के लिए मैं क्या कर सकता हूं?

संपादित करें:

हो सकता है कि किसी भी तरह कारण यह है कि मेरे उपकरण के pt/px अनुपात एमुलेटर उपकरणों 'अनुपात की तुलना में अलग है?

संपादित करें:

@ Cheesebaron का जवाब गलत था। यहां मैंने जो करने की कोशिश की है, जिसने मदद नहीं की: मैंने CustomBoxView, CustomBoxViewNative, CustomBoxViewRenderer बनाया और BoxView के बजाय CustomBoxView का उपयोग किया। यह काम नहीं किया।

CustomBoxView:

public class CustomBoxView : View 
{ 
    public static readonly BindableProperty ColorProperty = BindableProperty.Create("Color", typeof (string), 
     typeof (CustomBoxView), "#FF0000"); 

    public string Color 
    { 
     get { return (string) GetValue(ColorProperty); } 
     set { SetValue(ColorProperty, value); } 
    } 
} 

CustomBoxViewNative:

public class CustomBoxViewNative : View 
{ 
    private Canvas _canvas; 
    private Rect _rect; 

    public CustomBoxViewNative(IntPtr javaReference, JniHandleOwnership transfer) : base(javaReference, transfer) 
    { 
    } 

    public CustomBoxViewNative(Context context) : base(context) 
    { 
    } 

    public CustomBoxViewNative(Context context, IAttributeSet attrs) : base(context, attrs) 
    { 
    } 

    public CustomBoxViewNative(Context context, IAttributeSet attrs, int defStyleAttr) : base(context, attrs, defStyleAttr) 
    { 
    } 

    public CustomBoxViewNative(Context context, IAttributeSet attrs, int defStyleAttr, int defStyleRes) : base(context, attrs, defStyleAttr, defStyleRes) 
    { 
    } 

    protected override void OnDraw(Canvas canvas) 
    { 
     var paintCircle = new Paint { Color = Color.White }; 
     paintCircle.StrokeWidth = Width*Resources.DisplayMetrics.Density; 
     _rect = new Rect(0, 0, Width, Height); 
     _canvas = canvas; 
     _canvas.DrawRect(_rect, paintCircle); 
    } 
} 

CustomBoxViewRenderer:

public class CustomBoxViewRenderer : ViewRenderer<CustomBoxView, CustomBoxViewNative> 
{ 
    protected override void OnElementChanged(ElementChangedEventArgs<CustomBoxView> e) 
    { 
     base.OnElementChanged(e); 

     if (e.OldElement != null || this.Element == null) 
      return; 

     var nativeControl = new CustomBoxViewNative(Forms.Context); 

     SetNativeControl(nativeControl); 
    } 
} 
+0

न करें भरोसा emulators, न्याय करने के लिए कई उपकरणों पर इसे चलाने का प्रयास करें। –

+0

यह एक उप-पिक्सेल प्रतिपादन समस्या है। आपको अपनी स्ट्रोक चौड़ाई के लिए स्क्रीन घनत्व में कारक करने की आवश्यकता है। – Cheesebaron

+0

@ चेसबरन क्या आप अधिक विशिष्ट हो सकते हैं? हो सकता है कि कुछ संसाधन – nicks

उत्तर

4

टिप्पणियां आप अपनी गणना में प्रदर्शन घनत्व में कारक नहीं है में लिखा है। इसलिए, जब आप अपनी लाइनें प्रस्तुत करते हैं तो यह कुछ उपकरणों पर थोड़ा सा हो सकता है।

मुझे पता है कि ज़ैमरिन फॉर्म लैब्स में एक डिस्प्ले क्लास है जहां आप अपनी स्क्रीन का घनत्व प्राप्त कर सकते हैं।

public interface IDisplayInfo 
{ 
    float Density { get; } 
} 

Android पर:: यदि आप कुछ इस तरह कर सकते हैं आप किसी निर्भरता सेवा के माध्यम से यह अपने आप प्राप्त करना चाहते हैं

public class DisplayInfo : IDisplayInfo 
{ 
    public float Density => Application.Context.Resources.DisplayMetrics.Density; 
} 

iOS पर:

public class DisplayInfo : IDisplayInfo 
{ 
    public float Density => UIScreen.MainScreen.Scale; 
} 

से अपनी निर्भरता सेवा रजिस्टर प्रत्येक मंच:

[assembly: Xamarin.Forms.Dependency (typeof (DisplayInfo))] 

तब जब आप इसे उपयोग करने की आवश्यकता:

var display = DependencyService.Get<IDisplayInfo>(); 

var density = display.Density; 

तो फिर तुम सिर्फ density के साथ अपने स्ट्रोक चौड़ाई गुणा।

यहाँ एक छोटा सा उदाहरण है: https://stackoverflow.com/a/14405451/368379

+0

आपका कोड घनत्व '3' के बराबर लौटाता है। क्या इसका मतलब यह है कि मुझे मास्कसाइड गुणा करना चाहिए जो 1 9 6 के बराबर है और परिणामी मूल्य का उपयोग करता है? यह मेरे आकार का गड़बड़ कर देगा। शायद आप कह रहे हैं कि यह _multiple_ 3 होना चाहिए? – nicks

+0

कृपया, क्या आप विस्तृत कर सकते हैं? मुझे समझ में नहीं आता कि क्या करने की जरूरत है। – nicks

+0

वैसे भी स्ट्रोक के साथ क्या करना है? मैं किसी भी – nicks

संबंधित मुद्दे