2016-12-02 3 views
1

各プラットフォームでアイコンリソースを使用していて、OnPlatformを使用してpngイメージを参照しています。ベクトルxmlを次のコードのように参照するとよいでしょう。私はそれがdpiのフォルダを対応するPNG形式のを使用することが可能です知っているlocation_pin.xmlは、アンドロイドベクトルXMLXamarin - PCLのAndroidベクターリソースを参照していますか?

ある

MapIconImage.Source = Device.OnPlatform(
      iOS: ImageSource.FromFile("Icons/location_pin.png"), 
      Android: ImageSource.FromFile("location_pin.xml"), 
      WinPhone: ImageSource.FromFile("Icons/location_pin.png")); 

。しかし、これはより良いIMOです。

Xamarin-PCL内でAndroidベクターリソースを参照できる方法はありますか?

+0

あなたはそれが不可能だと思いますか?一般的にマップや画像について具体的に話していますか? –

+0

私は最近、ラジオボタンのベクトルソースに関する質問に答えました。そのため、Androidの画像にベクターxmlを割り当てることができます。カスタムレンダラーが必要かもしれません(または:-)) –

+0

@YuriSマップとは関係ありません。 imagebuttonのアイコン。 –

答えて

1

シンプルなボタンカスタムレンダラーを使用して行うことができます。

ページ:

public class VectorImageSourceAndroidPage : ContentPage 
{ 
    public VectorImageSourceAndroidPage() 
    { 

     Content = new StackLayout 
     { 
      Children = { 
       new VectorImageButton() { 
        HorizontalOptions=LayoutOptions.CenterAndExpand, 
        VerticalOptions=LayoutOptions.CenterAndExpand, 
        WidthRequest=70, 
        HeightRequest=70, 
        BackgroundColor=Color.Blue, 

        Source = Device.OnPlatform(
         iOS: "", 
         Android: "woman", 
         WinPhone: "") 
       } 
      } 
     }; 
    } 
} 

public class VectorImageButton : Button 
{ 
    public string Source { get; set; } 
} 

レンダラ:描画可能なフォルダ内の

[assembly: ExportRenderer(typeof(VectorImageButton), typeof(VectorImageRenderer))] 
namespace ButtonRendererDemo.Droid 
{ 
    public class VectorImageRenderer : ButtonRenderer 
    { 
     protected override void OnElementChanged(ElementChangedEventArgs<Xamarin.Forms.Button> e) 
     { 
      base.OnElementChanged(e); 

      if (e.NewElement != null) 
      { 
       var button = (VectorImageButton)e.NewElement; 
       var resourceId = (int)typeof(Resource.Drawable).GetField(button.Source).GetValue(null); 

       Control.Background = Context.GetDrawable(resourceId); 
      } 
     } 
    } 
} 

リソース:

woman.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item> 
    <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" 
      android:id="@+id/shapeBg"> 
     <solid android:color="#ff69b4"/> 
     <size android:width="70dp" android:height="70dp"/> 
    </shape> 
    </item> 
    <item android:drawable="@drawable/woman_path"/> 
</layer-list> 

woman_path.xml

<?xml version="1.0" encoding="UTF-8" ?> 
<vector xmlns:android="http://schemas.android.com/apk/res/android" 
    android:width="70dp" 
    android:height="70dp" 
    android:viewportWidth="70" 
    android:viewportHeight="70"> 
    <path 
     android:fillColor="#ffffff" 
     android:pathData="M43 45l-6 0 0 -5c6,-1 11,-6 11,-13 0,-7 -6,-13 -13,-13 -7,0 -13,6 -13,13 0,7 
5,12 11,13l0 5 -6 0c-2,0 -2,3 0,3l6 0 0 6c0,2 4,2 4,0l0 -6 6 0c2,0 2,-3 
0,-3zm-18 -18c0,-5 5,-10 10,-10 5,0 10,5 10,10 0,5 -5,10 -10,10 -5,0 -10,-5 
-10,-10z" /> 
</vector> 

enter image description here

0

私は似た何かを検索し、プラットフォーム固有のImageRendererを用いて、溶液に来ました。 ImageRendererはAndroid向けに作成することができるため、ベクター描画可能オブジェクトを使用することができます。

namespace MyApp 
{ 
    public class VectorImage : Image 
    { 
     public string ImageSource { get; set; } 
    } 
} 

を、対応するXAMLの場合::このために、あなたの共有の形で最初に作成するプロジェクト

[assembly: ExportRenderer(typeof(VectorImage), typeof(VectorImageRenderer))] 
namespace MyApp.Droid 
{ 
    public class VectorImageRenderer : ImageRenderer 
    { 
     protected override bool DrawChild(Canvas canvas, global::Android.Views.View child, long drawingTime) 
     { 
      var imageSource = ((VectorImage) Element).ImageSource; 
      var vectorDrawable = Context.Resources.GetDrawable(imageSource); 
      vectorDrawable.SetBounds(0, 0, Width, Height); 
      vectorDrawable.Draw(canvas); 
      return base.DrawChild(canvas, child, drawingTime); 
     } 
    } 
} 

<myApp:VectorImage ImageSource="location_pin" Aspect="AspectFill" WidthRequest="50" HeightRequest="50" /> 

は、その後、あなたのAndroidプロジェクト内の特定の(ベクトル)ImageRendererを追加行ってもいいですね。

関連する問題