2017-10-23 14 views
0

私はAndroid TVアプリを製作しています。 Picassoを使用して、BackgroundManagerドロアブルにURLから画像を読み込みたいとします。Picasaを使用してBackgroundManagerドロワブルに読み込む方法

Glide.with(getActivity()) 
    .load(uri) 
    .centerCrop() 
    .error(mDefaultBackground) 
    .into(new SimpleTarget<GlideDrawable>(width, height) { 
     @Override 
     public void onResourceReady(GlideDrawable resource, 
      GlideAnimation<? super GlideDrawable> glideAnimation) { 
      mBackgroundManager.setDrawable(resource); 
     } 
    }); 

私はピカソを使用して同じことをどのように行うのです:グライドで

は、それが次のコードを使用して行われていますか?

+0

どれソリューションをまだ下のこのスニペットを使用します? –

答えて

4

ここに解決策が見つかりました。

public class PicassoBackgroundManager { 

    private static final String TAG = PicassoBackgroundManager.class.getSimpleName(); 

    private static int BACKGROUND_UPDATE_DELAY = 500; 
    private final int DEFAULT_BACKGROUND_RES_ID = R.drawable.default_background; 
    private static Drawable mDefaultBackground; 
    // Handler attached with main thread 
    private final Handler mHandler = new Handler(Looper.getMainLooper()); 

    private Activity mActivity; 
    private BackgroundManager mBackgroundManager = null; 
    private DisplayMetrics mMetrics; 
    private URI mBackgroundURI; 
    private PicassoBackgroundManagerTarget mBackgroundTarget; 

    Timer mBackgroundTimer; // null when no UpdateBackgroundTask is running. 

    public PicassoBackgroundManager (Activity activity) { 
     mActivity = activity; 
     mDefaultBackground = activity.getDrawable(DEFAULT_BACKGROUND_RES_ID); 
     mBackgroundManager = BackgroundManager.getInstance(activity); 
     mBackgroundManager.attach(activity.getWindow()); 
     mBackgroundTarget = new PicassoBackgroundManagerTarget(mBackgroundManager); 
     mMetrics = new DisplayMetrics(); 
     activity.getWindowManager().getDefaultDisplay().getMetrics(mMetrics); 

    } 

    /** 
    * if UpdateBackgroundTask is already running, cancel this task and start new task. 
    */ 
    private void startBackgroundTimer() { 
     if (mBackgroundTimer != null) { 
      mBackgroundTimer.cancel(); 
     } 
     mBackgroundTimer = new Timer(); 
     /* set delay time to reduce too much background image loading process */ 
     mBackgroundTimer.schedule(new UpdateBackgroundTask(), BACKGROUND_UPDATE_DELAY); 
    } 


    private class UpdateBackgroundTask extends TimerTask { 
     @Override 
     public void run() { 
      /* Here is TimerTask thread, not UI thread */ 
      mHandler.post(new Runnable() { 
       @Override 
       public void run() { 
        /* Here is main (UI) thread */ 
        if (mBackgroundURI != null) { 
         updateBackground(mBackgroundURI); 
        } 
       } 
      }); 
     } 
    } 

    public void updateBackgroundWithDelay(String url) { 
     try { 
      URI uri = new URI(url); 
      updateBackgroundWithDelay(uri); 
     } catch (URISyntaxException e) { 
      /* skip updating background */ 
      Log.e(TAG, e.toString()); 
     } 
    } 

    /** 
    * updateBackground with delay 
    * delay time is measured in other Timer task thread. 
    * @param uri 
    */ 
    public void updateBackgroundWithDelay(URI uri) { 
     mBackgroundURI = uri; 
     startBackgroundTimer(); 
    } 

    private void updateBackground(URI uri) { 
     try { 
      Picasso.with(mActivity) 
        .load(uri.toString()) 
        .resize(mMetrics.widthPixels, mMetrics.heightPixels) 
        .centerCrop() 
        .error(mDefaultBackground) 
        .into(mBackgroundTarget); 
     } catch (Exception e) { 
      Log.e(TAG, e.toString()); 
     } 
    } 

    /** 
    * Copied from AOSP sample code. 
    * Inner class 
    * Picasso target for updating default_background images 
    */ 
    public class PicassoBackgroundManagerTarget implements Target { 
     BackgroundManager mBackgroundManager; 

     public PicassoBackgroundManagerTarget(BackgroundManager backgroundManager) { 
      this.mBackgroundManager = backgroundManager; 
     } 

     @Override 
     public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom loadedFrom) { 
      this.mBackgroundManager.setBitmap(bitmap); 
     } 

     @Override 
     public void onBitmapFailed(Drawable drawable) { 
      this.mBackgroundManager.setDrawable(drawable); 
     } 

     @Override 
     public void onPrepareLoad(Drawable drawable) { 
      // Do nothing, default_background manager has its own transitions 
     } 

     @Override 
     public boolean equals(Object o) { 
      if (this == o) 
       return true; 
      if (o == null || getClass() != o.getClass()) 
       return false; 

      PicassoBackgroundManagerTarget that = (PicassoBackgroundManagerTarget) o; 

      if (!mBackgroundManager.equals(that.mBackgroundManager)) 
       return false; 

      return true; 
     } 

     @Override 
     public int hashCode() { 
      return mBackgroundManager.hashCode(); 
     } 
    } 

} 

その後、あなたの活動やその断片に

PicassoBackgroundManager picassoBackgroundManager = new PicassoBackgroundManager(getActivity()); 
picassoBackgroundManager.updateBackgroundWithDelay("some.image.url"); 
関連する問題