3

我正在尝试使用 sd 卡中的图像并将其设置为相对布局的背景。我已经尝试过在这里和其他地方找到的其他解决方案,但它们似乎对我不起作用。这是我的代码。我已经评论了我尝试过但没有奏效的其他方法。唯一对我有用的是使用 setBackgroudnResource 并使用应用程序中的资源,但这只是为了测试以确保 mRoot 设置正确。当我尝试了所有其他方式时,它只是没有设置任何东西。任何人都知道我做错了什么,或者是否有更好的方法来做到这一点?

        //one way i tired...
//String extDir = Environment.getExternalStorageDirectory().toString();
//Drawable d = Drawable.createFromPath(extDir + "/pic.png");
//mRoot.setBackgroundDrawable(d);

//another way tried..
//Drawable d = Drawable.createFromPath("/sdcard/pic.png");
//mRoot.setBackgroundDrawable(d);

//last way i tried...
mRoot.setBackgroundDrawable(Drawable.createFromPath(new File(Environment.getExternalStorageDirectory(), "pic.png").getAbsolutePath()));

//worked, only to verify mRoot was setup correctly and it could be changed
//mRoot.setBackgroundResource(R.drawable.bkg);
4

3 回答 3

10

您不会从 SD 卡加载可绘制对象,而是加载位图。这是一种以减少采样(质量)加载它的方法,因此如果图像太大,程序不会抱怨。然后我猜你需要处理这个位图,即裁剪它并调整背景大小。

         // Read bitmap from Uri
     public Bitmap readBitmap(Uri selectedImage) {
         Bitmap bm = null;
         BitmapFactory.Options options = new BitmapFactory.Options();
         options.inSampleSize = 2; //reduce quality 
         AssetFileDescriptor fileDescriptor =null;
         try {
             fileDescriptor = this.getContentResolver().openAssetFileDescriptor(selectedImage,"r");
         } catch (FileNotFoundException e) {
             e.printStackTrace();
         }
         finally{
             try {
                 bm = BitmapFactory.decodeFileDescriptor(fileDescriptor.getFileDescriptor(), null, options);
                 fileDescriptor.close();
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
         return bm;
     }

这里的 Uri 可以从画廊选择器活动中提供。

然后可以将图像保存到应用程序资源中并加载到 imageView

        private void saveBackground(Bitmap Background) {
        String strBackgroundFilename = "background_custom.jpg";
        try {
            Background.compress(CompressFormat.JPEG, 80, openFileOutput(strBackgroundFilename, MODE_PRIVATE));
        } catch (Exception e) {
            Log.e(DEBUG_TAG, "Background compression and save failed.", e);
        }

        Uri imageUriToSaveCameraImageTo = Uri.fromFile(new File(BackgroundSettings.this.getFilesDir(), strBackgroundFilename));

        // Load this image
        Bitmap bitmapImage = BitmapFactory.decodeFile(imageUriToSaveCameraImageTo.getPath());
        Drawable bgrImage = new BitmapDrawable(bitmapImage);

        //show it in a view
        ImageView backgroundView = (ImageView) findViewById(R.id.BackgroundImageView);
        backgroundView.setImageURI(null); 
        backgroundView.setImageDrawable(bgrImage);
    }
于 2011-01-23T00:03:41.830 回答
5
File file = new File( url.getAbsolutePath(), imageUrl);

                if (file.exists()) {

                    mDrawable = Drawable.createFromPath(file.getAbsolutePath());

                }
于 2012-06-19T16:44:06.387 回答
0

我建议检查drawable是否正确加载。一些事情要尝试:

  • 尝试在 sd 卡上使用不同的图像
  • 将 pic.png 放入 R.drawable 并确保 mRoot.setBackgroundResource() 符合您的预期
  • 加载可绘制对象后,检查 d.getBounds() 以确保它是您所期望的
于 2011-01-22T22:10:43.360 回答