2014-02-28 61 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