android - 总是从 Picasso 的占位符淡入

标签 android fadein picasso

我仍然不知道这是错误报告还是功能请求,所以请耐心等待。

我正在使用 Picasso我注意到示例应用程序总是从 上一张图片 淡入(请参阅 here 了解我的意思的演示)。但是,我希望它始终从给定的 placeholder 淡入。

我对这种行为的猜测是网格的 View 被回收并且 picasso 在淡入实际图像之前没有设置占位符。

这是故意的吗?我怎样才能始终从占位符淡入?

最佳答案

Picasso 在特定情况下支持一些淡入淡出动画。但是,它对我不起作用,因为我使用的是带有 picasso 的自定义目标,它允许我设置可绘制的背景。

我复制了 PicassocDrawable,它有一个漂亮的淡入淡出动画并添加了公共(public)构造函数。

/* 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) {}
});

关于android - 总是从 Picasso 的占位符淡入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22098413/

相关文章:

javascript - jQuery fadeIn 和 fadeOut 占用 50% 的处理器

android - picasso ,图像加载和调整大小

java - 如何监听 picasso (Android)加载完成事件?

Android picasso,报错原因

android无法打开下载的文件

android - 如何在android中读取新消息的消息内容?

javascript - jquery 在执行 .hide() 和 .fadeIn() 方法之前闪烁 Div 元素

android - 如何在 Android 中的非 UI 线程上执行延迟

java - 广播接收器检查时间根本不起作用

javascript - 目标特定容器在循环中的 Javascript 中关闭