【问题标题】:Create drawable from bitmap从位图创建drawable
【发布时间】:2014-05-29 06:57:12
【问题描述】:

所有,

正如here 建议的那样,我需要用我的位图制作一个drawable。但是当我尝试使用时:

 Drawable d = new Drawable( my_bmp);

它表明这个构造函数被弃用了:

 Drawable(Bitmap bmp, int resourceId)

我还能如何用位图制作可绘制对象?

谢谢。

【问题讨论】:

  • 你可以试试这个Drawable d=new BitmapDrawable(res, bmp); 吗?
  • @SimplePlan,正如我在原始线程中所写,位图来自云端,而不是资源。
  • 那么你必须从云端下载该图像,然后加载为 Drawable。
  • @SimplePlan,是的,图像被加载为位图。问题是 - 转换为 Drawable。能给点代码吗?
  • 好的,等一下我的答案。

标签: android bitmap drawable


【解决方案1】:

如果 Mauro Banze 迟到了,那我真的不知道我还在这里做什么。但是对于那些拼命寻找解决方案的人来说,这就是我所做的:

在将项目从 JavaFX 带到 Android 时,我偶然发现了同样的问题。我想重用我的大部分“数据”类,它们只管理和提供我的数据,对 UI 没有影响。

故事讲得够多了,我们开始吧:

问题:

  • 有时我们需要Drawable来在屏幕上显示位图。
  • 我们想下载(从云、互联网或其他任何地方)此位图并将其保存为Drawable 以供以后使用
  • 我们不能在非Context 或非Activity 类中这样做,因为我们需要Resources

那么为什么我们不把它保存为Bitmap 直到我们需要它被绘制(这肯定会发生在ContextActivity 类中)。

我创建了一个名为BitmapImage 的类。它看起来像这样:

public class BitmapImage {

private final Bitmap bitmap;

public BitmapImage (Bitmap bitmap) {
    this.bitmap = bitmap;
}


public Bitmap getBitmap() {
    return bitmap;
}

public Drawable getDrawable(Resources res) {
    return new BitmapDrawable(res,getBitmap());
}

这个非常简单的类“保存”了位图。因此,与其使用Drawable,不如使用BitmapImage,直到您真正迫切需要Drawable

此时,您应该在您的ActivityContext 中,您可以在那里拨打Drawable foo = anyBitmapImage.getDrawable(getResource())

【讨论】:

    【解决方案2】:

    聚会有点晚了,但我看到了明显的误解。提供的答案确实正确:

    Drawable d = new BitmapDrawable(getResources(),bitmap);
    

    在这种情况下getResources()ContextActivity中可用的方法,仅用于找出屏幕密度并相应地调整Drawable。

    所以伊戈尔,即使你是从云端加载图像,你仍然可以调用 getResources()。

    愉快的编码

    【讨论】:

      【解决方案3】:

      尝试将Bitmap 加载为Bitmap Drawable

      如下创建ImgDrawableFromFile(Resources res, String file_name)

      Drawable d = null;
      
          public Drawable ImgDrawableFromFile(Resources res, String file_name) {
      
              myBitmap = null;
              File imgFile = new File(
                      "/data/data/yourpkgname/app_my_sub_dir/images/" + file_name);
              if (imgFile.exists()) {
      
                  myBitmap = BitmapFactory.decodeFile(imgFile.getAbsolutePath());
      
                  if (myBitmap != null) {
                      d = new BitmapDrawable(res, myBitmap);
                      return d;
                  } else {
                      return null;
                  }
              }
              return null;
      
          }
      

      现在像这样调用这个函数

      img.setBackgroundDrawable(ImgDrawableFromFile(getResources(), "1.jpg")); // pass your saved file name as second argument 
      

      【讨论】:

        【解决方案4】:

        BitmapDrawable(Bitmap bitmap)构造函数一直是deprecated

        你可以使用

        Drawable drawable = new BitmapDrawable(getResources(), bitmap);
        

        source

        【讨论】:

        • @Igor 从云端获取 bitmpa:Bitmap bitmap = BitmapFactory.decodeStream(new URL(url).openConnection().getInputStream());
        【解决方案5】:

        您可以使用 BitmapDrawable 类从位图中获取 Drawable

        Bitmap Drawable参考

        【讨论】:

        • 好吧,我不能。我没有使用资源,位图(照片)来自云端。
        【解决方案6】:

        你可以使用

        Drawable d = new BitmapDrawable(getResources(), my_bmp);
        

        包装位图并且可以平铺、拉伸或 对齐。您可以从文件路径创建 BitmapDrawable,输入 流,通过 XML 膨胀,或来自 Bitmap 对象。

        BitmapDrawable(Resources res, Bitmap bitmap)

        从位图创建可绘制对象,根据设置初始目标密度 资源的显示指标。

        也看一下公共构造函数@

        http://developer.android.com/reference/android/graphics/drawable/BitmapDrawable.html

        【讨论】:

        • 你的回答告诉我你没有看原帖。 ;-) 我没有从资源中加载我的位图。我从云中获取位图作为照片。因此我不能在该代码中使用资源引用。还有其他想法吗?
        • @Igor 你从来没有在你的帖子中提到过。这不是我的错。
        • 然而,我做了,引用了一个指向我原来的问题的链接,其中提到了这个要求。就像我说的 - 你没有看。 ;-)
        • @Igor 你本可以在你的帖子中提到这一点。你也不要发布到外部资源的链接不好,因为没有多少会看起来一样:)
        • @Igor 你有没有查看我发布的链接?先下载位图然后用BitmapDrawable(Resources res, String filepath)filepath就是位图的路径
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-16
        • 2011-08-19
        • 2011-08-05
        • 1970-01-01
        • 1970-01-01
        • 2012-01-11
        相关资源
        最近更新 更多