在ImageView中返回BitmapDrawable

时间:2013-04-12 11:14:42

标签: android imageview mvvmcross

我正在MVVMCross中创建Android应用中的收藏夹汽车列表。我的问题是在该列表上动态加载图像。我的观点是每辆车的ImageView正在获取转换器拍摄的图片的ID并返回BitmapDrawable对象。它正在我的Windows Phone应用程序上工作,但在Android中我有一点问题。代码如下所示:

<LinearLayout
      android:id="@+id/PeoplePanel"
      android:orientation="horizontal"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:background="@color/transparent"
      android:layout_below="@id/TitleTextView"
      android:paddingTop="3dip"
      android:paddingLeft="10dip">
    <ImageView
        android:id="@+id/imagePhoto"
        android:layout_width="70dp"
        android:layout_height="70dp"
        local:MvxBind="{'ResourcesImagePath':{'Path':'Item.Obj.IDZdjeciaGlownego', 'Converter':'ByteToImg'}}"/>

和转换器是:

public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
            {
                var id = (int?)value;
                if (id != null)
                {
                    var Service = this.GetService<IKomisSamService>();
                    var img = Service.GetImage((int)id);
                    try
                    {                
                        var drawable = BitmapFactory.DecodeByteArray(img, 0, img.Length);
                        return new BitmapDrawable(drawable);
                    }
                    catch { }
                }
                return null;

..并输出:

04-12 11:13:06.034 I/MvxBind (  856): 135.42 Failed to create target binding for from Item.Obj.IDZdjeciaGlownego to ResourcesImagePath
MvxBind:Warning:135.42 Failed to create target binding for from Item.Obj.IDZdjeciaGlownego to ResourcesImagePath
04-12 11:13:06.034 I/mono-stdout(  856): MvxBind:Warning:135.42 Failed to create target binding for from Item.Obj.IDZdjeciaGlownego to ResourcesImagePath
04-12 11:13:06.644 D/dalvikvm(  856): GC_EXTERNAL_ALLOC freed 1850 objects / 93880 bytes in 48ms

转换器正在运行两次:首先是要求服务获取项目,下载时它是第二次运行以获取它并返回BitmapDrawable对象。

我认为我的问题是在MvxBind中,我不应该使用ResourcesImagePath,而是让BitmapDrawable对象不是他的路径。 提前谢谢!

1 个答案:

答案 0 :(得分:2)

一般来说:

  • MvvmCross中有'内置'绑定用于显示来自资产和ImageView内的资源的图像
  • MvxImageView使下载的图像显示非常简单 - 只需使用ImageUrl并确保已加载DownloadCache和File插件。
  • 在v3中,还有一个现成的绑定可用于在Byte[]内显示ImageView(这是在PictureChooser插件中)

但是,对于您想添加自己的绑定的一般情况,如果您愿意,可以自己执行此操作...

但是你不能仅仅通过发明ResourcesImagePath并使用值转换器来做到这一点。 ImageView没有ResourcesImagePath属性 - 因此在这种情况下,Mvx系统无需绑定。

相反:

  1. 您需要使用以下类定义绑定操作:https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Cirrious.MvvmCross.Binding.Droid/Target/MvxImageViewDrawableTargetBinding.cs

  2. 然后您需要(在Setup期间)告诉mvvmcross如何使用该绑定 - 例如比如第63行:https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Cirrious.MvvmCross.Binding.Droid/MvxAndroidBindingBuilder.cs#L63

  3. 执行此操作称为“创建自定义绑定”


    注意:我不完全确定'转换器运行了两次' - 不确定你的意思(听起来像是一个单独的问题)


    重要提示 - 为避免位图内存泄漏,请对动态加载的所有位图使用InPurgeable