2016-03-29 10 views
2

私はグライドを使ってScale ImageViewに画像をロードしています。これは、パンとズームのジェスチャーを含むカスタムビューです。画像を設定するには、このカスタムビューにBitmapオブジェクトを渡す必要があります。Android Glide:特定のサイズでビットマップをダウンロードするにはどうすればよいですか?

だから私はグライドの.asBitmap()SimpleTargetとを使用することができます。

private SimpleTarget target = new SimpleTarget<Bitmap>() { 
    @Override 
    public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) { 
     scaleImageView.setImage(ImageSource.bitmap(bitmap)); 
    } 
}; 

private void loadImageSimpleTarget() { 
    Glide 
     .with(context) 
     .load(url) 
     .asBitmap() 
     .into(target); 
} 

このコードスニペットはうまく動作しますが、私はOutOfMemoryErrorsにつながることができますフルサイズのビットマップを取得します。また、コンストラクタで希望するBitmapサイズを...new SimpleTarget<Bitmap>(250, 250)...のように指定することもできますが、寸法を手動で計算する必要があります。

ビュー(CustomViewのインスタンス)をGlideの要求に渡す可能性があるため、寸法は自動的に計算され、その結果としてBitmapオブジェクトを受け取りますか?

+0

あなたがのCustomViewの寸法を使用したいですか? – leonziyo

+0

@leonziyoはい、CustomViewのサイズで画像をロードします。私は 'match_parent'と一緒に使用するので、特定の次元を持ちます。 – Ruslan

+0

なぜSimpleTargetのコンストラクタに次元を渡さないのですか?このように、 'new SimpleTarget (customView.getWidth()、customView.getHeight())' ... – leonziyo

答えて

1

コメントから議論を続けると、onCreateViewから呼び出すときに幅と高さが0になります。ただし、ビューの境界が実際に計算され、その後、あなたがgetWidthgetHeightを呼び出すことで、実際の幅と高さを得ることができたときに通知するようにリスナーを設定することができます。

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    // ... 
    // your other stuff 
    // ... 

    // set listener 
    customView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      Log.d("debug", "width after = " + customView.getHeight()); 

      // pass the width and height now that it is available 
      target = new SimpleTarget<Bitmap>(customView.getWidth(), customView.getHeight()) { 
       @Override 
       public void onResourceReady(Bitmap bitmap, GlideAnimation glideAnimation) { 
        scaleImageView.setImage(ImageSource.bitmap(bitmap)); 
       } 
      }; 

      // remove listener, we don't need to be notified again. 
      customView.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
     } 
    }); 
} 
+0

ありがとう、それは働いた! – Ruslan

関連する問題