1

我尝试实现我自己的drawable,它将从一个简单的彩色矩形(应该与drawable所在的ImageView具有相同的大小)到加载的位图(通过http)。

所以我要做的是覆盖我的 Drawable 的 draw() 方法:

public void draw(Canvas canvas) {
        boolean done = true;

        Log.d("Test",
                "canvas w: " + canvas.getWidth() + " " + canvas.getHeight());


        final int alpha = mAlpha;
        final boolean crossFade = mCrossFade;

        Paint paint = mStartPaint;
        paint.setColor(blueColor);

        if (!crossFade || 255 - alpha > 0) {
            if (crossFade) {
                paint.setAlpha(255 - alpha);
            }

            // Draw the rect with the color
            canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), paint);

            if (crossFade) {
                paint.setAlpha(0xFF);
            }

        }

        if (alpha > 0) {
            Bitmap bitmap = mEnd;
            paint = mEndPaint;
            paint.setAlpha(alpha);
            if (mBitmapScalingType == null)
                canvas.drawBitmap(bitmap, mEndX, mEndY, paint);
            else
                mBitmapScalingType.draw(bitmap, canvas.getWidth(),
                        canvas.getHeight(), canvas, paint);

            paint.setAlpha(0xFF);
        }

        if (!done) {
            mHandler.post(mInvalidater);
        }
    }

所以 canvas.getWidth() 和 canvas.getHeight() 返回 128(宽度)和 150(高度),这与 ImageView 相同。但结果是:

在此处输入图像描述

蓝色矩形尚未绘制在整个画布上,我不知道为什么。

显示我的可褪色可绘制对象的 ImageView 没有设置特定的比例类型。

有什么想法可能是错的吗?

我还注意到从 setBounds() 计算的宽度和高度是 180 x 212 px

@Override
public void setBounds(int left, int top, int right, int bottom) {
    super.setBounds(left, top, right, bottom);

    final int width = right - left;
    final int height = bottom - top;
            Log.d("Test", "width: "+width+" height: "+height);
     } 

如果我用 180 x 212 像素绘制颜色

canvas.drawRect(0, 0, 180, 212, paint);

现在绘制矩形以完全填充画布。

知道有什么问题吗?

顺便提一句。ImageView 是这样定义的:

<ImageView android:id="@+id/playerPic"
           android:layout_width="64dp"
           android:layout_height="75dp"           
           android:layout_marginRight="10dp"
           />

在 xhdpi 中 64dp = 128px 和 75dp = 150 px

4

2 回答 2

1

这个答案没有解释尺寸的差异,但有时以不同的方式做事更容易。

如果只想用颜色填充画布,则不需要使用drawRect(),只需使用drawColor()。有一个简单的版本,它只需要一个Color,还有一个可以让你指定一个 porter-duff 模式。这样你根本不需要尺寸,你可以避免整个事情。

于 2013-08-30T14:19:16.650 回答
-1

也许您可以尝试使用DisplayMetrics来获取尺寸。

    //Get the width and height of the screen
    DisplayMetrics d = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(d);
    int width  = d.widthPixels;
    int height = d.heightPixels;

然后用这些值调用drawrect

 canvas.drawRect(0, 0, width, height, paint);
于 2013-08-30T14:31:33.400 回答