2016-05-13 50 views
2

我想了解如何在Android上动态生成2D图形。我一直没能在网络上找到这样的例子。Android上的动态2D画在画布上

我在下面的例子中随机抽取1000行随机颜色。我希望看到所有线条都被绘制出来,但直到setContentView()调用(此时所有线条已经绘制完成)才看到任何东西。我已经尝试了许多置换,包括将setContentView()移动到draw()调用之前,并在for循环中添加ourView.invalidate(),但在每种情况下屏幕都保持白色,直到所有行绘制。

如果有人能指出这个工作的一个例子,我会很乐意去研究它,并在这里自己添加正确的答案。

package com.example.graphicsdemo; 
+imports 

public class MainActivity extends Activity { 
    ImageView ourView; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     draw(); 
     setContentView(ourView); 
    } 
    public void draw() { 
     Bitmap blankBitmap = Bitmap.createBitmap(600,600,Bitmap.Config.ARGB_8888); 
     Canvas canvas = new Canvas(blankBitmap); 
     ourView = new ImageView(this); 
     ourView.setImageBitmap(blankBitmap); 
     Paint paint = new Paint(); 
     Random random = new Random(); 

     for(int i = 0 ; i < 1000 ; i++) { 
      paint.setColor(Color.argb(255, random.nextInt(255), random.nextInt(255), random.nextInt(255))); 
      canvas.drawLine(random.nextInt(600), random.nextInt(600), random.nextInt(600), random.nextInt(600), paint); 
     } 
    } 
} 

回答

3

我希望这个例子可以帮助: 首先使自己的视图,并让调用它DynamicView:

import java.util.Random; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.util.AttributeSet; 
import android.view.View; 

public class DynamicView extends View { 
    int i = 0; 

    public DynamicView(Context context) { 
     super(context); 


    } 

    @Override 
    protected void onDraw(Canvas canvas) { 

     Paint paint = new Paint(); 
     Random random = new Random(); 
     paint.setColor(Color.argb(255, random.nextInt(255), 
       random.nextInt(255), random.nextInt(255))); 
     canvas.drawLine(random.nextInt(600), random.nextInt(600), 
       random.nextInt(600), random.nextInt(600), paint); 

     if (i < 1000) { 
      i++; 
      invalidate(); 
     } 
    } 

} 

这种观点将无效1000时各画

后,现在这里是您的主要活动onCreate方法:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     DynamicView myView = new DynamicView(this); 
     setContentView(myView); 
    } 

as sim这样做。

在回答你的问题这是一个更好的代码,更复杂,但还是很容易理解 所有我们需要做的是汲取位图的线条,然后画上认为,位图,所以将位图不会改变,将所有以前绘制的线条,仍然借鉴它

现在这里是更新后的代码:

DynamicView

import java.util.Random; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Rect; 
import android.util.AttributeSet; 
import android.view.View; 

public class DynamicView extends View { 
    int i = 0; 
    Bitmap frame ; 
    Canvas frameDrawer; 
    Rect bounds; 
    Paint paint ; 
    Random random ; 
    int width , height; 

    public DynamicView(Context context ,int width ,int height) { 
     super(context); 

     this.width = width; 
     this.height = height; 

     frame = Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888); 
     frameDrawer = new Canvas(frame); 
     bounds = new Rect(0 , 0, width,height); 
     //this initialization will make the frameDrawer draw on the frame bitmap 

     //always avoid allocating new objects in the draw method to optimize the performance 
     paint = new Paint(); 
     random = new Random(); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 


     paint.setColor(Color.argb(255, random.nextInt(255), 
       random.nextInt(255), random.nextInt(255))); 
     //instead of drawing on the view canvas draw on the frame bitmap 
     frameDrawer.drawLine(random.nextInt(width), random.nextInt(height), 
       random.nextInt(width), random.nextInt(height), paint); 
     // and then draw the bitmap on the view canvas 
     canvas.drawBitmap(frame, null, bounds , null); 

     if (i < 1000) { 
      i++; 
      invalidate(); 
     } 
    } 

} 

现在MainActivity中的新事物是,现在我们可以控制视图的绘制边界,但仍然不是视图边界需要所有的屏幕空间(如果要调整视图的边界,只需实现onLayout方法并输入您的值的)

MainActivity

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     DynamicView myView = new DynamicView(this,320,480); 
     setContentView(myView); 
    } 
} 
+0

这是一个很好的答案,居然让我明白的onDraw()/无效()范例。谢谢你。我看到我在我的问题中省略了一些东西 - 我希望将新行添加到视图中,以便显示的是所有绘制的线的聚合。当我运行你的例子时,结果是1000个独立的线条,每个线条都在原始的白色背景上绘制。 – dkimble

+0

非常感谢。它的工作非常漂亮。现在了解更多关于它为什么起作用的信息(即关于位图)。 – dkimble