Wednesday, October 17, 2012

How to bind an Android ImageView to an image loaded from Monodroid Assets

From StackOverflow 

Quick answer:

  • if your Android image file is stored in assets/images/i1.png
  • then make sure it is marked as an AndroidAsset
  • then your path needs to be images/i1.png

Longer answer:

Ideally your ViewModel should be platform independent and not know about View concerns.

So your ViewModel might perhaps expose a property like:

 private GameState _state;
 
public GameState State
 
{
     get
{ return _state; }
     set
{ _state = value; RaisePropertyChanged(() => State); }
 
}

where GameState is an enumeration like:

 public enum GameState
 
{
     
Stopped,
     
Running,
     
Paused,
     
GameOver
 
}

you might then have images representing these states in an assets structure like:

/assets/gamestates/stopped.png
/assets/gamestates/running.png
/assets/gamestates/paused.png
/assets/gamestates/gameover.png

where each of those files is marked with BuildAction of AndroidAsset.

To then display the correct image in the UI, you would need a value converter like:

public class GameStateConverter
   
: MvxBaseValueConverter
{
   
public override object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
   
{
       
return string.Format("gamestates/{0}.png", ((GameState)value).ToString().ToLower());
   
}
}

mapped in using a Converters wrapper like:

public class Converters
{
   
public readonly GameStateConverter GameState = new GameStateConverter();
}

which is configured in setup.cs using:

    protected override IEnumerable<Type> ValueConverterHolders
   
{
        get
{ return new[] { typeof(Converters) }; }
   
}

With this in place, then your axml binding statement would be:

    {'AssetImagePath':{'Path':'State', 'Converter':'GameState'}}

For an alternative approach using resources instead of assets, see MvxButtonIconBinding in Іssue with binding to GridLayout to Android

No comments:

Post a Comment