【问题标题】:Android canvas fill background color (Canvas application)Android画布填充背景色(画布应用)
【发布时间】:2013-09-21 16:22:14
【问题描述】:

通过以下代码,我有一些问题。

public class MainActivity extends Activity {

   @Override
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView( new View(this) {
         Paint mPaint = new Paint();

         @Override
         protected void onDraw(Canvas canvas) {
            // TODO Auto-generated method stub
            super.onDraw(canvas);


            int width = this.getWidth();
            int height = this.getHeight();
            int radius = width > height ? height/2 : width/2;
            int center_x = width/2;
            int center_y = height/2;

            // prepare a paint
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setStrokeWidth(5);
            mPaint.setAntiAlias(true);

            // draw a rectangle
            mPaint.setColor(Color.BLUE);
                mPaint.setStyle(Paint.Style.FILL); //fill the background with blue color
            canvas.drawRect(center_x - radius, center_y - radius, center_x + radius, center_y + radius, mPaint);
            // draw some text and rotation
            mPaint.setTextSize(50);
            mPaint.setTextAlign(Paint.Align.CENTER);
            mPaint.setColor(Color.BLACK);
            canvas.drawText( "Hello World" , center_x , center_y, mPaint);
         }
      });
    }
}

Q1:如何在框架中填充蓝色? (字依旧出现)

Q2:这个应用中有多少视图和表面?如何在应用中计算这些?

Q3:这个应用有多少个窗口?

Q4:在代码中,我没有看到任何位图对象。 但是,我认为位图是我真正可以在其上绘制东西的对象。是我的 理解不正确? 一种可能性是 Canvas 构造函数在新建位图时对其进行初始化。

Q5:我知道这些图形的东西最终会浮出水面然后传递给 用于最终合成的surfaceflinger。它在我的代码中的什么位置?

感谢您的回复。

【问题讨论】:

    标签: android android-canvas paint surfaceview


    【解决方案1】:

    五个问题。让我们看看我能在哪里提供帮助。

    Q1:告诉Paint 填充矩形:paint.setStyle(Paint.Style.FILL);

    Q2:我只看到您以编程方式创建的一个视图。为什么要统计观看次数?

    Q3:再次:一个

    Q4:您通过用Canvas 包裹它们来绘制可变位图。实际绘制的方法是Canvas的一部分

    Q5:您展示的代码是活动的一部分。 Activity 由 Android 调用。这是您进入应用程序的入口点。

    【讨论】:

    • Q1: 添加paint.setStyle(Paint.Style.FILL);画完矩形后,效果还是一样的。我是否必须做其他事情才能使其工作(代码已更改) Q2:我认为(1)白色背景是一个视图,而蓝色画布是另一个视图。我计算这个是因为我想更清楚地了解 Android 中的一些术语。 (表面、绘画、位图、视图、窗口……) Q3:可以在一个应用程序中创建多个窗口吗?如果是这样,你能给我一个简单的例子吗?一项活动是否意味着我只能在其中创建一个窗口?
    • Q4:谢谢。现在更干净了。 Q5:所以 Android 对我创建的 Activity 做了这些事情。
    • 感谢您的精彩回复。
    • Q1:我刚刚弄清楚了如何实现这一点。谢谢。
    【解决方案2】:

    感谢您的回答。我完成了为标记答案制作代码的工作,并且它有效。

        Bitmap bg = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bg);
        // paint background with the trick
        Paint rect_paint = new Paint();
        rect_paint.setStyle(Paint.Style.FILL);
        rect_paint.setColor(Color.rgb(0, 0, 0));
        rect_paint.setAlpha(0x80); // optional
        canvas.drawRect(0, 0, width, height, rect_paint); // that's painting the whole canvas in the chosen color.
    

    【讨论】:

    • Puffy,我使用了上面传递的代码并解决了我更改画布颜色的问题,但是如果我已经有一幅画并且我更改了画布的颜色,它最终会重叠我的绘图,如何在不重叠已经完成的绘图的情况下更改颜色?
    【解决方案3】:

    Q2:层次结构查看器在您想计算应用中的查看次数时非常有用。 Optimizing Your UI

    【讨论】:

    • 谢谢。你知道如何计算一个应用程序中有多少个窗口吗?是否可以在一个应用中创建多个窗口?
    • 为什么要创建多个窗口?您正在为平板电脑制作应用程序吗?
    • William,我的目的是了解该窗口在视图系统中的作用。假设我们有用于图形应用层的位图、绘画、表面、画布、视图和窗口。我很清楚其他人只有窗口和视图让我感到困惑。
    • Window 是指设备的屏幕,所以一个应用中只有一个窗口。我见过一个基于android系统的多窗口平板,但实际上不是多窗口而是多视图。
    • 这只是一种观点。白色背景是活动的默认样式。您创建的视图默认是透明的,并填充白色背景。画布填充视图,而不仅仅是蓝色范围。你在画布上画了一个蓝色方块,所以你认为蓝色范围是画布,不是吗? :) 最后你在画布上画了一个文本。只有一个视图,您已经在它的画布上绘制了所有内容。