2014-02-28 59 views
9

我還不知道這是一個錯誤報告還是功能請求,請耐心等待。永遠從佔位符淡入畢加索

我使用Picasso,我注意到示例應用程序始終從previous image(請參閱here瞭解我的意思)演示中淡入。但是,我希望它總是從給定的placeholder中淡入。

我對這種行爲的猜測是網格的視圖被回收,畢加索在淡入到實際圖像之前沒有設置佔位符。

這是故意的嗎?我將如何總能從佔位符淡入?

+0

I + 1-ED抗衡的原因不明-1。 –

+1

什麼版本的畢加索? –

+0

我正在使用2.2.1版本。實際上,爲了增加對圓形繪圖的支持(使用Romain Guy的技術),我分出了原始項目,但這個「問題」是在標準的PicassoDrawable實現中發生的。 – Sebastiano

回答

-1
Picasso.with(this).load(image URL) 
.placeholder(place_holder_bitmap).error(place_holder_bitmap) 
.resize(call resize method here to pass new pixels constraint, getPixels(30)) 
.transform(transformation).into(imageView); 

這裏轉換是應用於圓形圖像視圖在我的情況下,忽略這部分代碼,如果不重要的項目。

2

畢加索支持一些特定情況下的淡出動畫。但是,它並不適合我,因爲我使用帶有picasso的自定義目標,它允許我設置可繪製的背景。

我已經複製了PicassocDrawable,它有一個很好的淡入淡出動畫並添加了公共構造函數。

/* Copyright (C) 2013 Square, Inc. 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 

package com.example.app; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.ColorFilter; 
import android.graphics.Paint; 
import android.graphics.Rect; 
import android.graphics.drawable.AnimationDrawable; 
import android.graphics.drawable.BitmapDrawable; 
import android.graphics.drawable.Drawable; 
import android.os.Build; 
import android.os.SystemClock; 
import android.widget.ImageView; 

/** 
* Changelog : 
* - Modified from Picasso 2.5.0 to allow public instantiation 
*/ 
public class CustomPicassoDrawable extends BitmapDrawable{ 
    // Only accessed from main thread. 
    private static final Paint DEBUG_PAINT = new Paint(); 
    private static final float FADE_DURATION = 200f; //ms 

    /** 
    * Create or update the drawable on the target {@link android.widget.ImageView} to display the supplied bitmap 
    * image. 
    */ 
    static void setBitmap(ImageView target, Context context, Bitmap bitmap) { 
     Drawable placeholder = target.getDrawable(); 
     if (placeholder instanceof AnimationDrawable) { 
      ((AnimationDrawable) placeholder).stop(); 
     } 
     CustomPicassoDrawable drawable = 
       new CustomPicassoDrawable(context, bitmap, placeholder); 
     target.setImageDrawable(drawable); 
    } 

    /** 
    * Create or update the drawable on the target {@link ImageView} to display the supplied 
    * placeholder image. 
    */ 
    static void setPlaceholder(ImageView target, Drawable placeholderDrawable) { 
     target.setImageDrawable(placeholderDrawable); 
     if (target.getDrawable() instanceof AnimationDrawable) { 
      ((AnimationDrawable) target.getDrawable()).start(); 
     } 
    } 

    private final float density; 

    Drawable placeholder; 

    long startTimeMillis; 
    boolean animating; 
    int alpha = 0xFF; 

    public CustomPicassoDrawable(Context context, Bitmap bitmap, Drawable placeholder) { 
     super(context.getResources(), bitmap); 

     this.density = context.getResources().getDisplayMetrics().density; 

     this.placeholder = placeholder; 
     animating = true; 
     startTimeMillis = SystemClock.uptimeMillis(); 
    } 

    @Override public void draw(Canvas canvas) { 
     if (!animating) { 
      super.draw(canvas); 
     } else { 
      float normalized = (SystemClock.uptimeMillis() - startTimeMillis)/FADE_DURATION; 
      if (normalized >= 1f) { 
       animating = false; 
       placeholder = null; 
       super.draw(canvas); 
      } else { 
       if (placeholder != null) { 
        placeholder.draw(canvas); 
       } 

       int partialAlpha = (int) (alpha * normalized); 
       super.setAlpha(partialAlpha); 
       super.draw(canvas); 
       super.setAlpha(alpha); 
       if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) { 
        invalidateSelf(); 
       } 
      } 
     } 
    } 

    @Override public void setAlpha(int alpha) { 
     this.alpha = alpha; 
     if (placeholder != null) { 
      placeholder.setAlpha(alpha); 
     } 
     super.setAlpha(alpha); 
    } 

    @Override public void setColorFilter(ColorFilter cf) { 
     if (placeholder != null) { 
      placeholder.setColorFilter(cf); 
     } 
     super.setColorFilter(cf); 
    } 

    @Override protected void onBoundsChange(Rect bounds) { 
     if (placeholder != null) { 
      placeholder.setBounds(bounds); 
     } 
     super.onBoundsChange(bounds); 
    } 
} 

你可以用它與

Picasso 
.with(this) 
.load("http://yourimage") 
.into(new Target() { 
    @Override 
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { 
     CustomPicassoDrawable drawable = new CustomPicassoDrawable(
       FullscreenActivity.this, bitmap, myBackground); 
     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) { 
      myView.setBackground(drawable); 
     } else { 
      myView.setBackgroundDrawable(drawable); 
     } 
    } 

    @Override 
    public void onBitmapFailed(Drawable errorDrawable) {} 

    @Override 
    public void onPrepareLoad(Drawable placeHolderDrawable) {} 
}); 
+0

ViewUtils.setBackground(mNativeVideoLayout,drawable); 什麼是ViewUtils和mNativeVideoLayout – Android