在自定义的ImageView后面绘制矩形不会产生动画效果。

4

我需要一个自定义的ImageView,在绘制图像之前绘制一些形状,并使用与实际位图本身相同的“缩放”来绘制图像本身。 一切正常,除了我有一个AlphaAnimation来淡入自定义ImageView。 它淡化了BitmapDrawable部分,但不是我的形状。 形状始终以完全不透明的方式绘制。 我尝试将正在使用的画笔的alpha设置为视图的getAlpha,但没有成功。 这是我自定义ImageView类中的onDraw函数:

@Override
protected void onDraw(Canvas canvas) {
    float[] f = new float[9];
    getImageMatrix().getValues(f);

    final float scaleX = f[Matrix.MSCALE_X];
    final float scaleY = f[Matrix.MSCALE_Y];

    final Drawable d = getDrawable();
    final int origW = d.getIntrinsicWidth();
    final int origH = d.getIntrinsicHeight();

    final int actW = Math.round(origW * scaleX);
    final int actH = Math.round(origH * scaleY);

    canvas.drawRect(Math.max((getWidth() - actW) / 2, 0) + 1, Math.max((getHeight() - actH) / 2, 0) + 1, Math.max((getWidth() - actW) / 2, 0) + actW - 1, Math.max((getHeight() - actH) / 2, 0) + actH - 1, paint);
    super.onDraw(canvas);
}

最终的Drawable d = getDrawable(); d.setAlpha(1); 适用于您的形状可绘制对象。 - Illegal Argument
这不会产生任何变化。我发现onDraw()仅在动画的第一帧中被调用,而不是每一帧都被调用。 - Mitch Dart
2个回答

1
快速解决您的问题的方法是将自定义视图添加到某种视图容器中,然后只需对容器进行动画处理。

这是一个简单的方法,可以让它正常运行,谢谢。 - Mitch Dart

0

这是源代码,版本号为5.0.0_r1,imageView的onDraw方法。

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    if (mDrawable == null) {
        return; // couldn't resolve the URI
    }

    if (mDrawableWidth == 0 || mDrawableHeight == 0) {
        return;     // nothing to draw (empty bounds)
    }

    if (mDrawMatrix == null && mPaddingTop == 0 && mPaddingLeft == 0) {
        mDrawable.draw(canvas);
    } else {
        int saveCount = canvas.getSaveCount();
        canvas.save();

        if (mCropToPadding) {
            final int scrollX = mScrollX;
            final int scrollY = mScrollY;
            canvas.clipRect(scrollX + mPaddingLeft, scrollY + mPaddingTop,
                    scrollX + mRight - mLeft - mPaddingRight,
                    scrollY + mBottom - mTop - mPaddingBottom);
        }

        canvas.translate(mPaddingLeft, mPaddingTop);

        if (mDrawMatrix != null) {
            canvas.concat(mDrawMatrix);
        }
        mDrawable.draw(canvas);
        canvas.restoreToCount(saveCount);
    }
}

正如您所看到的,这里没有使用Paint,所以我猜这就是您的问题。尝试创建新的Paint并将其alpha设置为Drawable.getAlpha()

由于Drawable.getAlpha()需要API 19,因此您可以像这样将其包装在自己的Drawable中:

class MyDrawable extends Drawable {

    final Drawable originalDrawable;
    private int mAlpha = 1;

    @Override
    public int getAlpha() {
        return mAlpha;
    }

    public MyDrawable(Drawable drawable){
        originalDrawable = drawable;
    }

    @Override
    public void draw(Canvas canvas) {
        originalDrawable.draw(canvas);
    }

    @Override
    public void setAlpha(int alpha) {
        mAlpha = alpha;
        originalDrawable.setAlpha(alpha);
    }

    @Override
    public void setColorFilter(ColorFilter cf) {
        originalDrawable.setColorFilter(cf);
    }

    @Override
    public int getOpacity() {
        return originalDrawable.getOpacity();
    }
}

在发布问题之前,我已经仔细查看了Android代码。在我的问题中,我确实说过我尝试设置画笔的alpha值为getAlpha(),但是没有成功。getDrawable().getAlpha()需要minSDK 19,所以也不能使用它。 - Mitch Dart
谢谢您的尝试,但很遗憾它没有任何作用。我甚至尝试提高我的最小SDK版本来测试并使用getDrawable().getAlpha()。仍然无法淡化形状,只有可绘制对象。 - Mitch Dart
我猜测AlphaAnimation实际上并没有设置alpha属性。我甚至尝试使用ViewPropertyAnimator。 - Mitch Dart
@MitchDart 哈哈,这超出了问题的范围 ;) - Ilya Gazman
我发现在整个动画过程中,onDraw方法只被调用了一次。这就是为什么我会遇到这个问题的原因。 - Mitch Dart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接