在自定义 ImageView 后面绘制一个矩形而不是动画
Drawing a rectangle behind custom ImageView not animating
我需要一个自定义图像视图,它首先在图像后面绘制一些形状,然后使用应用于实际位图本身的相同 "Scaling" 绘制图像本身。一切都很好,除了我有一个 AlphaAnimation 来淡化自定义 ImageView。它淡化了 BitmapDrawable 部分但不是我的形状。 Shape 始终以完全不透明的方式绘制。我尝试将我正在使用的油漆的 alpha 设置为视图的 getAlpha,但没有成功。这是我自定义 ImageView 中的 onDraw 函数 class:
@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);
}
这是imageView
的onDraw方法的source code,版本:5.0.0_r1
@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();
}
}
快速解决您的问题的方法是将自定义视图添加到某种视图容器中,然后只为容器设置动画。
我需要一个自定义图像视图,它首先在图像后面绘制一些形状,然后使用应用于实际位图本身的相同 "Scaling" 绘制图像本身。一切都很好,除了我有一个 AlphaAnimation 来淡化自定义 ImageView。它淡化了 BitmapDrawable 部分但不是我的形状。 Shape 始终以完全不透明的方式绘制。我尝试将我正在使用的油漆的 alpha 设置为视图的 getAlpha,但没有成功。这是我自定义 ImageView 中的 onDraw 函数 class:
@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);
}
这是imageView
的onDraw方法的source code,版本:5.0.0_r1@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();
}
}
快速解决您的问题的方法是将自定义视图添加到某种视图容器中,然后只为容器设置动画。