-1

我创建了一个自定义视图(显示),它接受创建半静态(很少更改)位图的非视图图标。这个想法是将许多图标传递给显示以打印到其画布上。我的问题是我无法让显示器将图标位图实际绘制到其画布中。

下面的代码是我所拥有的一个工作示例。(通过工作,我的意思是正确执行,而不是打印我想要的内容)

public class AndroidTestoActivity extends Activity {
    @Override public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FrameLayout fl = new FrameLayout(this);
        Display tv = new Display(this); 
        tv.setLayoutParams(new LayoutParams(200, 200));
        fl.addView(tv);
        setContentView(fl);
    }

    public class Display extends View {
        Paint vPaint = new Paint();
        Icon item = new Icon();

        public Display(Context context) {
            super(context);
            vPaint.setStyle(Paint.Style.FILL_AND_STROKE);
            vPaint.setColor(0x0ff000000);
            setBackgroundColor(0xffffffff);
        }

        @Override public void onDraw(Canvas canvas) {
            canvas.scale(200, 200);
            item.onDraw(canvas);
            canvas.drawLine(0.0f, 0.0f, 1.0f, 1.0f, vPaint);
        }
    }

    public class Icon {
        Bitmap myImage;
        Paint mPaint = new Paint();

        public Icon() {
            myImage = Bitmap.createBitmap(50, 50, Bitmap.Config.ARGB_8888);
            mPaint.setStyle(Style.FILL);
            mPaint.setColor(0xffff0000);
            Canvas c = new Canvas(myImage);
            c.scale(50, 50);
            c.drawCircle(0.5f, 0.5f, 0.5f, mPaint);
        }

        public void onDraw(Canvas canvas) {
            canvas.drawBitmap(myImage, 0, 0, null);
        }
    }
}

这段代码应该打印出从左上角到右下角的一条线,并从 0,0 到 50, 50 绘制一个 50px 直径的圆。相反,我得到的只是这条线。但是,如果我将位图打印到文件中,该文件会准确地输出它应该输出的内容。

有没有人知道发生了什么?

编辑
为了澄清我的问题,我正在创建一个比 DisplayView 小得多的位图。当我尝试将位图绘制到 DisplayView 中时,位图根本不是我绘制的,并且从未适当地缩放。为什么画布不能正确绘制位图?

更新
在 Diplay 的 onDraw 方法中,我将行items.onDraw(canvas);移到 before canvas.scale(200, 200);。现在测试圈绘制正确。如此简单的改变是做什么来完全忽略以以前的方式绘制圆圈的?

4

4 回答 4

1

事实证明,我@MartinAsenov 基本上是正确的。我最终需要做的是在我缩放画布并正常绘制之前(或在保存和恢复之后)绘制所有缓存的位图。至于缩放画布,我认为这仍然是必要的(我的所有其他小部件在绘制之前都缩放到它们的宽度和高度,没有问题)。

这是最终的工作测试活动。

public class AndroidTestoActivity extends Activity {
    @Override public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FrameLayout fl = new FrameLayout(this);
        Display tv = new Display(this); 
        tv.setLayoutParams(new LayoutParams(200, 200));
        fl.addView(tv);
        setContentView(fl);
    }

    public class Display extends View {
        Paint vPaint = new Paint();
        Icon item = new Icon();

        public Display(Context context) {
            super(context);
            vPaint.setStyle(Paint.Style.FILL_AND_STROKE);
            vPaint.setColor(0x0ff000000);
            setBackgroundColor(0xffffffff);
        }

        @Override public void onDraw(Canvas canvas) {
            item.onDraw(canvas);
            canvas.save(Canvas.MATRIX_SAVE_FLAG);
            canvas.scale(getWidth(), getHeight());

            canvas.drawLine(0.0f, 0.0f, 1.0f, 1.0f, vPaint);
            canvas.restore();
        }
    }

    public class Icon {
        Bitmap myImage;
        Paint mPaint = new Paint();

        public Icon() {
            myImage = Bitmap.createBitmap(50, 50, Bitmap.Config.ARGB_8888);
            mPaint.setStyle(Style.FILL);
            mPaint.setColor(0xffff0000);
            Canvas c = new Canvas(myImage);
            c.scale(50, 50);
            c.drawCircle(0.5f, 0.5f, 0.5f, mPaint);
        }

        public void onDraw(Canvas canvas) {
            canvas.drawBitmap(myImage, 50, 50, null);
        }
    }
}
于 2012-04-09T16:55:14.423 回答
0

查看您的代码我认为主要问题是您假设坐标为 0f..1f 但事实是 0f..width / 0f..height - float 用于具有子像素

于 2012-04-06T23:20:25.007 回答
0

我最好的猜测是圆变得太大(将其缩放 200 倍),因此其坐标变为负数(即左上角为 (-5,-10))。android系统不会用负坐标绘制视图(如果你想实现这一点,你需要重写onMeasure()方法)

于 2012-04-09T17:51:55.333 回答
0

我认为您对画布的工作方式有些困惑(而且它不直观,因此很容易混淆)。您调用 Canvas 的方式,使用 Bitmap 作为参数,最终将位图视为正在绘制的东西,因此,您受到位图尺寸的限制。如果您要创建一个没有参数的画布(一个空画布),然后在其中绘制一个位图,那么它实际上并没有改变位图,它只是在画布上绘制。在这种情况下,您可以在矩形内的任何位置绘制位图并在其周围绘制一个圆圈(或您想要的任何其他内容)。

此外,您可以覆盖 onDraw 方法并收集 *它的画布(它在调用回调时交给您),然后在该画布上绘制您想要的任何内容......这就是实际显示在屏幕上的画布,这就是访问它的最简单方法。

于 2012-04-09T17:54:47.277 回答