android - 从 Canvas 上的单个位图绘制多次

标签 android view bitmap draw

基本上我有以下位图: 位图云; cloud = BitmapFactory.decodeResource(getResources(), R.drawable.cloud);

我想做的是在 Canvas 上的不同(随机)位置多次绘制相同的位图(在本例中为云)。我想在我的 View 的 OnDraw 方法中执行此操作。

所以最终的产品应该是这样的: http://puu.sh/1b4fe

不过

这是在同一 Canvas 上多次绘制位图的代码:

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

    // canvas.drawColor(Color.BLUE);
    //drawBackground(canvas);

    //objectMovement(canvas);

    for (int i = 0; i < 500; i += 50) {
        canvas.drawBitmap(cloud, 50 + rand.nextInt(350),
                10 + rand.nextInt(350), null);
    }

    invalidate();
}

如您所见,我使用随机生成位图的位置,每次位图都绘制在 Canvas 上的不同位置。

唯一的问题是,每次调用 invalidate() 时,for 循环中的绘制都会再次发生。因此,看起来图画(云)在整个地方移动得非常快。

找了一段时间,发现了这个问题: Draw multiple times from a single bitmap

这与我的问题几乎相同,但不幸的是,那里没有正确答案。

那么我该如何实现呢?

谢谢!

最佳答案

第一个问题是您每帧读取位图 10 次,这是完全没有必要的。当你实例化你的类时,你应该一次读取位图。我还添加了一个画图。我不知道它是否完全有必要,但万一你决定在你的 draw 方法中做更多事情,它就在那里。

public class MyView extends View
{
    private Bitmap _cloud;
    private Paint _paint;

    public MyView(Context context)
    {
        super(context);
        _cloud = BitmapFactory.decodeResource(getResources(),R.drawable.cloud);
        _paint = new Paint();
    }

    protected void onDraw(Canvas canvas) 
    {
        for(int i = 0; i < 500; i += 50) 
        {
            canvas.drawBitmap(_cloud, 50 + rand.nextInt(350rand.nextInt(350)), 10 + i, _paint);
        }
    }
}

关于android - 从 Canvas 上的单个位图绘制多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12714783/

相关文章:

android - 有没有办法显示 Android Activity 堆栈?

Android:Paging3 使用 cloud-firestore 创建 remotemediator

java - Android ScrollView 滚动超出需要的范围

c# - 将位图保存为 32bpp 不保持透明度

java - 从蓝牙接收到的 Android JAVA 代码中的字符串缓冲区读取数据

javascript - 如何在 Android 上以编程方式退出全屏视频?

android - View 的draw 方法是否可以在Android 的后台线程中运行?

sql-server - SQL Server 2008 R2 和索引 View 中的执行计划

c# - VB.Net 中的不安全

c++ - 从位图图像文件中读取像素数据值